Как настроить PHP-FPM для веб-сервера Nginx

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 на несколько пулов для обслуживания разных приложений. Это не только повысит безопасность вашего сервера, но и позволит вам оптимально распределять ресурсы. 

Читайте также: 

Tags: ,

Добавить комментарий