Лучший способ отправить электронную почту, когда процесс PHP умирает

Я написал быструю страницу PHP для обработки 502 запросов. Nginx будет перенаправляться на эту страницу, когда встречается 502, и отправляется электронное письмо.

Проблема заключается в том, что большую часть времени, с которой сталкивается 502, заключается в том, что PHP скончался, поэтому запись в БД и отправка электронной почты с использованием PHP больше невозможны. Изменения в настройках PHP-FPM сделали много, чтобы помочь (перезагрузка PHP и т.д.), Но мне все равно хотелось бы отступить.

Существует множество способов отправки электронной почты за пределы PHP, но мне любопытно, что другие там делают с хорошим успехом? Я бы хотел, чтобы это было просто для конфигурации (т.е. Не было еще одной сложной зависимости для беспокойства на серверах) и соображений надежности.

Поиск в Google и поиск SO не сильно увеличились, возможно, потому, что "умирает" и "терпеть неудачу" возвращает много ложных срабатываний для моего сценария.

Ответ 1

Вот что я сделал. Я еще не перекатил его на наши серверы prod, но все тесты пока выглядят хорошо.

Nginx не поддерживает CGI изначально, поэтому вам нужно другое средство для этого. thttpd хорошо подбирает счет. Существует хорошая запись nginx wiki, показывающая, как его использовать.

Я настроил thttpd со следующим:

dir=/var/www/htdocs
user=thttpd
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
port=8000
cgipat=**.cgi

И добавил это в мою конфигурацию nginx:

error_page 502 @thttpd;

location @thttpd {
    include proxy.include;
    proxy_pass http://127.0.0.1:8000;
}

Наконец, я создал базовый CGI script, который вызывает PHP в командной строке и передан в моем уже написанном PHP скрипт. Это было идеальным решением для меня, потому что script уже настроен для входа в нашу таблицу оповещений и списания электронной почты. Это также в режиме реального времени, так как script будет выполняться, как только nginx вернет код 502 (последующие 502s не будут забивать меня электронными письмами по логике script).

Мне удалось запустить некоторые симуляционные тесты, чтобы заставить nginx вернуть 502 (см. далее здесь).

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

Ответ 2

Как использовать cronjob (bash) для периодического анализа файла error_log (x часов) и отправки электронной почты (mutt/mail), когда вы найдете что-то вроде resuming normal operations за последний период (x часов). Я думаю, что это просто и эффективно...

[Thu Dec 27 14:37:52 2012] [notice] caught SIGTERM, shutting down
[Thu Dec 27 14:37:53 2012] [notice] Apache/2.2.22 (Ubuntu) PHP/5.4.6-2~precise+1 configured -- resuming normal operations

UPDATE:

@Brian Как @takeshin говорит, что cronjobs могут работать даже каждую секунду, если хотите, но некоторые системные администраторы могут вас укусить...: |

Ответ 3

Мы имеем двойственное решение.

Мы используем shell script для отправки уведомлений по электронной почте, если PHP умирает. Мы проверяем, запущена ли служба php с командной оболочкой в ​​оболочке script, если она не запущена, мы отпустим команду оболочки для отправки электронной почты.

Это все в нескольких строках оболочки Script. Не слишком сложно.

Конечно, установите его в cron.