Налаштування PHP-FPM у Linux
Мануали
02 May 2022

Минулої статті ми розглянули установку та просте налаштування сервера 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