Django允许使用ELB HealthCheck的_主机

Django允许使用ELB HealthCheck的_主机,django,amazon-web-services,amazon-ec2,amazon-elb,amazon-elastic-beanstalk,Django,Amazon Web Services,Amazon Ec2,Amazon Elb,Amazon Elastic Beanstalk,我在Elastic Beanstalk上部署了一个django应用程序。我的应用程序的HealthCheck一直失败,因为ELB HealthCheck的IP未包含在我的允许的\u主机设置变量中 如何修改允许的\u主机以使HealthCheck通过?我只想传入显式IP地址,但我相信这会改变,因此每当IP改变时,检查将再次失败,直到我添加新的IP。您的EC2实例可以查询自身,包括其IP地址,该地址位于: 您可以通过ssh连接到EC2实例并运行以下命令来测试这一点: curl http://169.

我在Elastic Beanstalk上部署了一个django应用程序。我的应用程序的HealthCheck一直失败,因为ELB HealthCheck的IP未包含在我的
允许的\u主机
设置变量中


如何修改
允许的\u主机
以使HealthCheck通过?我只想传入显式IP地址,但我相信这会改变,因此每当IP改变时,检查将再次失败,直到我添加新的IP。

您的EC2实例可以查询自身,包括其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

显然,如果您不需要依赖关系,可以将
请求
替换为
urllib

另一种解决方案没有回答这个问题,因为它没有考虑AWS拥有的所有各种工具(ELB等)。我们最终要做的(因为我们使用了
nginx
+
uwsgi
)是在用户发送请求时将头设置为有效的

如本页所述:

我们将我们的
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;
}
这里的关键是根据您的
允许的\u主机
$my\u主机
输入一个有效值


不幸的是,在不增加开销的情况下,没有“完美”的解决方案。某些配置将要求您始终将IP地址添加到
允许的\u主机中
,但此解决方案通常使用的是最少的开销。

下面是另一个使用Django中间件的解决方案

Django的
Django.middleware.common.CommonMiddleware
调用
request.get\u host()
,它使用
允许的\u主机验证请求。如果只想检查应用程序是否正在运行,可以创建如下中间件

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中的
CommonMiddleware
前面

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

只要你的应用程序在运行,无论配置如何,你的应用程序都将始终以
ok
响应路径
/health

幸运吗?我也面临同样的问题,我只是硬编码了IP地址。只要我让站点运行,它就一直工作,无论如何,在这种情况下,它不会工作,因为用户试图获取ELB的IP地址,而不是他们正在运行的服务器。上面的代码没有得到ELB的IP地址。它确实起作用,因为当ELB运行其健康检查时,IP是服务器的IP,而不是ELB的IP。这与允许*?这似乎是一个很好的解决方案!