Поиск по сайту:

Как настроить PHP-FPM с NGINX


PHP-FPM (FastCGI Process Manager) — это альтернатива реализации PHP FastCGI с некоторыми дополнительными функциями, полезными для сайтов с высоким трафиком. Это предпочтительный метод обработки PHP-страниц с помощью NGINX, и он быстрее, чем традиционные методы на основе CGI, такие как SUPHP или mod_php для запуска PHP-скрипта. Основное преимущество использования PHP-FPM заключается в том, что он использует значительно меньше памяти и ЦП по сравнению с любыми другими методами запуска PHP. Основная причина заключается в том, что он демонизирует PHP, тем самым превращая его в фоновый процесс и предоставляя сценарий CLI для управления PHP-запросами.

Предварительные требования для настройки PHP-FPM NGINX

  • Вы можете открыть сеанс SSH в своей системе Ubuntu 18.04, используя root или пользователя с включенным sudo.
  • Вы уже установили NGINX и PHP в своей системе Ubuntu 18.04.

Этапы настройки NGINX PHP-FPM

  • Установите PHP-FPM
  • Настроить пул PHP-FPM
  • Настройка NGINX для PHP-FPM
  • Тест конфигурации NGINX PHP-FPM

1. Установите PHP-FPM

Nginx не умеет запускать собственный PHP-скрипт. Ему нужен модуль PHP, такой как PHP-FPM, для эффективного управления сценариями PHP. С другой стороны, PHP-FPM работает вне среды NGINX, создавая собственный процесс. Поэтому, когда пользователь запрашивает страницу PHP, сервер nginx передает запрос службе PHP-FPM, используя FastCGI. Установка php-fpm в Ubuntu 18.04 зависит от PHP и его версии. Ознакомьтесь с документацией по установленному PHP, прежде чем приступить к установке FPM на свой сервер. Предполагая, что вы уже установили последнюю версию 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-приложение может быть настроено с собственными настройками кеша с помощью PHP-FPM. Изменение конфигурации одного пула не требует запуска или остановки остальных пулов 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]: имя пула, которое должно быть уникальным для всех имен пулов.
  • пользователь и группа: пользователь и группа, под которыми будет работать пул.
  • listen: имя файла сокета для этого пула.
  • listen.owner и listen.group: должны соответствовать пользователю и группе, в которой работает NGINX. В нашем случае это www-данные.
  • 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 установлено как динамическое. Помимо указанных выше настроек, также можно передать несколько системных переменных окружения в службу php-fpm, используя что-то вроде env[PHP_FOO]=$bar. Например, добавление следующих параметров в приведенный выше файл конфигурации задаст имя хоста и расположение временной папки в среде PHP.

...
...
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
...
...

Кроме того, параметры диспетчеров процессов в указанном выше файле конфигурации пула установлены как динамические. Выберите параметр, который лучше всего соответствует вашим требованиям. Другие параметры конфигурации для диспетчера процессов: Статический: будет поддерживаться фиксированное количество процессов PHP.

  • ondemand: при запуске не создаются дочерние элементы. Дочерние элементы будут разветвлены при получении сервером новых запросов.

После того, как вы закончите создание вышеуказанного файла конфигурации, перезапустите службу fpm, чтобы применить новые настройки:

# systemctl start php7.3-fpm

Пул FPM будет создан немедленно для обслуживания php-страниц. Помните, что вы можете создать отдельную службу systemd, указав указанный выше файл конфигурации FPM, что позволит вам запускать/останавливать этот пул, не затрагивая другие пулы.

3. Настройте NGINX для PHP-FPM

Теперь создайте серверный блок NGINX, который будет использовать указанный выше пул FPM. Для этого отредактируйте файл конфигурации NGINX и передайте путь к файлу сокета пула, используя параметр fastcgi_pass внутри блока местоположения для 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, создайте информационный файл php в корневом каталоге веб-сайта. Я использовал /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 для подключения к службе PHP-FPM. PHP-FPM обеспечивает надежность, безопасность, масштабируемость и скорость, а также множество параметров настройки производительности. Теперь вы можете разделить пул PHP-FPM по умолчанию на несколько пулов ресурсов для обслуживания разных приложений. Это не только повысит безопасность вашего сервера, но и позволит вам оптимально распределять ресурсы сервера!