升级jwilder/nginx-proxy至更高版本后出现502错误求助
jwilder/nginx-proxy升级后502错误的原因与修复
版本核心变更(0.8.0 → 1.4.0)
- 废弃
VIRTUAL_NETWORK变量:旧版本依赖该变量指定外部网络定位后端服务,1.0+版本后不再支持,默认通过容器共享的网络直接访问后端。 - Docker socket路径默认修改:新版本默认监听
/var/run/docker.sock,旧配置里的/tmp/docker.sock挂载路径不再适配,会导致服务发现失败。 - 证书加载逻辑更严格:对证书权限、路径的校验更规范,需确保挂载的证书文件可读且路径正确。
修复步骤
1. 删除废弃的VIRTUAL_NETWORK环境变量
后端服务nginx-test中的VIRTUAL_NETWORK=nginx-proxy已失效,直接删除该变量,新版本会自动通过共享的proxy-tier网络识别后端服务。
2. 修正Docker socket挂载路径
将nginx-proxy容器的socket挂载改为:
- /var/run/docker.sock:/var/run/docker.sock:ro
这是导致502的关键原因之一,新版本不再默认读取/tmp/docker.sock,路径不匹配会导致无法发现后端容器。
3. 验证后端服务连通性
确认后端容器在80端口正常提供服务,且与proxy容器在同一网络:
# 测试容器间ping连通 docker exec -it mynginx ping test # 测试端口访问 docker exec -it mynginx curl http://test:80
如果连通失败,检查proxy-tier网络是否存在,容器是否正确加入该网络。
4. 确认证书挂载有效性
确保证书文件存在且权限为只读(ro),路径/etc/nginx/certs/mydomain.ch.crt和/etc/nginx/certs/mydomain.ch.key符合新版本要求。
修复后的完整配置
version: "3.7" networks: proxy-tier: external: name: nginx-proxy services: nginx-test: image: rocker/shiny-verse:4.2.1 container_name: test networks: - proxy-tier environment: - "VIRTUAL_PORT=80" - "VIRTUAL_HOST=http.mydomain.ch" restart: always nginx: image: jwilder/nginx-proxy:1.4.0 container_name: mynginx ports: - 80:80 - 443:443 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ../geoCertbot/certs/live/mydomain.ch/fullchain.pem:/etc/nginx/certs/mydomain.ch.crt:ro - ../geoCertbot/certs/live/mydomain.ch/privkey.pem:/etc/nginx/certs/mydomain.ch.key:ro networks: - proxy-tier restart: always deploy: mode: replicated replicas: 1 placement: constraints: [node.labels.servertype == web]
最后验证
- 重启所有容器使配置生效:
docker-compose down && docker-compose up -d
- 查看proxy容器日志排查异常:
docker logs mynginx
内容的提问来源于stack exchange,提问作者user670186
相关产品推荐
相关产品推荐

