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



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

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

这里是另一个使用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

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

使用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/

有一次遇到了同样的问题,我们最终创建了django心跳:

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

它提供了一个端点,用于确保您的应用程序已启动并正在运行。再加上一些其他有用的";跳棋;您可以开箱即用地显示有关以下内容的信息:

  • 内部版本
  • python、django或其他依赖项
  • 数据库、缓存信息等

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

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

如果您需要任何额外的功能或想要贡献-请告诉我们或直接打开PR。

谢谢!

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


nginx可以更好地处理这一问题,因此它为django应用程序提供服务这一事实应该没有什么区别。

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

在那之后,您所需要做的就是将nginx设置为始终发送回HTTP200状态代码。您可以在nginx.conf:中将类似的内容添加到您的server块中

location /elb-status {
    access_log off;
    return 200;
}

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

@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的示例。它可以通过HTTPGET请求方法调用,并且可以用于从ELB执行健康检查。

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

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

http://supervisord.org/

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

最新更新