Nginx+PHP-FPM на CentOS. Або позбуваємося Apache. | NLight DC++
Nginx+PHP-FPM на CentOS. Або позбуваємося Apache. | NLight DC++

Nginx+PHP-FPM на CentOS. Або позбуваємося Apache.

Я спостерігав регулярні зависання “в хлам” свого серверу що працює на Xen VDS під управлінням CentOS 5.7 з 385 оперативки. Як виявилося, причиною цього був Apache, який без всіляких причин в будь-який час міг просто з’їдати всі ресурси серверу, та ще й так, що не можна було перезавантажити сервер власноруч окрім як просити напряму підтримку хостингу. Вирішити цю проблему з Apache мені так і не вдалося, так як в логах нічого не було, а відвідуваність сайту просто смішна. Тому, або це якийсь скрипт вішає Apache, або ж інша причина про яку я навіть не можу здогадатись, оскільки оперативка в штатному режимі використовувалася на ~40% і сайт працював нормально до моменту його чергового несподіваного ступору.

Тому я вирішив обрати кардинальний метод вирішення проблеми – позбутися Apache та встановити NGINX+PHP-FPM, що не тільки вирішить проблему з Apache, але й відчутно знизить витрати ресурсів. Дивно, але в Google я не зміг знайти повністю робочу версію інструкції по встановленню і налаштуванню цієї зв’язки під мої потреби. Довелося збирати все докупи власноруч, ніби пазл.

Потрібно було встановити наступне: Nginx + Php-fpm (з Spawn-Fcgi в мене нічого не вийшло, процес відвалювався відразу після запуску) + Mysql для WordPress + Vanilla Forum + Gallery 3, phpMyAdmin.

1. Php-fpm відсутній в офіційному репозиторії CentOS, тому потрібно його взяти з Remi RPM, що відноситься до EPEL. Необхідно підлючити і той і інший. Якщо у вас все це вже підключено, можна пропустити цей крок.

Для CentOS 5.x:

  • rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
  • rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm

Для CentOS 6.0 (не було протестовано мною):

  • rpm –import https://fedoraproject.org/static/0608B895.txt
  • rpm -ivh http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm
  • rpm –import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
  • rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

2. Встановлення.

Встановлення MySQL, PHP, наприклад, я мігрую з Apache, тому цей крок мені не потрібен:

  • yum install mysql mysql-server
  • yum install php php-devel php-fpm php-mssql php-mcrypt php-mysql php-gd php-mbstring php-curl php-xml

Налаштування php.ini та my.cnf, якщо це чисте встановлення, можна знайти в інтернеті, я описувати не буду.

Встановлення та налаштування NGINX, PHP-FPM.

  • yum install nginx php-fpm

А тепер саме цікаве й найскладніше, це правильне налаштування:

Відкриваємо зручним текстовим редактором файл /etc/nginx/nginx.conf Саме тут і починається та мозаїка про яку я казав раніше. Можливо моя конфігурація далеко не ідеальна, але це найкращий робочий варіант який я міг скласти за період нишпорення по інтернету. А можливо вам знадобляться откремі частини.

nginx.conf

user nginx;
#worker_processes 2; # Можна розкоментувати, 1 воркер = 1 ядру процесора.
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
#log_format main ‘$remote_addr – $remote_user [$time_local] $request ‘
# ‘”$status” $body_bytes_sent “$http_referer” ‘
# ‘”$http_user_agent” “$http_x_forwarded_for”‘;
access_log off; # Вимикаємо лог звернень до сайту. При великому навантаженні його краще вимкнути.
#access_log /var/log/nginx/access.log main;
sendfile on;
server {
listen 80;
server_name nlight.org.ua www.nlight.org.ua; # Задаємо домен сайту
root /var/www/html; # Точний шлях до кореневої папки з сайтом
error_page 404 /404.html; # Це приклад задання власної сторінки з помилкою 404 Not Found, можна встановити й інші.
location /404.html { root /var/www/error; } # Вказуємо де знаходиться папка зі сторінками помилок.
# Я також створив ярлик ln -s /var/www/error /var/www/html так як не вантажилась графіка тієї сторінки.
####Головна
location / {
index index.php;
rewrite ^/forum$ /index.php?page_id=45597$1;
rewrite ^/gallery$ /gallery/index.php$1;
}
location ~* \.(ico|css|js|gif|jpe?g|png)$ {
expires max;
add_header Pragma public;
add_header Cache-Control “public, must-revalidate, proxy-revalidate”;
}
#### Для форуму (Vanilla Forum)
# Мій форум знаходиться у /var/www/html/discuss
location /discuss {
index index.php;
try_files $uri $uri/ @forum;
}
location @forum {
rewrite ^/discuss(.+)$ /discuss/index.php?p=$1 last;
}
#### Для галереї (Gallery 3)
# Моя галерея знаходиться у /var/www/html/gallery
location /gallery {
index index.php;
fastcgi_pass 127.0.0.1:8500; # У зв’язку з тим що в мене виникли пролеми з UNIX Socket, а саме не відображались великі зображення я його не використовую, та й кажуть що від нього є й інші проблеми. Для його використання введіть напр. unix:/tmp/fcgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_intercept_errors on;
include fastcgi_params;
}
# Якщо необхідно заборонити або дозволити доступ до чогось (приклад):
#location ~ /(gallery/var/uploads|gallery/var/tmp) {
# deny all;
#}
#### Для phpMyAdmin
# За замовчуванням він встановлюється у /usr/share/phpMyAdmin
location /phpmyadmin/ {
alias /usr/share/phpMyAdmin/;
index index.php;
}
#### Загальне
location ~ \.php$ {
#fastcgi_param HTTPS on; # Розкоментуйте для підтримки захищених з’єднань (не протестовано)
fastcgi_pass 127.0.0.1:8500; # Через TCP/IP
#fastcgi_pass unix:/tmp/fcgi.sock; # Через UNIX Socket
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}

Відкриваємо текстовим редактором файл /etc/php-fpm.conf

<configuration>
<section name=”global_options”>
<value name=”pid_file”>/var/run/php-fpm.pid</value>
<value name=”error_log”>/var/log/php-fpm.log</value>
<value name=”log_level”>notice</value>
<value name=”emergency_restart_threshold”>10</value>
<value name=”emergency_restart_interval”>1m</value>
<value name=”process_control_timeout”>5s</value>
<value name=”daemonize”>yes</value>
</section>
<workers>
<section name=”pool”>
<value name=”name”>default</value>
<value name=”listen_address”>127.0.0.1:8500</value> # Встановлюємо TCP/IP адресу або unix Socket відповідно до NginX.
<value name=”listen_options”>
<value name=”owner”></value>
<value name=”group”></value>
<value name=”mode”>0666</value>
</value>
<value name=”php_defines”>
</value>
<value name=”user”>nginx</value>
<value name=”group”>nginx</value>
<value name=”pm”>
<value name=”style”>static</value>
<value name=”max_children”>8</value> # Тут я не впевнений, але для мало навантажених серверів близько 10.
<value name=”apache_like”>
<value name=”StartServers”>8</value>
<value name=”MinSpareServers”>8</value>
<value name=”MaxSpareServers”>15</value>
</value>
</value>
<value name=”request_terminate_timeout”>30s</value> # Боремося з 504 Gateway Time-Out. Встановіть таке ж як в php.ini
<value name=”request_slowlog_timeout”>30s</value> # Виявляємо скрипти що сповільнюють роботу.
<value name=”slowlog”>/var/log/php-fpm-slow.log</value> # Логуємо їх.
<value name=”rlimit_files”>1024</value>
<value name=”rlimit_core”>0</value>
<value name=”chroot”></value>
<value name=”chdir”></value>
<value name=”catch_workers_output”>yes</value>
<value name=”max_requests”>500</value>
<value name=”allowed_clients”>127.0.0.1</value>
<value name=”environment”>
<value name=”HOSTNAME”>$HOSTNAME</value>
<value name=”PATH”>/usr/local/bin:/usr/bin:/bin</value>
<value name=”TMP”>/tmp</value>
<value name=”TMPDIR”>/tmp</value>
<value name=”TEMP”>/tmp</value>
<value name=”OSTYPE”>$OSTYPE</value>
<value name=”MACHTYPE”>$MACHTYPE</value>
<value name=”MALLOC_CHECK_”>2</value>
</value>
</section>
</workers>
</configuration>

ПРИМІТКА: Розповсюджена проблема у зв’язці NginX+PHP-FPM це помилки 504 Gateway Time-Out при обробці великих скриптів чи запитів. І мене це дуже нервувало, адже я тікав від цього у Apache, різниця була ттільки в тому що без Apache в мене не вис весь сервер . Ось як я вирішив остаточно цю проблему – вимкніть “Enable the PHP scripting language engine under Apache.” в php.ini.

“Enable the PHP scripting language engine under Apache.” engine = Off

3. Запуск.

  • servise mysqld start
  • service php-fpm start
  • service nginx start

Коментарі закриті.