Systemd http 健康检查

Systemd http health check

我在 Redhat 7.1 上有一个服务,我使用 systemctl start、stop、restart 和 status 来控制。有一次 systemctl 状态 return 处于活动状态,但应用程序 "behind" 服务响应的 http 代码不同于 200。

我知道我可以使用 Monit 或 Nagios 来检查它并重新启动 systemctl - 但我想知道在使用 systemd 时是否默认存在某些东西,这样我就不需要安装其他工具.

如果 http return 代码与 200 不同,我的首选解决方案是完全自动重启我的服务,除了 systemd 本身之外没有其他工具 - (也许有可能通知 Hipchat 房间或发送电子邮件...)

我试过用谷歌搜索这个主题 - 但没有成功。请帮助:-)

简答

systemd 有一个本机(基于套接字的)健康检查方法,但它不是基于 HTTP 的。但是,您可以编写一个 shim,通过 HTTP 轮询状态并将其转发到本机机制。


长答案

systemd 世界中正确的做法是使用 sd_notify 套接字机制在您的应用程序完全可用时通知 init 系统。使用 Type=notify 为您的服务启用此功能。

您可以使用 sd_notify() 调用直接写入此套接字,或者您可以检查 NOTIFY_SOCKET 环境变量以获取名称并让您自己的代码写入 READY=1应用程序返回 200s 时的套接字。

如果你想把它交给一个单独的进程,通过 HTTP 轮询你的进程,然后写入套接字,你可以这样做——确保 NotifyAccess 设置正确(默认情况下,仅允许服务的主进程写入套接字。


由于您有兴趣检测应用程序在完全初始化后失败并触发重启的情况,因此 sd_notify 套接字也适用于这种情况:

发送WATCHDOG_USEC=...设置成功测试之间允许的时间量,然后WATCHDOG=1每当你有一个成功的自测;只要在配置的时间内没有看到成功的测试,您的服务就会重新启动。