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

时间:2015-10-03 08:52:19

标签: django amazon-web-services nginx amazon-elb

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

此页面应返回HTTP 200并且不需要auth。如何使用django / nginx world设置它。

5 个答案:

答案 0 :(得分:2)

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

首先,您需要配置ELB的运行状况检查以ping您实例的特定网址,例如/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;
}

有关详细信息,请参阅此answer

答案 1 :(得分:0)

您可以使用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健康检查网址确认为 - /health_check/

答案 2 :(得分:0)

@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响应代码。根据此响应代码,我们可以在负载均衡器中路由流量。

答案 3 :(得分:0)

这是使用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',
    ......
]

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

答案 4 :(得分:0)

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

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

它提供了一个端点,用于确保您的应用程序正常运行。 加上一些其他有用的“检查器”,您可以立即启用它们以显示有关以下内容的信息:

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

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

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

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

谢谢!