Systemd的HTTP健康检查

21

我在Redhat 7.1上有一个服务,使用systemctl start、stop、restart和status进行控制。有一次systemctl status返回了“active”,但是服务后端返回的http代码与200不同。

我知道可以使用Monit或Nagios进行检查并执行systemctl restart,但我想知道在使用systemd时是否存在默认的解决方案,以便无需安装其他工具。

我的首选解决方案是,如果http返回代码与200不同,则完全自动地重新启动我的服务,而无需其他工具,只用systemd本身——(可能还可以通知Hipchat房间或发送电子邮件...)

我尝试通过谷歌搜索这个主题——但没有找到答案。请帮帮我 :-)


7
@shellter,我不同意这是离题的。健康检查对终端用户并不重要,但它们非常关乎开发问题/疑问。您能描述一下关闭决定背后的推理吗? - Charles Duffy
1
我可以理解这可能更多的是运维问题(与其在StackOverflow上,更相关的是在ServerFault上),但我并不认为这个论点是令人信服的。因为实现 OP 想要的功能需要开发知识,我的答案提供了使用特定 API 的指针,这不是我们期望在 ServerFault 讨论中涉及的知识类型。 - Charles Duffy
1
需要开发知识和代码更改,因为需要编写调用 sd_notify() 以获取健康检查结果或执行等效套接字写入的代码。 - Charles Duffy
1个回答

26

简短回答

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


详细回答

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

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

如果您想将这个过程放到一个单独的进程中,该进程通过HTTP轮询您的进程然后写入套接字,您可以这样做--确保适当设置NotifyAccess(默认情况下,只允许服务的主进程写入套接字)。


在您想要检测应用程序在完全初始化后失败并触发重启的情况下,sd_notify套接字在此方案中也是适用的:

发送WATCHDOG_USEC=...以设置成功测试之间允许的时间,然后在进行成功自我测试时发送WATCHDOG=1。当在配置的时间段内未看到成功测试时,您的服务将重新启动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接