Настройка PHP-FPM в Linux

11Окт

В прошлой статье мы рассмотрели установку и простейшую настройку сервера nginx в связке с php-fpm менеджером. Давайте теперь коснемся настроек более подробно.

Мы не будем касаться настройки базовых параметров самого сервера nginx и проверки его работоспособности, мы это сделали в предыдущей статье. Но некоторые параметры рассмотреть необходимо.

Определим и укажем количество обработчиков и количество соединений на один обработчик. Для этого в файле /etc/nginx/nginx.conf укажем значения

worker_processes 1;
worker_connections 1024;

Основная идея в выборе данных значений заключается в том, что количество обслуживаемых клиентов равно количеству обработчиков, умноженному на количество соединений для каждого обработчика. Таким образом в нашем случае – это 1024 клиента. Для того, чтобы избежать проблем с операциями ввода-вывода, руководствуйтесь правилом 1 обработчик на одно ядро процессора. Определить количество ядер можно командой:

cat /proc/cpuinfo | grep processor
processor : 0

У моего процессора одно ядро. Поэтому количество обработчиков равно одному. Количество соединений можно добавлять в зависимости от необходимости. Данный параметр подбирается уже на практике.

В целях безопасности можно активировать директиву

server_tokens off

Из мануал: «Разрешает или запрещает выдавать версию nginx’а в сообщениях об ошибках и в поле “Server” заголовка ответа.»

Данная директива добавляется в секцию http/server/local конфигурационного файла.

Укажем размеры передаваемых сервером данных:

client_max_body_size 20m;
client_body_buffer_size 128k;

Данная директива добавляется в секцию http/server/local конфигурационного файла.

Настроим кэш для статических файлов. Это нужно для сохранения ресурсов и пропускной способности сервера. Выключим логирование и установим срок истечения заголовков равный 100 дней для статических файлов.

location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires 360d;
}

Для взаимодействия с PHP-FPM можно указать unix-сокет. Для этого в нашем конфигурационном фале необходимо прописать:

# Pass PHP scripts to PHP-FPM
location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

Забегая вперед, скажу что в настройках PHP-FPM нужно указать слушать IP и порт, заданные в нашей конфигурации. Делается это директивой listen файла конфигурации пула.

Для безопасности можно запретить доступ к скрытым файлам.

location ~ /\. {
access_log off;
log_not_found off;
deny all;
}

Саму настройку PHP-FPM можно разбить на 2 этапа: настройка глобальных параметров, которая осуществляется в файле /etc/php5/fpm/php-fpm.conf, и настройку пулов. Конфигурация пулов задается в файлах каталога /etc/php5/fpm/pool.d/. Глобальные параметры не так интересны и о них можно почитать в документации, а вот основные параметры настройки пулов мы рассмотрим.

Конфигурация каждого пула задается отдельным файлом. Если сделать команду ls -l /etc/php5/fpm/pool.d/, то мы увидим, что в системе уже присутствует файл конфигурации для пула www. Рассмотрим настройку на его примере.

Важным моментом в настройке является выбор количества обработчиков, которые применяются для выполнения php-скриптов. Их количество надо выбирать с умом. Слишком мало обработчиков не позволит эффективно и оперативно обрабатывать запросы, но в тоже время слишком большое количество приведет к исчерпанию ресурсов, которые требуются серверу для других задач. Количество обработчиков надо выбирать из соображений, что даже в пиковой нагрузке запросов на сервер, утилизация его ресурсов должна оставаться в пределах разумного и не приводить к его перегрузке.

Теперь давайте немного обратимся к файлу конфигурации и укажем следующие параметры. Ах да, в файле конфигурации строки начинающиеся с символа «;» являются комментариями и не рассматриваются в качестве директив.

Укажем динамический режим создания процессов, тем самым количество запущенных процессов PHP-FPM будет прямым образом зависеть от нагрузки на сервер.

pm = dynamic

Зададим максимальное количество дочерних процессов.

pm.max_children = 6

Далее необходимо задать количество дочерних процессов, которые будут запущены сразу по загрузке сервера. По умолчанию данное значение равно 2. Его можно увеличить, если ресурсы позволяют, давайте поставим его равно 3.

pm.start_servers = 3

Также надо задать минимальное и максимальное число простаивающих процессов. Сделаем минимальное количество равным числу процессов, запущенных по загрузке сервера. А максимальное число зададим, исходя из соображений, что оно не должно превышать максимально допустимое число дочерних процессов.

pm.min_spare_servers = 3
pm.max_spare_servers = 5

Данные значения приведены для примера и пояснения. Но в каждой конкретной ситуации они могут разниться. Оптимальные значения зависят от возможностей и доступных ресурсов сервера, от количества и сложности php-кода, количества запросов и нагрузки на сервер. Данные параметры можно получить только при практическом применении и тестировании создаваемого сайта.

Теперь рассмотрим специфичные настройки.

Для начала настроим логирование информации о скриптах, которые выполняются медленно. Данная информация будет полезна для выяснения причин задержек при работе сайта. Для начала зададим временной порог, по истечении которого выполнение скрипта будет считаться медленным.

request_slowlog_timeout = 10s

Единицы времени можно указать в секундах (s), минутах (m), часах (h) или днях (d). Мы указали время 10 секунд.

Теперь укажем и имя файла, куда будет отправляться информация.

slowlog = /var/log/slowphp.log

Теперь данный файл можно будет изучать на предмет исследования «медленных» скриптов.

В случае, когда необходимо выполнение скриптов в изолированном окружении или окружении chroot. Обычно данная возможность применяется в целях безопасности. Для активации данных возможностей необходимо установить параметр chroot.

chroot = /var/www

Устанавливая данный параметр следует помнить, что это повлечет за собой изменения в процессе обработки скриптов php.

Все пути к файлам теперь будут рассматриваться относительно заданной директории, а также php-скрипты не смогут обращаться к сокетам, расположенным за пределами заданного каталога.

Для обслуживания нескольких сайтов, может понадобиться добавление дополнительных пулов. Это позволит настраивать различные параметры для каждого сайта в отдельности. Для создания дополнительного пула скопируем наш файл /etc/php5/fpm/pool.d/www.conf под новым именем, к примеру /etc/php5/fpm/pool.d/www2.conf. Откроем новый файл и сменим имя пула. Для этого в верху файла сменим строку [www] на [www2].

И меняем строку:

listen = /var/run/php5-fpm.sock

на

listen = /var/run/www2.sock

В случае если мы хотим, чтобы обработчик слушал на паре ip:port, то директива listen будет выглядеть как

listen = 127.0.0.1:9000

Далее перезапустим сервис

/etc/init.d/php5-fpm restart