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

问题描述 投票:0回答:6

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

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

django amazon-web-services nginx amazon-elb
6个回答
19
投票

这是使用 Django Middleware 的另一个解决方案。

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


11
投票

您可以使用

django-health-check
第3方应用程序。

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


1
投票

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

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

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

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

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

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

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

谢谢!


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;
}

请参阅此答案了解更多详情。


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


0
投票

你可以使用这个包来检查 django 的健康状况

pip install django-health-check

将运行状况检查器添加到您要使用的 URL:

urlpatterns = [
    # ...
    path(r'ht/', include('health_check.urls')),
]

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

    INSTALLED_APPS = [
    # ...
    'health_check',                             # required
    'health_check.db',                          # stock Django health checkers
    'health_check.cache',
    'health_check.storage',
    'health_check.contrib.migrations',
    'health_check.contrib.celery',              # requires celery
    'health_check.contrib.celery_ping',         # requires celery
    'health_check.contrib.psutil',              # disk and memory utilization; requires psutil
    'health_check.contrib.s3boto3_storage',     # requires boto3 and S3BotoStorage backend
    'health_check.contrib.rabbitmq',            # requires RabbitMQ broker
    'health_check.contrib.redis',               # requires Redis broker
]

查看此文档链接

© www.soinside.com 2019 - 2024. All rights reserved.