如何在 django 中设置健康检查页面

Posted

技术标签:

【中文标题】如何在 django 中设置健康检查页面【英文标题】:How to setup health check page in django 【发布时间】:2015-12-31 11:05:17 【问题描述】:

我有一个需要身份验证才能访问它的任何页面的 web 应用程序。但是为了让我的 ELB 工作,我必须为 ELB 设置健康检查页面,以便 ELB 发现 django 应用程序。

此页面应返回 HTTP 200 并且不需要身份验证。如何使用 django/nginx 世界进行设置。

【问题讨论】:

【参考方案1】:

您可以使用django-health-check 3rd 方应用。

使用 pip 安装它 -

pip install django-health-check 

将 URL 配置为 -

urlpatterns = [
    # ...
    url(r'^health_check/', include('health_check.urls')),
]

并将 health_check 应用程序添加到您的 INSTALLED_APPS:

INSTALLED_APPS = [
    # ...
    'health_check',                             # required
]

更多详情:https://github.com/KristianOellegaard/django-health-check

现在您可以将 ELB 健康检查 url 配置为 - /health_check/

【讨论】:

【参考方案2】:

不推荐 - 这是让 Django 启动并运行 ELB 的一种快速而肮脏的方法,但在大多数情况下,应该直接从您的应用程序代码返回健康检查响应。查看其余答案以获得更好的解决方案。


这是由 nginx 更好地处理的事情,因此它为 django 应用程序提供服务的事实应该没有什么区别。

您首先需要配置 ELB 的运行状况检查以 ping 实例的特定 URL,例如 /elb-status。您可以按照此处的说明进行操作:http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-healthchecks.html#update-health-check-config

之后,您需要做的就是将 nginx 设置为始终发回 HTTP 200 状态码。您可以在nginx.conf 中的server 块中添加类似这样的内容:

location /elb-status 
    access_log off;
    return 200;

查看answer了解更多详情。

【讨论】:

我不确定这是个好主意 - 它确实有效,但如果您遇到应用程序级错误,它可能会错过它。 绝对不是一个好主意 - 特别是在容器世界中,您可以认为一切都已启动并从 ps 正常运行,但当您实际尝试发出请求时,由于网络设置,您会得到 502。 加入其他人。仅仅因为 nginx 在工作,并不意味着它背后的应用程序在工作。通常,如果您使用的是 ELB,您也不会依赖 nginx 的健康检查,并且无论如何位置块都会绕过这些检查。 同意,我不会再推荐这种方法了。相应地更新了答案。【参考方案3】:
@app.route('/elb-health-check')
def check_httpd_service():
    server = xmlrpclib.Server('http://'+supervisor_host+':'+supervisor_rpc_port+'/RPC2')

    state = server.supervisor.getProcessInfo(process)
    print state['statename']
    if state['statename'] == 'RUNNING':
        return state['statename'], 200
    else:
        return state['statename'], 500

相应地定义变量。

上面的代码是创建一个没有身份验证的自定义 api 的示例。它可以通过 HTTP GET 请求方法调用,并且可以用于从 ELB 执行健康检查。

这只是一个例子,你可以使用自己的想法和flask/django来为ELB创建一个自定义的健康检查服务。

在这里,我使用过程控制系统 supervisor 来控制我的应用程序。从主管我可以跟踪应用程序的状态。如果应用程序退出,主管会重新加载应用程序。

http://supervisord.org/

如果服务正在运行,服务器将返回 200 响应码。如果服务没有在主机上运行,​​它会返回 500 响应码。根据这个响应代码,我们可以在负载均衡器中路由流量。

【讨论】:

【参考方案4】:

这是另一个使用 Django 中间件的解决方案。

from django.http import HttpResponse


class HealthCheckMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.path == '/health':
            return HttpResponse('ok')
        return self.get_response(request)

并将您的HealthCheckMiddleware 放在settings.py 中的其他中间件前面

MIDDLEWARE = [
    'yourdjangoapp.middleware.HealthCheckMiddleware',
    ......
]

只要您的应用程序正在运行,无论任何配置和身份验证如何,您的应用程序都将始终使用 ok 响应路径 /health

【讨论】:

【参考方案5】:

曾经遇到过同样的问题,我们最终创建了 django-heartbeat:

https://github.com/pbs/django-heartbeat

它提供了一个端点来确保您的应用程序正常运行。 加上一些其他有用的“检查器”,您可以开箱即用地启用这些检查器,以显示以下信息:

构建版本 python、django 或其他依赖项 数据库、缓存信息等

https://github.com/pbs/django-heartbeat#available-checkers

如果您觉得它有用,请随意 ⭐。

如果您需要任何其他功能或想要贡献,请告诉我们或直接打开 PR。

谢谢!

【讨论】:

以上是关于如何在 django 中设置健康检查页面的主要内容,如果未能解决你的问题,请参考以下文章

未在运行状况检查请求中设置 SNI 扩展 (Apache v.2.4.35)

在django使用kubernetes健康检查

如何获取 Azure APIM 健康检查和详细信息

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

AWS Elastic Beanstalk Django 应用程序健康检查问题

如何在使用 Spring 会话的项目中设置忽略 URL