Elastic Load Balancer 后面的 Elastic beanstalk 实例的 Django ALLOWED_HOST 设置
Django ALLOWED_HOST setting for Elastic beanstalk instance behind Elastic Load Balancer
问。如何在 Elastic Beanstalk 实例上设置 Django ALLOW_HOSTS
以允许 Elastic Load Balancer IP?
背景
我在 elastic 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 错误,似乎使用弹性负载均衡器 public IP 访问了弹性 beantalk 实例。网上有EC2部署的解决方案,可以设置HTTPD软件,IP直接访问时设置http HOST header。但是我们不能在 elastic beanstalk 上配置 apache。那么如何将弹性负载均衡器 IP 添加到 ALLOW_HOSTS
?
您添加分配给该主机的 IP 列表。
只有 IP 地址没有 http:// 或 /latest/media...
我认为最好的方法是配置 Apache 来处理请求主机验证。即使使用 beantalk,您也应该能够使用 .ebextensions
.
配置 Apache
总体思路是检查 'ELB-HealthChecker/1.0'
User-Agent
的传入请求和设置为请求 REQUEST_URI
的健康检查 URL。可以使用 RequestHeader set Host
命令将这些请求的主机 header 更改为允许的主机。
如果真的不想配置 Apache,您可以实现自定义中间件来覆盖 Django 的 CommonMiddleware
以允许健康检查器请求绕过 Django 的 ALLOWED_HOST
验证。
如果您需要更多关于实施这些解决方案之一的信息,我在 this answer 中进行了更详细的介绍。
没有充分的理由接受定向到您的 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 快速失败,无需依赖超时
在 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'
]
希望对您有所帮助。
将 EC2 实例的本地 IP 添加到允许的主机对我有用。
settings.py
:
import socket
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
ALLOWED_HOSTS = ['...', local_ip]
问。如何在 Elastic Beanstalk 实例上设置 Django ALLOW_HOSTS
以允许 Elastic Load Balancer IP?
背景
我在 elastic 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 错误,似乎使用弹性负载均衡器 public IP 访问了弹性 beantalk 实例。网上有EC2部署的解决方案,可以设置HTTPD软件,IP直接访问时设置http HOST header。但是我们不能在 elastic beanstalk 上配置 apache。那么如何将弹性负载均衡器 IP 添加到 ALLOW_HOSTS
?
您添加分配给该主机的 IP 列表。 只有 IP 地址没有 http:// 或 /latest/media...
我认为最好的方法是配置 Apache 来处理请求主机验证。即使使用 beantalk,您也应该能够使用 .ebextensions
.
总体思路是检查 'ELB-HealthChecker/1.0'
User-Agent
的传入请求和设置为请求 REQUEST_URI
的健康检查 URL。可以使用 RequestHeader set Host
命令将这些请求的主机 header 更改为允许的主机。
如果真的不想配置 Apache,您可以实现自定义中间件来覆盖 Django 的 CommonMiddleware
以允许健康检查器请求绕过 Django 的 ALLOWED_HOST
验证。
如果您需要更多关于实施这些解决方案之一的信息,我在 this answer 中进行了更详细的介绍。
没有充分的理由接受定向到您的 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 快速失败,无需依赖超时
在 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'
]
希望对您有所帮助。
将 EC2 实例的本地 IP 添加到允许的主机对我有用。
settings.py
:
import socket
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
ALLOWED_HOSTS = ['...', local_ip]