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

时间:2015-12-23 04:54:22

标签: python django amazon-web-services elastic-beanstalk django-settings

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

背景

我在弹性beanstalk上部署了django网站。网站域名已添加到ALLOW_HOSTS,因此正常请求会被django正确接受。

ALLOWED_HOSTS = ['.mydomain.com']

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)

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

5 个答案:

答案 0 :(得分:8)

没有充分理由接受针对您的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
  • 没有复杂的apache配置,这取决于您的域
  • 在dns上快速失败,无需依赖超时

答案 1 :(得分:2)

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

一般的想法是检查'ELB-HealthChecker/1.0' User-Agent的传入请求以及您设置为请求REQUEST_URI的健康检查网址。这些请求可以使用RequestHeader set Host命令将其主机标头更改为允许的主机。

如果真的不想配置Apache,您可以实现自定义中间件来覆盖Django的CommonMiddleware,以允许健康检查程序请求绕过Django的{{1}验证。

如果您需要更多实施其中一种解决方案,我会在this answer中详细介绍。

答案 2 :(得分:1)

在settings.py中,这是我使用的配置,它适用于我(至少对于DEV):

# AWS config for ElasticBeanstalk
ALLOWED_HOSTS = [
    '127.0.0.1',
    'localhost',
    '.compute-1.amazonaws.com', # allows viewing of instances directly
    '.elasticbeanstalk.com' 
]

我希望它有所帮助。

答案 3 :(得分:0)

将 EC2 实例的本地 IP 添加到允许的主机对我有用。

settings.py

import socket

hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)

ALLOWED_HOSTS = ['...', local_ip]

答案 4 :(得分:-1)

添加分配给该主机的IP列表。 只有IP地址没有http://或/ latest / media ...