Systemd http 健康检查

Posted

技术标签:

【中文标题】Systemd http 健康检查【英文标题】:Systemd http health check 【发布时间】:2017-02-02 09:27:30 【问题描述】:

我在 Redhat 7.1 上有一个服务,我使用 systemctl start、stop、restart 和 status 来控制。有一次 systemctl 状态返回 active,但服务“后面”的应用程序响应的 http 代码与 200 不同。

我知道我可以使用 Monit 或 Nagios 来检查这一点并重新启动 systemctl - 但我想知道在使用 systemd 时是否存在默认设置,因此我不需要安装其他工具。

我首选的解决方案是,如果 http 返回码与 200 不同,则在没有 systemd 本身以外的其他工具的情况下完全自动重新启动我的服务 - (并且可能有可能通知 Hipchat 房间或发送电子邮件......)

我试过用谷歌搜索这个主题 - 没有运气。请帮忙:-)

【问题讨论】:

@shellter,我不同意这是题外话。健康检查不是最终用户关心的问题,但在很大程度上是一个开发问题/问题。您愿意描述一下决定关闭的原因吗? ...我可能会看到一个论点,认为这更像是一个操作问题(与 ServerFault 相比 *** 更相关),但我不相信这个论点是一个令人信服的论点,因为制作 OP 想要的功能需要开发知识——我的回答提供了一个指向要使用的特定 API 的指针,这不是我们期望在 ServerFault 讨论中成为主题的知识。 ...需要开发知识和代码更改,因为需要编写调用sd_notify() 并显示健康检查结果的代码,或者执行等效的套接字写入本身。 【参考方案1】:

简短的回答

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


长答案

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

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

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


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

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

【讨论】:

以上是关于Systemd http 健康检查的主要内容,如果未能解决你的问题,请参考以下文章

Nginx被动健康检查和主动健康检查

Nginx实战|Nginx健康检查

nginx backend 健康检查

如何在没有 http 的情况下为 graphql apis 编写健康检查

5-niginx-健康检查模块

健康检查机制