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 健康检查的主要内容,如果未能解决你的问题,请参考以下文章