我有一个网络应用程序,需要身份验证才能访问它的任何页面。但是为了让我的 ELB 工作,我必须为 ELB 设置运行状况检查页面,以便 ELB 发现 django 应用程序。
此页面应返回 HTTP 200 并且无需身份验证。我如何使用 django/nginx world 设置它。
这是使用 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
。
您可以使用
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/
曾经遇到过同样的问题,我们最终创建了 django-heartbeat:
https://github.com/pbs/django-heartbeat
它提供了一个端点来确保您的应用程序启动并运行。 再加上一些其他有用的“检查器”,您可以开箱即用地启用它们,以显示有关以下内容的信息:
https://github.com/pbs/django-heartbeat#available-checkers
如果您觉得有用,请随意⭐️。
如果您需要任何其他功能或想要做出贡献 - 请告诉我们或直接创建 PR。
谢谢!
不推荐 - 这是启动 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;
}
请参阅此答案了解更多详情。
@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 会重新加载该应用程序。
如果服务正在运行,服务器将返回200响应码。如果该服务未在主机上运行,它将返回 500 响应代码。根据此响应代码,我们可以在负载均衡器中路由流量。
你可以使用这个包来检查 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
]
查看此文档链接