2013-06-03 1 views
27

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

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

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

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

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

ответ

35

php-fpm позволяет изящным рестарта Чайлдс, как правило, с reload ключевого слова вместо restart на сценарий инициализации, посылая сигнал USR2 ,

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

  • пустой кэш APC
  • путь альтер файл журнала
  • альтер мин/макс/старт ребенка настройки

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

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

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

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

+0

Спасибо за объяснение. Я перезагружаю (не перезапускаю, прошу прощения за мою наивность) процессы, отправляя USR2. Тем не менее, я хотел бы узнать все образцы о том, как это сделать: «управлять несколькими демонами php-fpm и одним пулом на каждого демона». Я был бы признателен, если бы вы могли немного рассказать о написании нескольких скриптов инициализации и основных файлов конфигурации. – kaychaks

+1

@kaychaks: Я написал пример здесь: http: //regilero.github.io/Drupal/English/2013/05/16/Warning_chrooted_php_fpm_and_apc/ – regilero

+0

Какую версию PHP вы использовали, чтобы заставить это работать? Я видел проблемы с двумя версиями от Ubuntu '5.5.9 + dfsg-1ubuntu4.4' и' 5.3.10-1ubuntu3.14', которые предотвращают это. Я протестировал, запустив длительный веб-запрос от nginx до PHP FPM, а затем отправив мастер-процесс PHP FPM на сигнал USR2, а nginx немедленно возвращает 502. – ianneub