我在Elastic Beanstalk上部署了一个django应用程序。我的应用程序的HealthCheck一直失败,因为我的ALLOWED_HOSTS设置变量中没有包含ELB HealthCheck的IP。
如何修改ALLOWED_HOSTS使HealthCheck通过?我只需要传递显式的IP地址,但我相信这种情况会发生变化,所以每当IP发生变化时,检查都会再次失败,直到我添加新的IP。
发布于 2015-11-05 00:51:48
您的EC2实例可以查询metadata自身的相关信息,包括其IP地址(可在http://169.254.169.254/latest/meta-data/local-ipv4中找到)。
您可以通过ssh进入您的EC2实例并运行:
curl http://169.254.169.254/latest/meta-data/local-ipv4因此,在您的配置中,您可以执行以下操作:
import requests
ALLOWED_HOSTS = ['.yourdomain.com', ]
try:
EC2_IP = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4').text
ALLOWED_HOSTS.append(EC2_IP)
except requests.exceptions.RequestException:
pass显然,如果您不想要依赖项,可以用urllib替换requests。
发布于 2020-10-31 23:58:22
这是另一个使用Django中间件的解决方案。
Django的django.middleware.common.CommonMiddleware调用request.get_host(),后者使用ALLOWED_HOSTS验证请求。如果您只是想检查应用程序是否正在运行,您可以像这样创建一个中间件。
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)在settings.py中把你的HealthCheckMiddleware放在CommonMiddleware前面
MIDDLEWARE = [
'yourdjangoapp.middleware.HealthCheckMiddleware',
......
'django.middleware.common.CommonMiddleware',
......
]而且,只要你的应用程序正在运行,无论配置如何,你的应用程序都会通过ok响应path /health。
发布于 2021-11-19 16:30:49
解决方案
对我有效的解决方案是简单地安装django-ebhealthcheck库。安装后,只需在INSTALLED_APPS中添加ebhealthcheck.apps.EBHealthCheckConfig即可。
来自django-ebhealthcheck GitHub:
默认情况下,Elastic Beanstalk的健康检查系统在发出请求时会使用每个负载均衡实例的公网IP作为请求的host头部。除非添加到ALLOWED_HOSTS中,否则这会导致Django返回一个400Bad Request和一个失败的健康检查。
这个应用程序动态地将你的实例的公共IP地址添加到Django的ALLOWED_HOSTS设置中,以允许健康检查成功。这在应用程序启动时发生。
版本2.0.0及更高版本支持IMDSv2。如果您使用的是v1并且无法升级,请使用此库的版本1 (pip install django-ebhealthcheck<2.0.0)。
安装
pip install django-ebhealthcheck添加ebhealthcheck.apps.EBHealthCheckConfig
INSTALLED_APPS = [
...
'ebhealthcheck.apps.EBHealthCheckConfig',
...
]https://stackoverflow.com/questions/27720254
复制相似问题