用于 Amazon ELB 的 Django ALLOWED_HOSTS

Posted

技术标签:

【中文标题】用于 Amazon ELB 的 Django ALLOWED_HOSTS【英文标题】:Django ALLOWED_HOSTS for Amazon ELB 【发布时间】:2016-06-21 20:20:12 【问题描述】:

我正在使用 Django,并且我有 ALLOWED_HOSTS 设置来包含我的 EC2 的私有 IP,如下所示:

import requests
EC2_PRIVATE_IP = None
try:
    EC2_PRIVATE_IP = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', timeout=0.01).text
except requests.exceptions.RequestException:
    pass
if EC2_PRIVATE_IP and not DEBUG:
    ALLOWED_HOSTS.append(EC2_PRIVATE_IP)

问题是上面没有考虑将请求转发到我的EC2 实例的ELB。有没有办法以编程方式完成这项工作?我可以请求公共 IP 地址或设置检查 DNS 吗?

我发现 ELB 的公共 IP 地址存在这个问题。

【问题讨论】:

我觉得应该是你的域名,而不是你的IP。我有 EBS,我有这个 ALLOWED_HOSTS = ['.elasticbeanstalk.com', 'mydaomain.com']。还要确保打开安全组中的所有端口并在负载均衡器中添加侦听器。 我有['.compute-1.amazonaws.com', '.elb.amazonaws.com', '.mydaomain.com'],但我从亚马逊收到了 54.xxx.xxx.xxx 的电子邮件。当我将 IP 地址放入浏览器时,它会转到我的主页。很明显,这与 AWS 有关。会不会是Route53? 您可以分配弹性IP,但没有必要这样做。您的域名 DNS 应该指向负载均衡器 DNS 这真的很奇怪。现在我不知道这些电子邮件是从哪里来的。 您的 VPC、负载均衡器和安全组正在控制访问流。从技术上讲,他们分配给您的 IP 地址无关紧要。另一方面,其中一些非常“肮脏”并且被垃圾邮件发送者使用。 【参考方案1】:

另一个简单的解决方案是编写一个自定义的MIDDLEWARE,它将在检查ALLOWED_HOSTS 之前向ELB 提供响应。所以现在您不必动态加载ALLOWED_HOSTS

中间件可以很简单:

project/app/middleware.py

from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin

class HealthCheckMiddleware(MiddlewareMixin):
    def process_request(self, request):
        if request.META["PATH_INFO"] == "/ping/":
            return HttpResponse("pong")

settings.py

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'app.middleware.HealthCheckMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    ...
]

Django 中间件参考https://docs.djangoproject.com/en/dev/topics/http/middleware/

【讨论】:

【参考方案2】:

获取 AWS 内部 IP 并添加到 ALLOWED_HOST 并不是最佳解决方案。由于此 Fetching 只会在应用程序重新加载时发生。 ELB IP 可以随时更改。

除了这个,我们可以在 nginx 中设置实际的主机头,如果这个请求来自一个 IP。

功劳归于: https://www.xormedia.com/django-allowed-hosts-and-amazon-elastic-load-balancer/

【讨论】:

有趣的想法!但是这种方式不就是违背ALLOWED_HOSTS的目的吗?

以上是关于用于 Amazon ELB 的 Django ALLOWED_HOSTS的主要内容,如果未能解决你的问题,请参考以下文章

跨 TCP 443 连接的 Amazon ELB 会话粘性?

仅从 ELB 访问 Amazon EC2 实例

自定义 Amazon ELB 的运行状况检查 URL

VPC 中私有子网中 EC2 实例的 Amazon ELB

如何让 Amazon 的 ELB 与 HTTPS/SSL 与 Web Sockets 一起工作?

ELB 和 ECS 集群前的 Amazon API Gateway