NGINX: виртуалхост под отдельным пользователем с PHP-FPM

Автор: | 01/10/2014
 

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