Docker环境下Nginx反向代理Django后无法访问,求排查帮助
Docker Nginx + Django 访问故障排查思路
我正在开发一个包含nginx和django服务的Docker项目,已将django.conf.template参数化,根据环境动态传递环境变量。生成的django.conf内容如下:
upstream django_app { server ${DJANGO_PRIVATE_IP}:${DJANGO_PORT}; } server { listen 80; listen 443 ssl; listen [::]:443 ssl; server_name ${NGINX_SERVER_NAME}; ssl_certificate /etc/nginx/certs/elitecars_cert.pem; ssl_certificate_key /etc/nginx/certs/elitecars_privkey.pem; access_log /var/log/nginx/nginx.django.access.log; error_log /var/log/nginx/nginx.django.error.log; location / { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_redirect off; proxy_pass http://django_app; } }
执行more /etc/nginx/conf.d/sites-available/django.conf确认环境变量已正确替换:
upstream django_app { server django:8000; } server { listen 80; listen 443 ssl; listen [::]:443 ssl; server_name 0.0.0.0 127.0.0.1 localhost; ...
但浏览器访问时无法正常工作,以下是具体排查方向:
网络连通性排查
- 进入Nginx容器,执行
curl http://django:8000,测试是否能直接访问Django服务。如果不通,检查Docker网络配置:- 确认Nginx和Django服务是否在同一个Docker网络中(默认bridge或自定义网络)
- 检查Django服务的容器是否正常启动,端口
8000是否正确暴露
- 宿主机执行
curl localhost:80(或映射的端口),看是否能收到Nginx的响应,排查端口映射是否正确
Nginx配置与日志检查
- 检查Nginx配置合法性:执行
nginx -t验证语法,执行nginx -s reload确保配置已生效 - 查看Nginx日志定位问题:
- 执行
cat /var/log/nginx/nginx.django.access.log,确认请求是否到达Nginx,查看返回状态码(如404、502等) - 执行
cat /var/log/nginx/nginx.django.error.log,查找SSL证书错误、上游连接失败等报错
- 执行
- 检查SSL证书有效性:确认
/etc/nginx/certs/elitecars_cert.pem和/etc/nginx/certs/elitecars_privkey.pem在容器中存在,权限设置为Nginx进程可读(如chmod 644证书文件)
Django服务配置检查
- 确认Django的
ALLOWED_HOSTS设置包含nginx、0.0.0.0、localhost或实际访问域名,否则会返回400错误 - 检查Django监听地址:确保服务启动命令为
python manage.py runserver 0.0.0.0:8000,而非仅监听127.0.0.1 - 手动验证Django服务:进入Django容器,启动服务后执行
curl localhost:8000,确认服务本身可正常响应
浏览器端排查
- 打开浏览器开发者工具(F12),查看网络请求的状态码、响应内容,确认是连接超时、SSL错误还是HTTP错误
- 分别测试
http://localhost和https://localhost,排查HTTP与HTTPS服务是否正常 - 使用无痕模式或清除浏览器缓存测试,排除缓存干扰
内容的提问来源于stack exchange,提问作者Alberto Sanmartin Martinez
相关产品推荐
相关产品推荐

