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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:45:27