本地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状态,确认地址解析正常。
快速验证流程
- 临时将
ALLOWED_HOSTS设为['*']重新部署,若访问正常,可确定是Host配置问题。 - 在Django Pod内执行
curl http://localhost:8000,验证Django服务本身是否正常。 - 查看Nginx Pod日志
kubectl logs <nginx-pod-name>,确认请求是否成功转发至Django。
内容的提问来源于stack exchange,提问作者eliorn23
相关产品推荐
相关产品推荐

