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

问题描述 投票:0回答:6

如何在 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)

但我仍然收到无效的主机 IP 错误,似乎是使用弹性负载均衡器公共 IP 访问 Elastic Beanstalk 实例。网上有针对 EC2 部署的解决方案,您可以设置 HTTPD 软件,在通过 IP 直接访问时设置 http HOST 标头。但我们无法在 Elastic Beanstalk 上配置 Apache。

如何将弹性负载均衡器IP添加到

ALLOW_HOSTS

python django amazon-web-services amazon-elastic-beanstalk django-settings
6个回答
23
投票

没有充分的理由接受定向到您的 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 快速失败,无需依赖超时

4
投票

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

.ebextensions
配置 Apache。

总体思路是检查

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

如果真的不想配置 Apache,您可以实现自定义中间件来覆盖 Django 的

CommonMiddleware
,以允许健康检查器请求绕过 Django 的
ALLOWED_HOST
验证。

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


1
投票

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

settings.py

import socket

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

ALLOWED_HOSTS = ['...', local_ip]

0
投票

如果您在 2024 年阅读本文,并且即使在实施了此处的所有建议后仍然遇到问题,我只是花了大量时间试图找出问题的根源并设法找到解决方案,因为我的日志和 Sentry 完全堵塞了.

简短回答:如果主机来自固定 IP,则需要更新 nginx.conf 文件以重写主机。

完整写在这里: https://diogofreire.btw.so/fixing-the-damn-allowed_hosts-issue-with-amazon-elastic-beanstalk-and-django


-1
投票

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


-2
投票

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

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.