我正在使用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地址上看到了这个问题。
答案 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基础架构的垃圾邮件制造者。很高兴知道。