AWS Lightsail容器下Django ALLOWED_HOSTS动态IP适配Nginx配置问题
AWS Lightsail容器实例反复重启问题解决方案
问题根因:AWS Lightsail容器的健康检查请求会将实例的动态IP作为HTTP Host头发起请求,你当前的Nginx配置在转发
/health.txt请求时通过include proxy_params继承了默认的Host头设置,将动态IP直接传递给Django后端,触发Django的ALLOWED_HOSTS校验失败,导致健康检查不通过触发实例重启。
方案1:修改Nginx配置,硬编码健康检查转发的Host头(最推荐)
只需要调整/health.txt对应的location块,覆盖传递给Django的Host头为你已经在ALLOWED_HOSTS中配置的合法域名example.com即可,修改后的配置如下:
# 其他原有配置保持不变 location /health.txt { include proxy_params; # 新增这行,覆盖默认的Host头为合法域名 proxy_set_header Host example.com; proxy_pass http://backend; }
该方案不需要修改后端代码,也不会改变正常业务请求的转发逻辑,完全规避了将ALLOWED_HOSTS放开到['*']带来的Host头攻击风险。
方案2:Django侧自定义中间件跳过健康检查路径的Host校验
如果不想调整Nginx配置,可以在Django中新增一个前置中间件,专门处理健康检查请求,直接返回200响应,不走到后续的ALLOWED_HOSTS校验逻辑:
- 新建中间件文件(比如
app/middleware.py):
from django.http import HttpResponse class HealthCheckMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): if request.path == "/health.txt": return HttpResponse("ok", content_type="text/plain") return self.get_response(request)
- 在
settings.py的MIDDLEWARE列表最顶部注册这个中间件:
MIDDLEWARE = [ "app.middleware.HealthCheckMiddleware", # 其他原有中间件保持不变 ... ]
该方案仅放开健康检查路径的Host校验,所有业务路径依然保持原有的ALLOWED_HOSTS校验规则,安全性也有保障。
内容的提问来源于stack exchange,提问作者Olsson
相关产品推荐
相关产品推荐

