Гарантування безпеки виконання PHP: експертне налаштування PHP-FPM з NGINX
10:15, 19.08.2026
PHP-FPM — це менеджер процесів, необхідний для обробки веб-запитів. Цей підхід є значно швидшим порівняно з традиційними методами CGI, такими як mod_php або SUPHP. Головною перевагою цього методу є те, що він вимагає менше ресурсів процесора та пам’яті.
Як працює PHP-FPM «за лаштунками»
Щоб краще зрозуміти, як все працює, давайте розглянемо процес «за лаштунками». Ось основні етапи функціонування системи:
- Обробка запиту. Коли сервер отримує запит від PHP-скрипта, він передається через FastCGI до PHP-FPM.
- Управління процесами. Після отримання запиту PHP-FPM вибирає з пулу доступний процес для його обробки. Якщо доступних процесів немає, створюється новий.
- Можна керувати різними типами процесів, такими як головні та робочі процеси. Головний процес необхідний для прийому поточних запитів та розподілу їх між доступними робочими процесами. Робочий процес необхідний для виконання PHP-скриптів. Вони можуть працювати в різних режимах, таких як статичний, динамічний та «на вимогу».
- Виконання. Коли запит надходить до робочого процесу, PHP-скрипт виконується, і на сервер надходить вихідні дані.
- Рециркуляція процесу. Робочі процеси можуть бути перезапущені після певної кількості запитів. Це необхідно для запобігання витокам пам’яті
Вимоги перед налаштуванням PHP-FPM з NGINX
- У вашій системі можна відкрити сеанс SSH з правами користувача sudo або root.
- Встановлення PHP та NGINX у вашій системі. Якщо це ще не зроблено, існують різні докладні інструкції щодо процесу встановлення.
Покрокова інструкція з налаштування PHP-FPM з NGINX
- Встановлення PHP-FPM
- Налаштування пулу PHP-FPM
- Налаштування NGINX для використання PHP-FPM
- Перевірка інтеграції PHP-FPM та NGINX
Крок 1: Встановлення PHP-FPM на сервері
Скрипт PHP не може працювати на Nginx, оскільки для ефективного управління необхідний PHP-FPM. PHP-FPM працює поза межами NGINX, створюючи власний процес. Коли користувач намагається зайти на сторінку PHP, сервер передає цей запит до PHP-FPM.
Процес встановлення на Ubuntu залежить від його версії та версії PHP. Переконавшись, що у вас встановлена найновіша версія PHP, ви можете скористатися такою командою для встановлення FPM:
sudo apt install -y php8.2-fpm
Після виконання наведеної вище команди сервер запуститься автоматично після завершення встановлення. Для перевірки скористайтеся наступною командою:
sudo systemctl status php8.2-fpm
Крок 2: Налаштування пулу PHP-FPM
Пул за замовчуванням знаходиться у папці /etc/php/8.2/fpm/pool.d/, яку можна налаштувати відповідно до ваших потреб. Однак більш поширеним підходом є створення окремих пулів для кращого контролю над кожним процесом FPM. Кожен пул матиме свій головний процес, і для кожного PHP-додатка можна налаштувати власний кеш. Це досить зручний підхід, оскільки пули будуть розділені, і будь-які зміни в одному пулі не впливатимуть на інші.
Тепер давайте створимо пул FPM для запуску додатка під окремим користувачем. Для початку створимо нового користувача:
# Створимо системну групу з назвою wordpress
sudo groupadd --system wordpress
# Створимо системного користувача з іменем wordpress, додамо його до групи wordpress і встановимо, щоб у нього не було оболонки для входу
sudo useradd --system --gid wordpress --shell /usr/sbin/nologin --home-dir /var/www/wordpress wordpress
Наступним кроком є перехід до каталогу конфігурації та створення файлу конфігурації за допомогою текстового редактора:
# cd /etc/php/8.2/fpm/pool.d
# vi wordpress_pool.conf
[wordpress_site]
user = wordpress
group = wordpress
listen = /run/php/php8.2-fpm-wordpress.sock
listen.owner = www-data
listen.group = www-data
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
pm = dynamic
pm.max_children = 75
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 10s
Давайте розглянемо деякі з вищезазначених значень:
- [wordpress_site]: тут слід вказати унікальну назву пулу.
- Користувач/група: вкажіть, під яким обліковим записом працюватиме пул.
- Listen: ім’я файлу сокета.
- Listen.owner/group: має збігатися з користувачем/групою NGINX.
- Admin_value/flag: дозволяє встановлювати власні значення та булеві прапорці.
- pm: при виборі значення «Dynamic» кількість дочірніх процесів визначається на основі наступних директив.
- max_children: максимальна кількість дочірніх процесів, які можуть бути активними одночасно.
- start_servers: кількість дочірніх процесів, що створюються під час запуску.
- max/min_spare_servers: максимальна та мінімальна кількість дочірніх процесів у стані простою.
- idle_timeout: максимальна кількість неактивних серверних процесів.
Також можна вибрати статичні налаштування або налаштування «за запитом». У разі вибору статичного варіанту кількість процесів буде фіксованою, а при налаштуванні «за запитом» дочірні процеси будуть запускатися для нових запитів.
Після завершення роботи з файлом конфігурації перезапустіть службу fpm:
sudo systemctl restart php8.2-fpm
Крок 3: Налаштування NGINX для використання PHP-FPM
Наступним кроком є створення блоку сервера NGINX. Для цього необхідно відредагувати файл конфігурації NGINX і додати шлях до файлу сокета пулу за допомогою fastcgi_pass наступним чином:
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm-wordpress.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
Після цього перезапустіть NGINX:
sudo nginx -t
sudo systemctl reload nginx
Крок 4: Перевірка інтеграції PHP-FPM та NGINX
Щоб перевірити, чи конфігураційний файл дійсно використовує новий пул, потрібно створити файл php.info в кореневому каталозі.
# Перейдіть до каталогу WordPress
cd /var/www/html/wordpress
# Створіть файл PHP info з використанням безпечних лапок
echo '<?php phpinfo(); ?>' | sudo tee info.php > /dev/null
Після створення інформаційної сторінки перевірте значення; якщо вони збігаються з тими, що ви вказали у файлі конфігурації FPM, то все працює як передбачено.
Поширені запитання та усунення несправностей
Що таке PHP-FPM і навіщо поєднувати його з NGINX?
PHP-FPM — це диспетчер процесів, необхідний для управління процесами PHP. У поєднанні з NGINX він може значно покращити безпеку, продуктивність та управління ресурсами.
Як правильно налаштувати взаємодію NGINX з PHP-FPM?
Для цього необхідно налаштувати NGINX на використання PHP-FPM. Це можна зробити, включивши директиву `fastcgi_pass` у файл конфігурації. Це можна зробити наступним чином:
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm-wordpress.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
Коли слід використовувати сокет, а коли — порт у PHP-FPM?
Використання сокетів дає можливість швидшої комунікації, оскільки немає потреби в мережевих накладних витратах. Порт потребує мережевої взаємодії, і такий підхід є значно повільнішим. Проте використання порту доцільне в тих випадках, коли FPM працює на різних контейнерах або серверах.
Що спричиняє помилку 502 Bad Gateway і як її виправити?
Щоб виправити цю помилку, необхідно перевірити, чи працює FPM і чи правильно вказано TCP або сокет у конфігурації NGINX. Перегляньте журнали FPM на наявність проблем і відповідно змініть налаштування пулу. Також перевірте, чи конфігурація NGINX правильно передає запити PHP.
Щоб перевірити журнали, скористайтеся такою командою:
tail -f /var/log/php8.2-fpm.log
Чи можна запускати кілька версій PHP в одній конфігурації NGINX?
Звісно, це можна зробити, налаштувавши окремі пули та вказавши відповідний пул для кожного домену/субдомену. Наприклад, якщо ви використовуєте PHP 7.4 та 7.2, це можливо. Після цього вкажіть відповідний пул для кожного домену.
Де можна знайти налаштування пулу PHP-FPM?
Зазвичай пул розташований у /etc/php/8.2/fpm/pool.d/.
Які найкращі практики для підвищення продуктивності PHP-FPM?
Для кращої продуктивності, можливо, доведеться налаштувати параметри pm.min_spare_servers, pm.max_children та pm.start_servers у конфігурації. Також можна спробувати увімкнути параметри pm.status_path та pm.max_requests.
Підсумки
У цій статті ми на практиці продемонстрували, як налаштувати окремі пули, встановити PHP-FPM, налаштувати блок сервера NGINX та підключитися до служби. Завдяки такому підходу можна забезпечити кращу масштабованість, безпеку та покращити показники продуктивності. Тепер ви знаєте, як найоптимальніше розподіляти ресурси сервера.