用于 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 会话粘性?