Подтвердить что ты не робот

Можем ли мы перезагрузить один из пулов PHP-FPM, не беспокоя других

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

Всякий раз, когда я изменяю конфигурацию пула для любого, я перезагружаю/перезапускаю процесс FPM (по сигналу USR2).

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

Я хочу знать, могу ли я перезагрузить/перезапустить только один пул, когда другие работают так, как они были (никаких проблем в проходящих транзакциях в этих пулах).

Я также был бы признателен за любые другие предложения по настройке, которые могли бы позволить мне иметь требуемое управление пулами

4b9b3361

Ответ 1

php-fpm допускает изящный перезапуск дочерних элементов, обычно с ключевым словом reload вместо restart в init script, отправляя сигнал USR2.

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

  • очистить кеш APC
  • изменить путь к файлу журнала
  • изменить минимальные/максимальные/начальные настройки для детей

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

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

Использование ключевого слова restart является более опасным, особенно потому, что init script, возможно, убивает длительных пользователей на этапе остановки. И с несколькими демонами, управляемыми несколькими PID и конфигурационными файлами, вы даже можете получить команду start-stop-daemon с опцией --exec (что в случае с debian), и это убьет всех демонов, работающих с тем же исполняемым файлом php-fpm (эффективно отправив kill -9 для всех остальных параллельных демонов php-fpm после остановки правой с правильным PID, если вы запускаете несколько процессов php-fpm, что очень плохо).

Таким образом, использование ключевого слова reload (USR2 signal) является обязательным.