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

Lah*_*iru 8 django nginx amazon-web-services amazon-elb

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

此页面应返回 HTTP 200 且无需身份验证。我如何使用 django/nginx 世界设置它。

Wat*_*uri 18

这是使用 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)
Run Code Online (Sandbox Code Playgroud)

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

MIDDLEWARE = [
    'yourdjangoapp.middleware.HealthCheckMiddleware',
    ......
]
Run Code Online (Sandbox Code Playgroud)

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


Ani*_*kur 7

您可以使用django-health-check第 3 方应用程序。

使用 pip 安装它 -

pip install django-health-check 
Run Code Online (Sandbox Code Playgroud)

将 URL 配置为 -

urlpatterns = [
    # ...
    url(r'^health_check/', include('health_check.urls')),
]
Run Code Online (Sandbox Code Playgroud)

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

INSTALLED_APPS = [
    # ...
    'health_check',                             # required
]
Run Code Online (Sandbox Code Playgroud)

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

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


gbs*_*gbs 0

不推荐 - 这是一种让 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 状态代码。您可以将类似的内容添加到您的server块中nginx.conf

location /elb-status {
    access_log off;
    return 200;
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅此答案。

  • 我不确定这是一个好主意 - 它确实有效,但如果您有应用程序级错误,它可能会错过它。 (2认同)
  • 绝对不是一个好主意 - 特别是在容器世界中,您可以认为 ps 一切正常并运行良好,但当您实际尝试发出请求时,由于网络设置,您会收到 502。 (2认同)
  • 跟其他人打招呼。仅仅因为 nginx 正在工作,并不意味着它背后的应用程序也在工作。通常,如果您使用 ELB,您也不依赖 nginx 的运行状况检查,并且位置块无论如何都会绕过这些检查。 (2认同)
  • 同意,我不会再推荐这种方法了。相应地更新了答案。 (2认同)