适用于亚马逊ELB的Django ALLOWED_HOSTS

时间:2016-03-08 02:52:11

标签: django amazon-web-services

我正在使用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)

问题在于上述内容未考虑将请求转发给ELB个实例的EC2。有没有办法以编程方式完成这项工作?我可以申请公共IP地址,还是设置检查DNS?

我在ELB的公共IP地址上看到了这个问题。

3 个答案:

答案 0 :(得分:2)

另一个简单的解决方案是编写自定义MIDDLEWARE,该自定义ALLOWED_HOSTS将在检查ALLOWED_HOSTS之前将响应发送给ELB。因此,现在您不必动态加载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', ... ]

  {{range $y := .minYear    .maxYear}}                                                                                                
      <option value="y"> {{$y}}</option>                                                                                                
  {{end}}

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

答案 1 :(得分:1)

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

相反,如果请求来自IP,我们可以在nginx中设置实际的主机头。

贷方转到: https://www.xormedia.com/django-allowed-hosts-and-amazon-elastic-load-balancer/

答案 2 :(得分:-1)

原来这些请求来自使用AWS基础架构的垃圾邮件制造者。很高兴知道。