Как настроить PHP-FPM для веб-сервера Nginx
LEMP Stack | Комментировать запись
PHP-FPM (FastCGI Process Manager) — это альтернативная реализация FastCGI для PHP с дополнительными функциями, которые полезны для сайтов с высоким трафиком. Это предпочтительный метод обработки PHP-страниц с помощью NGINX, который работает быстрее, чем традиционные методы CGI (SUPHP или mod_php для запуска PHP-скрипта). Основное преимущество PHP-FPM заключается в том, что он использует значительно меньше памяти и CPU по сравнению с любыми другими методами запуска PHP. Основная причина такого поведения — он демонизирует PHP, тем самым превращая его в фоновый процесс и предоставляя скрипт CLI для управления PHP-запросами.
Требования
- Вы можете открыть SSH-сессию в системе Ubuntu от имени пользователя root или sudo.
- В системе должны быть установлены NGINX и PHP.
Этапы настройки PHP-FPM с NGINX
- Установка PHP-FPM
- Конфигурация пула PHP-FPM
- Настройка NGINX для работы с PHP-FPM
- Тест конфигурации NGINX и PHP-FPM
1: Установка PHP-FPM
Nginx не знает, как запустить свой PHP-скрипт. Для эффективного управления этими скриптами ему нужен PHP-модуль (например PHP-FPM). PHP-FPM работает вне среды NGINX, создавая отдельный процесс. Поэтому, когда пользователь запрашивает страницу PHP, сервер nginx передает запрос службе PHP-FPM с помощью FastCGI. Установка php-fpm в Ubuntu зависит от PHP и его версии. Перед установкой FPM на ваш сервер следует проверить документацию установленной версии PHP. Предположим, что вы установили последнюю версию PHP 7.3, значит вы можете установить FPM с помощью следующей команды apt-get:
# apt-get install php7.3-fpm
Сервис FPM запустится автоматически после завершения установки. Чтобы проверить его статус, выполните следующую команду systemd:
# systemctl status php7.3-fpm
php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2019-02-17 06:29:31 UTC; 30s ago Docs: man:php-fpm7.3(8) Main PID: 32210 (php-fpm7.3) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1152) CGroup: /system.slice/php7.3-fpm.service ├─32210 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf) ├─32235 php-fpm: pool www └─32236 php-fpm: pool www
2: Настройка пула PHP-FPM
Сервис php-fpm создает пул по умолчанию, конфигурация которого (www.conf) находится в папке /etc/php/7.3/fpm/pool.d. Вы можете настроить пул по умолчанию в соответствии с вашими требованиями. Также рекомендуется создавать индивидуальные пулы для более эффективного управления ресурсами каждого процесса FPM. Кроме того, отделение пулов FPM позволит им работать независимо друг от друга, создавая собственный мастер-процесс. Это означает, что каждое php-приложение может иметь свои параметры кэша. Изменение конфигурации одного пула не требует запуска или остановки остальных пулов FPM.
Давайте создадим пул FPM для эффективного запуска PHP-приложения отдельным пользователем. Для начала создайте нового пользователя, который будет иметь исключительные права на этот пул:
# groupadd wordpress_user
# useradd -g wordpress_user wordpress_user
Теперь перейдите в каталог конфигурации FPM и создайте файл настроек с помощью любого текстового редактора, например vi:
# cd /etc/php/7.3/fpm/pool.d
# vi wordpress_pool.conf
[wordpress_site] user = wordpress_user group = wordpress_user listen = /var/run/php7.2-fpm-wordpress-site.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 ; Choose how the process manager will control the number of child processes. 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
Рассмотрим подробнее приведенные выше параметры конфигурации FPM и их значения:
- [wordpress_site]: название, которое должно быть уникальным для каждого пула.
- user и group: пользователь и группа, под которыми будет работать пул.
- listen: название файла сокета для этого пула.
- listen.owner и listen.group: должны соответствовать пользователю и группе, на которых работает NGINX. В нашем случае это www-data.
- php_admin_value: позволяет устанавливать пользовательские значения конфигурации php.
- php_admin_flag: позволяет устанавливать логические флаги PHP.
- pm: параметры менеджера процессов. Значение Dynamic означает, что количество дочерних процессов устанавливается динамически на основе следующих директив:
- pm.max_children: максимальное количество дочерних процессов, которые могут быть одновременно активны.
- pm.start_servers: количество дочерних процессов, создаваемых при запуске.
- pm.min_spare_servers: минимальное количество дочерних процессов в состоянии ожидания (ожидающих обработки). Если количество простаивающих процессов меньше этого числа, то будет создано несколько дочерних.
- pm.max_spare_servers: максимальное количество дочерних процессов в состоянии ожидания (ожидающих обработки). Если количество простаивающих процессов больше этого числа, некоторые дочерние будут завершены.
- pm.process_idle_timeout: желаемое максимальное количество простаивающих процессов сервера. Используется только при установке значения pm в “dynamic”. Кроме вышеуказанных параметров, также можно передавать несколько системных переменных в сервис php-fpm, с помощью env[‘PHP_FOO’] = $bar. Например, добавление следующих опций в приведенный выше файл конфигурации установит имя хоста и расположение временной папки в среде PHP.
... ... env[HOSTNAME] = $HOSTNAME env[TMP] = /tmp ... ...
Настройки менеджеров процессов в приведенном выше файле конфигурации пула установлены как “dynamic”. Выберите параметр, который лучше всего соответствует вашим требованиям. Существуют также и другие конфигурации для менеджера процессов:
- Static: будет поддерживаться фиксированное количество процессов PHP.
- ondemand: дочерние процессы при запуске не создаются. Они будут создаваться при получении новых запросов на сервере.
После создания файла конфигурации необходимо перезапустить сервис fpm, чтобы применить новые настройки:
# systemctl start php7.3-fpm
После этого будет создан пул FPM для обслуживания php-страниц. Обратите внимание, что вы можете создать отдельный сервис systemd для данного пула, указав вышеупомянутый файл конфигурации FPM. Это позволит вам запускать/останавливать этот пул, не влияя на другие пулы.
3: Настройка NGINX для PHP-FPM
Теперь создайте server block NGINX, который будет использовать указанный выше пул FPM. Для этого отредактируйте файл конфигурации NGINX и укажите путь к файлу пула с помощью опции fastcgi_pass внутри location block для php.
server { listen 80; server_name example.journaldev.com; root /var/www/html/wordpress; access_log /var/log/nginx/example.journaldev.com-access.log; error_log /var/log/nginx/example.journaldev.com-error.log error; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php7.2-fpm-wordpress-site.sock; fastcgi_index index.php; include fastcgi.conf; } }
Убедитесь, что приведенные выше параметры конфигурации синтаксически верны, и перезапустите NGINX.
# nginx-t
# systemctl restart nginx
4: Тестирование конфигурации PHP-FPM NGINX
Для проверки того, использует ли вышеуказанный файл конфигурации NGINX только что созданный пул FPM, создайте файл phpinfo в root каталоге веб-сервера. Мы используем /var/www/html/wordpress в качестве веб-сервера в приведенном выше файле конфигурации NGINX. Измените это значение в соответствии с вашей средой.
# cd /var/www/html/wordpress
# echo "<?php echo phpinfo();?>" > info.php
После создания страницы с информацией о PHP, откройте ее в любом браузере. Вы заметите, что значения переменных $_SERVER[‘USER’] и $_SERVER[‘HOME’] указывают на wordpress_user и /home/wordpress_user соответственно — их мы ранее установили в файле конфигурации FPM, это подтверждает, что NGINX обслуживает php-страницы с помощью выбранного пула FPM.
Подводим итоги
В этой статье мы рассмотрели установку php-fpm и настройку отдельных пулов для разных пользователей и приложений. Вы также узнали, как настроить NGINX server block для подключения к сервису PHP-FPM. PHP-FPM обеспечивает надежность, безопасность, масштабируемость и скорость, а также предлагает множество опций настройки производительности. Теперь вы можете разбить стандартный пул PHP-FPM на несколько пулов для обслуживания разных приложений. Это не только повысит безопасность вашего сервера, но и позволит вам оптимально распределять ресурсы.
Читайте также:
- Настройка Apache с помощью MPM Event и PHP-FPM
- Запуск нескольких версий PHP на одном сервере с помощью Apache и PHP-FPM в Ubuntu 20.04