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

本地K8s部署Django+Nginx遇Bad Request(400)错误求助

排查Nginx访问Django返回400错误的解决方案

核心排查方向及解决步骤

1. 检查Django的ALLOWED_HOSTS配置

Django会校验请求的Host头,若请求Host不在ALLOWED_HOSTS列表中,直接返回400错误:

  • 打开项目settings.py,确认列表包含Minikube分配的Nginx服务IP、访问域名,测试环境可临时用*(生产环境禁用):
ALLOWED_HOSTS = ['localhost', '127.0.0.1', '<nginx-service-ip>', '<minikube-ingress-domain>']
  • 重新构建Django镜像,更新Pod使配置生效。

2. 修复Nginx反向代理的Host头传递

Nginx未正确转发Host头会触发Django的Host校验:

  • 检查Nginx配置文件,确保反向代理段包含Host头设置:
location / {
    proxy_pass http://django-service;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}
  • 重载Nginx配置:kubectl exec <nginx-pod-name> -- nginx -s reload

3. 匹配Minikube访问地址与ALLOWED_HOSTS

使用minikube tunnel时,访问地址需在Django允许列表内:

  • 执行minikube service list获取Nginx服务的实际访问地址,将其加入ALLOWED_HOSTS。
  • 尝试用minikube service <nginx-service-name>直接访问,排除隧道手动映射的问题。

4. 查看Django日志定位具体错误

通过日志确认是否为Host校验问题:

  • 执行kubectl logs <django-pod-name>,若出现Invalid HTTP_HOST header: 'xxx'的日志,直接指向ALLOWED_HOSTS配置缺失。

5. 校验Ingress配置(若使用Ingress)

若部署了Ingress资源,需确保Ingress的Host与Django配置匹配:

  • 检查Ingress YAML的spec.rules.host字段,确认该值在ALLOWED_HOSTS中。
  • 执行kubectl get ingress查看Ingress状态,确认地址解析正常。

快速验证流程

  1. 临时将ALLOWED_HOSTS设为['*']重新部署,若访问正常,可确定是Host配置问题。
  2. 在Django Pod内执行curl http://localhost:8000,验证Django服务本身是否正常。
  3. 查看Nginx Pod日志kubectl logs <nginx-pod-name>,确认请求是否成功转发至Django。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:54:50