我写了一个快速的PHP页面来处理502个请求。当遇到502并且发射电子邮件时,Nginx将重定向到此页面。
问题是,遇到502的大部分时间是因为PHP已经死亡,所以写入数据库并使用PHP发送电子邮件已不再可能。对PHP-FPM设置的调整已经做了很多工作来帮助(重启PHP等),但我仍然喜欢回退。
有许多方法可以在PHP之外发送电子邮件,但我很好奇其他人在做什么并取得了成功?我想保持配置简单(即没有另外复杂的依赖关系来担心服务器)和可靠性原因。
谷歌搜索和搜索SO没有太多,可能是因为“死亡”和“失败”为我的场景带来了很多误报。答案 0 :(得分:1)
使用cronjob(基于bash)定期解析error_log文件(x小时)并在上一期(x小时)内找到类似resuming normal operations
的内容时发送电子邮件(mutt / mail)。我觉得简单有效......
[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
<强>更新强>
@ prian正如@takeshin所说,如果你愿意,cronjobs甚至可以每秒运行一次,但是一些系统管理员可能会咬你......:答案 1 :(得分: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脚本,它在命令行上调用PHP并传入我已编写的PHP脚本。这对我来说是一个理想的解决方案,因为脚本已经设置为登录我们的警报表并触发电子邮件。这也是实时的,因为一旦nginx返回502代码,脚本就会执行(根据脚本的逻辑,后续的502s不会使用电子邮件敲打我)。
我能够运行一些模拟测试,强制nginx返回502(参见更多here)。
我将继续对此进行调整,但我对部署它相对容易以及我可以重用现有代码感到非常满意。
答案 2 :(得分:0)
我们有双重解决方案。
如果PHP死了,我们使用shell脚本发送电子邮件通知。我们检查php服务是否在shell脚本中运行shell命令,如果它没有运行,我们将触发shell命令发送电子邮件。
这一切都在Shell脚本的几行中。不是太难。
当然,请在cron中设置。