Django ALLOWED_HOSTS与ELB HealthCheck

时间:2014-12-31 11:07:35

标签: django amazon-web-services amazon-ec2 amazon-elb amazon-elastic-beanstalk

我在Elastic Beanstalk上部署了一个django应用程序。我的应用程序的HealthCheck保持失败,因为ELB HealthCheck的IP未包含在我的ALLOWED_HOSTS设置变量中。

如何修改ALLOWED_HOSTS以使HealthCheck通过?我只是传递显式IP地址,但我相信这会改变,所以每当IP更改时,检查都会再次失败,直到我添加新IP。

3 个答案:

答案 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_hostALLOWED_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放在CommonMiddlewaresettings.py的前面

MIDDLEWARE = [
    'yourdjangoapp.middleware.HealthCheckMiddleware',
    ......
    'django.middleware.common.CommonMiddleware',
    ......
]

只要您的应用程序正在运行,无论进行任何配置,它都将始终以/health响应路径ok