我在Elastic Beanstalk上部署了一个django应用程序。我的应用程序的HealthCheck保持失败,因为ELB HealthCheck的IP未包含在我的ALLOWED_HOSTS
设置变量中。
如何修改ALLOWED_HOSTS
以使HealthCheck通过?我只是传递显式IP地址,但我相信这会改变,所以每当IP更改时,检查都会再次失败,直到我添加新IP。
答案 0 :(得分:10)
您的EC2实例可以查询metadata有关自身的信息,包括其在http://169.254.169.254/latest/meta-data/local-ipv4处提供的IP地址。
您可以通过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
如果您不想要依赖关系,显然可以将requests
替换为urllib
。
答案 1 :(得分:1)
另一个解决方案没有回答这个问题,因为它没有考虑AWS所拥有的各种工具(ELB等)。我们最终做的是(因为我们使用nginx
+ uwsgi
),我们在用户发送请求时将标头设置为有效的内容。
如本页所述:
https://opbeat.com/blog/posts/the-new-django-allowed_hosts-with-elb-uwsgi-and-nginx/
我们将nginx
配置如下:
set $my_host $host;
if ($host ~ "\d+\.\d+\.\d+\.\d+") {
set $my_host "example.com";
}
location / {
uwsgi_pass unix:///tmp/mysite.com.sock;
uwsgi_param HTTP_HOST $my_host;
include uwsgi_params;
}
此处的关键是根据$my_host
为ALLOWED_HOSTS
设置有效值。
不幸的是,没有完美的"解决方案不增加开销。某些配置需要您始终向ALLOWED_HOSTS
添加IP地址,但此解决方案通常可以最少使用。
答案 2 :(得分:1)
这是使用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)
然后将您的HealthCheckMiddleware
放在CommonMiddleware
中settings.py
的前面
MIDDLEWARE = [
'yourdjangoapp.middleware.HealthCheckMiddleware',
......
'django.middleware.common.CommonMiddleware',
......
]
只要您的应用程序正在运行,无论进行任何配置,它都将始终以/health
响应路径ok
。