You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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校验逻辑:

  1. 新建中间件文件(比如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)
  1. 在settings.py的MIDDLEWARE列表最顶部注册这个中间件:
MIDDLEWARE = [
    "app.middleware.HealthCheckMiddleware",
    # 其他原有中间件保持不变
    ...
]

该方案仅放开健康检查路径的Host校验,所有业务路径依然保持原有的ALLOWED_HOSTS校验规则,安全性也有保障。

内容的提问来源于stack exchange,提问作者Olsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:36:04