Django ALLOWED_HOST设置Elastic Load Balancer后面的Elastic beanstalk实例

Clo*_*eam 3 python django amazon-web-services django-settings amazon-elastic-beanstalk

问:如何ALLOW_HOSTS在弹性beanstalk实例上设置django 以允许Elastic Load Balancer IP?

背景

我在弹性beanstalk上部署了django网站.网站域名被添加到ALLOW_HOSTS正常请求被django正确接受.

ALLOWED_HOSTS = ['.mydomain.com']
Run Code Online (Sandbox Code Playgroud)

Elastic Load balancer直接使用IP地址访问Elastic beanstalk实例以进行运行状况检查,因此下一行允许运行状况检查:

# add elastic beanstalk instance local ip
aws_ip = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', timeout=0.1).text
ALLOWED_HOSTS.append(aws_ip)
Run Code Online (Sandbox Code Playgroud)

但我仍然得到无效的HOST IP错误,似乎弹性负载均衡器公共IP访问了弹性beanstalk实例.有针对EC2部署的在线解决方案,因为您可以将HTTPD软件设置为在IP直接访问时设置http HOST标头.但我们无法在弹性beanstalk上配置apache.那么如何将弹性负载均衡器IP添加到ALLOW_HOSTS

noa*_*amk 12

没有充分理由接受针对您的ELB IP的流量.对于健康检查,我的首选方法:

import requests
try:
    internal_ip = requests.get('http://instance-data/latest/meta-data/local-ipv4').text
except requests.exceptions.ConnectionError:
    pass
else:
    ALLOWED_HOSTS.append(internal_ip)
del requests
Run Code Online (Sandbox Code Playgroud)
  • 没有复杂的apache配置,这取决于您的域
  • 在dns上快速失败,无需依赖超时


小智 4

我相信最好的方法是配置 Apache 来处理请求主机验证。即使使用 beanstalk,您也应该能够使用.ebextensions.

总体思路是检查 的传入请求'ELB-HealthChecker/1.0' User-Agent以及您设置为请求的 的运行状况检查 URL REQUEST_URI。这些请求可以使用该命令将其主机标头更改为允许的主机RequestHeader set Host

如果确实不想配置 Apache,您可以实现自定义中间件来覆盖 Django,CommonMiddleware以允许运行状况检查器请求绕过 Django 的ALLOWED_HOST验证。

如果您需要更多关于实施这些解决方案之一的信息,我会在这个答案中进行更详细的介绍。