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 – в следующем посте.