10

我写了一个快速的 PHP 页面来处理 502 请求。当遇到 502 并触发电子邮件时,Nginx 将重定向到此页面。

问题是,大多数时候遇到 502 是因为 PHP 已经死了,所以不再可能使用 PHP 写入数据库和发送电子邮件。对 PHP-FPM 设置的调整有很大帮助(重新启动 PHP 等),但我仍然想要一个后备。

有很多方法可以在 PHP 之外发送电子邮件,但我很好奇其他人在做什么并取得了成功?我想保持简单的配置(即在服务器上没有另一个复杂的依赖关系)和可靠性原因。

谷歌搜索和搜索结果并不多,可能是因为“死亡”和“失败”为我的场景带来了很多误报。

4

3 回答 3

1

如何使用 cronjob(基于 bash)定期解析 error_log 文件(x 小时)并在找到resuming normal operations上一个时期(x 小时)类似的内容时发送电子邮件(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

更新:

@Brian 正如@takeshin 所说,如果你愿意,cronjobs 甚至可以每秒运行一次,但有些系统管理员可能会咬你……:|

于 2012-12-27T17:52:41.363 回答
1

这就是我最终所做的。我还没有将它推广到我们的产品服务器上,但是到目前为止所有的测试看起来都不错。

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 代码后立即执行(根据脚本的逻辑,随后的 502 不会用电子邮件锤我)。

我能够运行一些模拟测试来强制 nginx 返回 502(请参阅此处的更多信息)。

我将继续对此进行调整,但我对部署它的相对容易性以及可以重用现有代码感到非常满意。

于 2012-12-31T01:56:49.757 回答
0

我们有双重解决方案。

如果 PHP 死了,我们使用 shell 脚本发送电子邮件通知。我们使用 shell 脚本中的 shell 命令检查 php 服务是否正在运行,如果它没有运行,我们将触发 shell 命令以发送电子邮件。

这一切都在几行 Shell 脚本中。不是太难。

当然,在 cron 中设置它。

于 2012-12-28T20:30:48.653 回答