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

使用Nginx代理+子域名部署多Django应用遇502错误求排查

排查jwilder/nginx-proxy代理Django子域名返回502 Bad Gateway问题

已通过Docker搭建jwilder/nginx-proxy代理容器,SSL证书生成正常、代理本身可运行,但子域名指向Django应用时所有请求返回502 Bad Gateway,以下是核心排查点和修复步骤:


核心问题分析

1. Django应用容器(bak_web)未提供服务端口

bak_web容器配置了expose: - "80"但未指定启动命令,导致容器启动后没有在80端口运行Django服务(如uWSGI/Gunicorn),下游nginx无法连接,触发502。

2. nginx-bak-web的local.conf配置存在多处错误

  • uwsgi_pass指向无效上游:配置中uwsgi_pass uwsgi://webapp.docker.localhost;的目标服务不存在,且与定义的upstream bakzion.duckdns.org不匹配。
  • 混用uwsgi与proxy配置:同时存在uwsgi_pass和proxy_set_header,两类配置逻辑冲突,只能二选一。
  • 多余配置引入冲突:include /etc/nginx/vhost.d/default_location;是jwilder/nginx-proxy的专属配置,独立nginx容器无需引入,会导致配置异常。

3. Docker网络隔离导致连通失败

nginx-proxy与Django应用的Docker Compose默认属于不同网络,proxy无法访问到Django侧的nginx-bak-web容器,引发502。


修复步骤

步骤1:为bak_web添加服务启动命令

根据你使用的服务类型修改Django应用的docker-compose.yml:

  • 若用uWSGI:
bak_web:
  build:
    context: .
  expose:
    - "80"
  env_file: .env
  container_name: "bak-web"
  volumes:
    - static:/bak_web/static
    - .:/bak_web
    - ./bak_chatbot:/app
  # 添加uWSGI启动命令,监听80端口
  command: uwsgi --http 0.0.0.0:80 --module bak_web.wsgi:application
  • 若用Gunicorn:
command: gunicorn bak_web.wsgi:application --bind 0.0.0.0:80

步骤2:修正local.conf配置

方案A(uWSGI连接):

server {
    listen 80;
    server_name bakzion.duckdns.org;

    location /static/ {
        alias /bak_web/static/;
    }

    location / {
        include uwsgi_params;
        uwsgi_pass bak_web:80;
        uwsgi_read_timeout 180;
    }
}

方案B(反向代理Gunicorn/runserver):

server {
    listen 80;
    server_name bakzion.duckdns.org;

    location /static/ {
        alias /bak_web/static/;
    }

    location / {
        proxy_pass http://bak_web:80;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_read_timeout 180;
    }
}

步骤3:统一Docker网络

在nginx-proxy的docker-compose.yml中添加自定义网络:

version: '3'

networks:
  proxy-network:
    driver: bridge

services:
  nginx-proxy:
    # 原有配置不变
    networks:
      - proxy-network
  letsencrypt:
    # 原有配置不变
    networks:
      - proxy-network
  www:
    # 原有配置不变
    networks:
      - proxy-network

volumes: 
  certs:
  html:
  vhostd:

在Django应用的docker-compose.yml中加入该外部网络,并删除无效的.:卷配置:

version: "3"

networks:
  proxy-network:
    external: true

services:
  core_api:
    # 原有配置不变
    networks:
      - proxy-network
  bak_web:
    # 原有配置不变
    networks:
      - proxy-network
  nginx-bak-web:
    # 原有配置不变
    networks:
      - proxy-network

volumes:
  static:

步骤4:验证修复结果

  1. 重启所有容器:
# 重启nginx-proxy集群
docker-compose down && docker-compose up -d
# 重启Django应用集群
docker-compose down && docker-compose up -d
  1. 查看容器日志排查异常:
# 查看bak_web服务日志
docker logs bak-web
# 查看nginx-bak-web日志
docker logs nginx-bak-web
# 查看nginx-proxy日志,确认是否识别到子域名配置
docker logs nginx-proxy

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:35:17