Django ALLOWED_HOSTS设置Elastic Load Balancer后面的Elastic Beanstalk示例

rm5edbpk  于 2023-08-08  发布在  Go
关注(0)|答案(5)|浏览(109)

如何在Elastic Beanstalk示例上设置Django ALLOW_HOSTS以允许Elastic Load Balancer IP?

背景

我在Elastic Beanstalk上部署了一个Django网站。网站域被添加到ALLOW_HOSTS,因此Django可以正确接受正常请求。

ALLOWED_HOSTS = ['.mydomain.com']

字符串
弹性负载均衡直接使用IP地址访问弹性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)


但我仍然得到无效的主机IP错误,似乎Elastic Beanstalk示例是使用Elastic负载均衡器公共IP访问的。在线上有EC2部署的解决方案,因为您可以设置HTTPD软件,以便在IP直接访问时设置http HOST头。但是我们不能在Elastic Beanstalk上配置Apache。
如何将弹性负载均衡IP添加到ALLOW_HOSTS

ghhkc1vu

ghhkc1vu1#

没有充分的理由接受定向到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上故障很快,不需要依靠超时
lvjbypge

lvjbypge2#

我认为最好的方法是配置Apache来处理请求主机验证。即使使用beanstalk,您也应该能够使用.ebextensions配置Apache。
一般的想法是检查传入的'ELB-HealthChecker/1.0'User-Agent请求以及您设置为请求的REQUEST_URI的健康检查URL。可以使用RequestHeader set Host命令将这些请求的主机头更改为允许的主机。
如果真的不想配置Apache,你可以实现一个自定义中间件来覆盖Django的CommonMiddleware,以允许健康检查器请求绕过Django的ALLOWED_HOST验证。
如果您需要更多关于实现这些解决方案之一的信息,我在this answer中进行了更详细的介绍。

q9yhzks0

q9yhzks03#

将EC2示例的本地IP添加到允许的主机对我来说很有效。
settings.py

import socket

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

ALLOWED_HOSTS = ['...', local_ip]

字符串

rqcrx0a6

rqcrx0a64#

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

eufgjt7s

eufgjt7s5#

在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' 
]

字符串
我希望能帮上忙。

相关问题