如何在django中设置健康检查页面
How to setup health check page in django
我有一个 web 应用程序,它需要身份验证才能访问它的任何页面。但是为了让我的 ELB 工作,我必须为 ELB 设置健康检查页面,以便 ELB 发现 django 应用程序。
此页面应 return HTTP 200 并且不需要身份验证。如何使用 django/nginx world.
进行设置
不推荐 - 这是启动 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 状态代码。您可以在 nginx.conf
:
中的 server
块中添加类似的内容
location /elb-status {
access_log off;
return 200;
}
有关详细信息,请参阅此 answer。
您可以使用 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/
@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 来控制我的应用程序。从主管我可以跟踪应用程序的状态。 Supervisor 重新加载应用程序(如果退出)。
如果服务是运行,服务器将return 200 响应代码。如果服务不在主机上 运行,它将 return 500 响应代码。基于此响应代码,我们可以在负载均衡器中路由流量。
这是另一个使用 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-heartbeat:
https://github.com/pbs/django-heartbeat
它提供了一个端点以确保您的应用已启动并且 运行。
加上一些其他有用的“跳棋”,您可以开箱即用,以显示有关以下内容的信息:
- 构建版本
- python、django 或其他依赖项
- 数据库、缓存信息等
https://github.com/pbs/django-heartbeat#available-checkers
如果觉得有用,欢迎点个⭐。
如果您需要任何额外的功能或想要做出贡献 - 让我们知道,或者直接打开 PR。
谢谢!
我有一个 web 应用程序,它需要身份验证才能访问它的任何页面。但是为了让我的 ELB 工作,我必须为 ELB 设置健康检查页面,以便 ELB 发现 django 应用程序。
此页面应 return HTTP 200 并且不需要身份验证。如何使用 django/nginx world.
进行设置不推荐 - 这是启动 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 状态代码。您可以在 nginx.conf
:
server
块中添加类似的内容
location /elb-status {
access_log off;
return 200;
}
有关详细信息,请参阅此 answer。
您可以使用 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/
@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 来控制我的应用程序。从主管我可以跟踪应用程序的状态。 Supervisor 重新加载应用程序(如果退出)。
如果服务是运行,服务器将return 200 响应代码。如果服务不在主机上 运行,它将 return 500 响应代码。基于此响应代码,我们可以在负载均衡器中路由流量。
这是另一个使用 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-heartbeat:
https://github.com/pbs/django-heartbeat
它提供了一个端点以确保您的应用已启动并且 运行。 加上一些其他有用的“跳棋”,您可以开箱即用,以显示有关以下内容的信息:
- 构建版本
- python、django 或其他依赖项
- 数据库、缓存信息等
https://github.com/pbs/django-heartbeat#available-checkers
如果觉得有用,欢迎点个⭐。
如果您需要任何额外的功能或想要做出贡献 - 让我们知道,或者直接打开 PR。
谢谢!