在Nginx服务器容器中创建一个简单的健康检查端点

11
我有一个运行着nginx服务器的docker容器。
我想提供一个rest接口/端点来检查服务器和容器的健康状况。例如,GET http://container.com/health/ 返回"true"/OK或"false"/NOK。
什么是最简单和最快的解决方案或最佳实践?
附注:该服务器作为文件浏览器提供服务,即启用了目录索引列表。

这是一个静态网站还是nginx在运行其他东西?您只是想查看nginx的健康状况吗?如果不是,还有什么其他需求? - BMitch
1
你可以创建一个单独的 location 块,返回一个字符串,例如 location /health { return 200 "OK\n"; },但如果 nginx 停止工作,你如何让它返回一些东西呢?我认为在这种情况下,你唯一能做的就是将连接超时处理为失败。 - Ivan Shatsky
@IvanShatsky,我该怎么做?你能详细解释一下你的答案吗? - m19v
@BMitch,这只是Nginx服务器,在home/http文件夹中有文件。通过浏览器我可以查看/列出文件。欢迎任何建议。 - m19v
我已经给了你一个location块的例子,它将在响应http://container.com/health请求时返回"OK"。有很多方法可以检查容器是否响应此请求(curl及其库是我首先想到的东西),我的想法是假设如果在一段时间内没有收到任何响应,则认为容器已经关闭。 - Ivan Shatsky
显示剩余2条评论
2个回答

29

以下配置适用于我的nginx版本:nginx/1.14.0 (Ubuntu)

    location = /health {
            access_log off;
            add_header 'Content-Type' 'application/json';
            return 200 '{"status":"UP"}';
    }

测试方法:


7

添加

server {
    // ....

    location /health {
        access_log off;
        add_header 'Content-Type' 'text/plain';
        return 200 "healthy\n";
    }
}

如果您需要JSON支持,可以选择这个选项。
server {
    // ....

    location /health {
        access_log off;
        add_header 'Content-Type' 'application/json';
        return 200 '{"status":"Healthy"}';
    }
}

注意:任何状态码在200及以上且在400以下的都被认为是存活/成功的。因此,它并不关心Body本身是什么。重要的是返回的status_code是什么。

另外,如果您需要代理到远程后端服务。

server {
    // ....

    location / {
       proxy_pass http://backend;
       health_check interval=10 fails=3 passes=2;
    }
}

这样你就可以让你的后端服务处理实际的状态。因为仅仅容器已准备好和nginx已准备好,并不总是意味着后端服务已连接到其依赖服务,如数据库等。


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