- Как настроить PHP-FPM для веб-сервера Nginx
- Требования
- Этапы настройки PHP-FPM с NGINX
- 1: Установка PHP-FPM
- 2: Настройка пула PHP-FPM
- 3: Настройка NGINX для PHP-FPM
- 4: Тестирование конфигурации PHP-FPM NGINX
- Подводим итоги
- How to set up separate PHP-FPM pools in NGINX
- Part 1 – Set up a new PHP-FPM pool
- Part 2 – Update NGINX virtual host configuration
- Part 3 – Restart PHP-FPM and NGINX
- Categories
Как настроить 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:
Сервис 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, чтобы применить новые настройки:
После этого будет создан пул 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 nginx4: Тестирование конфигурации PHP-FPM NGINX
Для проверки того, использует ли вышеуказанный файл конфигурации NGINX только что созданный пул FPM, создайте файл phpinfo в root каталоге веб-сервера. Мы используем /var/www/html/wordpress в качестве веб-сервера в приведенном выше файле конфигурации NGINX. Измените это значение в соответствии с вашей средой.
После создания страницы с информацией о 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 на несколько пулов для обслуживания разных приложений. Это не только повысит безопасность вашего сервера, но и позволит вам оптимально распределять ресурсы.
Читайте также:
How to set up separate PHP-FPM pools in NGINX
The information in this post is based on NGINX 1.4.6 and PHP-FPM 5.5.9 running on Ubuntu Server 14.04 x64. It may or may not be valid for other versions.
There are a number of advantages to setting up multiple PHP-FPM child process pools rather than running everything in the same pool. Security, separation/isolation and resource management springs to mind as a few major ones.
Regardless of what your motivation is, this post will help you do it 🙂
Part 1 – Set up a new PHP-FPM pool
First, you need to locate the directory where PHP-FPM stores its pool configurations. On Ubuntu 14.04, this is /etc/php5/fpm/pool.d by default. There is probably already a file there called www.conf, which holds the configuration for the default pool. If you haven’t looked at that file before chances are you should go through it and tweak the settings in it for your setup as the defaults are for a fairly underpowered server, but for now just make a copy of it so we don’t have to start from scratch:
sudo cp www.conf mypool.conf
Of course, replace “mypool” with whatever you want your pool to be called.
Now open up the new file using nano or whichever text editor you prefer and adjust it to fit your purpose. You will probably want to tweak the child process numbers and possibly which user and group the pool runs under, but the two settings that you absolutely must change are the pool’s name and the socket it’s listening to, otherwise it will conflict with the existing pool and things will stop working.
The name of the pool is near the top of the file, enclosed in square brackets. By default it’s [www]. Change this to whatever you want; I suggest the same as you named the configuration file, so for the sake of this example change it to [mypool]. If you don’t change it, it seems that PHP-FPM will only load the first configuration file with that name, which is likely to break things.
You then need to change the socket or address you are listening to, which is defined by the listen directive. By default, PHP-FPM uses Unix sockets so your listen directive will probably look like this:
listen = /var/run/php5-fpm.sock
You can change it to whatever valid name you want, but again, I suggest sticking with something similar to the configuration filename, so you could for example set it to:
listen = /var/run/php5-fpm-mypool.sock
Alrightythen, save the file and exit the text editor.
Part 2 – Update NGINX virtual host configuration
Now you need to open up the NGINX virtual host file with the FastCGI configuration you want to change to a new pool – or rather, connect to the new socket.
By default on Ubuntu 14.04, these are stored under /etc/nginx/sites-available, but can also be defined elsewhere. You probably best know where your virtual host configurations are located 😉
Open up the relevant configuration file in your favorite text editor and look for the fastcgi_pass directive (which must be in a location context) defining the PHP-FPM socket. You must change this value so that it matches the new PHP-FPM pool configuration you made under step one, so continuing our example you would change this to:
fastcgi_pass unix:/var/run/php5-fpm-mypool.sock;
Then save and close that file as well. You’re almost done now.
Part 3 – Restart PHP-FPM and NGINX
To apply the configuration changes you’ve made, restart both PHP-FPM and NGINX. It may be enough to reload instead of restart, but I find it to be a bit hit and miss, depending on which settings are changed. In the particular case, I wanted the old PHP-FPM child processes to die right away, so restarting PHP-FPM was needed, but for NGINX a reload may be sufficient. Try it out for yourself.
sudo service php5-fpm restart sudo service nginx restart
And voila, you’re done. If you did everything correctly, the virtual host you modified should now be using the new PHP-FPM pool and not share child processes with any other virtual hosts.
Categories
We may use cookies for advertising and analytics purposes. By continuing to use miklix.com, you implicitly consent to this.
If you are concerned about this, consider disabling cookies in your browser or read the Privacy Policy for more information. OkPrivacy Policy