Налаштування PHP-FPM у Linux
Мануали
11 Oct 2016

У минулій статті ми розглянули установку та найпростіше налаштування сервера nginx у зв'язці з php-fpm менеджером. Давайте тепер торкнемося налаштувань докладніше.

Ми не будемо стосуватись налаштування базових параметрів самого сервера nginx та перевірки його працездатності, ми це зробили у попередній статті. Але деякі параметри необхідно розглянути.

Визначимо та вкажемо кількість обробників та кількість з'єднань на один обробник. Для цього у файлі /etc/nginx/nginx.conf вкажемо значення

worker_processes 1;
worker_connections 1024;

Основна ідея у виборі даних значень полягає в тому, що кількість клієнтів, що обслуговуються, дорівнює кількості обробників, помноженій на кількість з'єднань для кожного обробника. Таким чином у нашому випадку – це 1024 клієнти. Щоб уникнути проблем з операціями введення-виводу, керуйтеся правилом 1 обробник на одне ядро ​​процесора. Визначити кількість ядер можна командою:

cat /proc/cpuinfo | grep processor
processor : 0

У мого процесора одне ядро. Тому кількість обробників дорівнює одному. Кількість з'єднань можна додавати залежно від потреби. Цей параметр підбирається вже на практиці.

З метою безпеки можна активувати директиву

server_tokens off

З мануал: «Дозволяє або забороняє видавати версію nginx'а в повідомленнях про помилки та в полі “Server” заголовка відповіді.»

Ця директива додається до секції http/server/local конфігураційного файлу.

Вкажемо розмір даних, що передаються сервером:

client_max_body_size 20m;
client_body_buffer_size 128k;

Ця директива додається до секції http/server/local конфігураційного файлу.

Налаштуємо кеш для статичних файлів. Це необхідно для збереження ресурсів та пропускної спроможності сервера. Виключимо логування та встановимо термін закінчення заголовків рівний 100 днів для статичних файлів.

location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires 360d;
}

Для взаємодії з PHP-FPM можна вказати unix-сокет. Для цього в конфігураційному фалі необхідно прописати:

# Pass PHP scripts to PHP-FPM
location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1: 9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

Забігаючи вперед, скажу, що в налаштуваннях PHP-FPM потрібно вказати слухати IP і порт, задані в нашій конфігурації. Робиться це директивою listen файлу конфігурації пулу.

Для безпеки можна заборонити доступ до прихованих файлів.

location ~ /\. {
access_log off;
log_not_found off;
deny all;
}

Налаштування PHP-FPM можна розбити на 2 етапи: налаштування глобальних параметрів, що здійснюється у файлі

/etc/php5/fpm/php-fpm.conf

і налаштування пулів. Конфігурація пулів задається у файлах каталогу

/etc/php5/fpm/pool.d/

Глобальні параметри не такі цікаві і про них можна почитати в документації, а ось основні параметри налаштування пулів ми розглянемо.

Конфігурація кожного пулу визначається окремим файлом. Якщо зробити команду

ls -l /etc/php5/fpm/pool.d/

то ми побачимо, що в системі вже є файл конфігурації для пулу www. Розглянемо налаштування на прикладі.

Важливим моментом у налаштуванні є вибір кількості обробників, які використовуються для виконання php-скриптів. Їхню кількість треба вибирати з розумом. Занадто мало обробників не дозволить ефективно та оперативно обробляти запити, але водночас надто велика кількість призведе до вичерпання ресурсів, які потрібні серверу для інших завдань. Кількість обробників треба вибирати з міркувань, що навіть у піковому навантаженні запитів на сервер, утилізація його ресурсів повинна залишатися в межах розумного та не призводити до його навантаження.

Тепер давайте трохи звернемося до файлу конфігурації та вкажемо наступні параметри. Ах так, у файлі конфігурації рядки, що починаються з символу «;» є коментарями і не розглядаються як директиви.

Вкажемо динамічний режим створення процесів, тим самим кількість запущених процесів PHP-FPM прямо залежатиме від навантаження на сервер.

pm = dynamic

Задамо максимальну кількість дочірніх процесів.

pm.max_children = 6

Далі необхідно задати кількість дочірніх процесів, які будуть запущені відразу після завантаження сервера. За замовчуванням це значення дорівнює 2. Його можна збільшити, якщо ресурси дозволяють, давайте поставимо його 3.

pm.start_servers = 3

Також треба задати мінімальне та максимальне число простоюючі процеси. Зробимо мінімальну кількість рівним числу процесів, запущених із завантаження сервера. А максимальну кількість поставимо, виходячи з міркувань, що вона не повинна перевищувати максимально допустиму кількість дочірніх процесів.

pm.min_spare_servers = 3
pm.max_spare_servers = 5

Ці значення наведено для прикладу та пояснення. Але в кожній конкретній ситуації вони можуть різнитися. Оптимальні значення залежать від можливостей та доступних ресурсів сервера, кількості і складності php-коду, кількості запитів і навантаження на сервер. Ці параметри можна отримати лише при практичному застосуванні та тестуванні створюваного сайту.

Тепер розглянемо специфічні налаштування.

Для початку настроїмо логування інформації про скрипти, які виконуються повільно. Ця інформація буде корисною для з'ясування причин затримок під час роботи сайту. Для початку поставимо тимчасовий поріг, після якого виконання скрипта буде вважатися повільним.

request_slowlog_timeout = 10s

Одиниці часу можна вказати в секундах (s), хвилинах (m), годинниках (h) або днях (d). Ми вказали 10 секунд.

Тепер вкажемо ім'я файлу, куди надсилатиметься інформація.

slowlog = /var/log/slowphp.log

Тепер цей файл можна буде вивчати щодо дослідження «повільних» скриптів.

У разі необхідності виконання скриптів в ізольованому оточенні або оточенні chroot. Зазвичай ця можливість застосовується з метою безпеки. Щоб активувати дані можливості, необхідно встановити параметр chroot.

chroot = /var/www

Встановлюючи цей параметр слід пам'ятати, що це спричинить зміни в процесі обробки скриптів php.

Усі шляхи до файлів тепер будуть розглядатися щодо заданої директорії, а також php-скрипти не зможуть звертатися до сокетів, розташованих за межами заданого каталогу.

Для обслуговування кількох сайтів може знадобитися додавання додаткових пулів. Це дозволить налаштовувати різні параметри для кожного сайту окремо. Для створення додаткового пулу скопіюємо наш файл

/etc/php5/fpm/pool.d/www.conf

під новим ім'ям, наприклад 

/etc/php5/fpm/pool.d/www2.conf

Відкриємо новий файл та змінимо ім'я пула. Для цього у верхній частині файлу змінимо рядок [www] на [www2].

І змінюємо рядок:

listen = /var/run/php5-fpm.sock

на

listen = /var/run/www2.sock

У випадку, якщо ми хочемо, щоб обробник слухав на парі ip:port, директива listen буде виглядати як

listen = 127.0.0.1:9000

Далі перезапустимо сервіс

/etc/init.d/php5-fpm restart