使用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:验证修复结果
- 重启所有容器:
# 重启nginx-proxy集群 docker-compose down && docker-compose up -d # 重启Django应用集群 docker-compose down && docker-compose up -d
- 查看容器日志排查异常:
# 查看bak_web服务日志 docker logs bak-web # 查看nginx-bak-web日志 docker logs nginx-bak-web # 查看nginx-proxy日志,确认是否识别到子域名配置 docker logs nginx-proxy
内容的提问来源于stack exchange,提问作者Omar Cravioto
相关产品推荐
相关产品推荐

