PHP-FPM создаёт и управляет отдельными «пулами» (pool) процессов, которые также называют»воркерами» (workers), и именно они получают и обрабатывают файлы PHP из директории сайта.
Для PHP-FPM можно настроить отдельный пул для каждого отдельного сайта, процессы которого будут запускаться и работать под определённым пользователем. Этакий аналог suEXEC для Apache HTTP, но намного проще (а следовательно — будет потрачено меньше времени в случае возникновения проблем).
После очередных танцев с бубном вокруг Apache HTTP + suEXEC + FastCGI настройка NGINX и пулов для PHP-FPM — просто сказка.
И так, допустим у нас есть установленный NGINX + PHP-FPM, и настроен сайт:
server {
server_name testing.domain.org.ua;
access_log /var/log/nginx/testing.domain.org.ua-access.log;
error_log /var/log/nginx/testing.domain.org.ua-error.log;
root /var/www/vhosts/testing.domain.org.ua;
location / {
index index.html index.htm index.php;
auth_basic_user_file /var/www/vhosts/.htpasswd;
auth_basic "Password-protected Area";
}
location ~ .php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/testing.domain.org.ua$fastcgi_script_name;
}
}
А в каталоге /var/www/vhosts/testing.domain.org.ua есть файл index.php с кодом:
<?php echo phpinfo(); ?>
Теперь — нам необходимо настроить для PHP-FPM новый пул.
Настройки пулов в CentOS хранятся в директории /etc/php-fpm.d/ (для Debian/Ubuntu — /etc/php5/fpm/pool.d/), и там уже есть файл настроек по-умолчанию — www.conf.
Настройки самого PHP-FPM хранятся в файле /etc/php-fpm.conf.
Копируем его с новый именем (для удобства — по имени хоста):
# cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/testing.domain.org.ua.conf
Открываем и находим:
; Start a new pool named 'www'. [www]
имя пула (для каждого должно быть уникальным);
; Note: This value is mandatory. listen = 127.0.0.1:9000
пока не меняем, но обращаем на него внимание — на этот адрес будут перенаправляться запросы к php-файлам;
; RPM: apache Choosed to be able to access some dir as httpd user = apache ; RPM: Keep a group allowed to write in log dir. group = apache
пользователь и группа, от имени которого будут выполняться файлы;
listen — тут можно использовать либо порт(по отдельному порту на каждый пул, 9000 занят пулом www), либо — unix-сокет, мы используем порт;
user и group — устанавливаем владельца файлов php;
Получаем такой конфиг:
[testing.domain.org.ua] listen = 127.0.0.1:9001 user = setevoy group = setevoy
Это минимальные изменения, позже мы ещё вернёмся к этому файлу.
Сохраняем, выходим, перезапускаем PHP-FPM:
# service php-fpm restart Stopping php-fpm: [ OK ] Starting php-fpm: [ OK ]
Проверяем порт:
# netstat -anpt | grep 9001 tcp 0 0 127.0.0.1:9001 0.0.0.0:* LISTEN 26127/php-fpm
Возвращаемся к настройке NGINX — в данном случае файл /etc/nginx/conf.d/testing.domain.org.ua.conf.
Меняем строку:
fastcgi_pass 127.0.0.1:9000;
на:
fastcgi_pass 127.0.0.1:9001;
(порт, который мы указали в настройках пула PHP-FPM).
Проверяем конфигурацию:
# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Перезапускаем NGINX:
# service nginx restart Stopping nginx: [ OK ] Starting nginx: [ OK ]
Смотрим пользователя, под которым запущен пул:
# ps aux | grep -E 'php-fpm.*setevoy' setevoy 26129 0.0 0.5 326064 5680 ? S 20:10 0:00 php-fpm: pool testing.domain.org.ua setevoy 26130 0.0 0.6 326064 6852 ? S 20:10 0:00 php-fpm: pool testing.domain.org.ua setevoy 26131 0.0 0.5 326064 5680 ? S 20:10 0:00 php-fpm: pool testing.domain.org.ua setevoy 26132 0.0 0.4 326064 4944 ? S 20:10 0:00 php-fpm: pool testing.domain.org.ua
И проверяем работу сайта.
Про более тонкую настройку PHP-FPM — в следующем посте.




