Nginx Proxy Manager 反代 502 排查:Docker 网络、容器端口和上游地址

1. 问题现象

在 NAS、Linux 小主机或轻量服务器上部署 Nginx Proxy Manager 后,后台配置了 Proxy Host,域名也解析到了服务器,但访问服务时出现 502。

典型情况:

  • 后端服务在内网能打开。
  • Nginx Proxy Manager 页面正常。
  • 证书申请也正常。
  • 访问域名时返回 502 Bad Gateway。

这类问题优先排查上游地址、Docker 网络、端口层级和容器可达性。

2. 先确认后端服务可访问

先不要看反代配置,直接访问后端服务:

bash 复制代码
curl -I http://127.0.0.1:8096
curl -I http://192.168.1.20:8096

如果后端服务本身不通,先看后端容器:

bash 复制代码
docker compose ps
docker compose logs --tail=100 jellyfin

确认服务启动后,再排 Nginx Proxy Manager。

3. 进入 Nginx Proxy Manager 容器测试上游

宿主机能访问,不代表反代容器能访问。

进入容器:

bash 复制代码
docker exec -it nginx-proxy-manager sh

测试上游:

bash 复制代码
wget -S -O- http://192.168.1.20:8096
wget -S -O- http://jellyfin:8096

如果容器内访问失败,502 就不是前端问题,而是反代容器到后端服务之间不通。

4. Docker 网络是否一致

如果希望在 Nginx Proxy Manager 里填写容器名:

text 复制代码
jellyfin

那么 Nginx Proxy Manager 和 Jellyfin 必须在同一个 Docker network。

查看网络:

bash 复制代码
docker network ls
docker network inspect proxy

推荐创建一个公共反代网络:

bash 复制代码
docker network create proxy

Nginx Proxy Manager:

yaml 复制代码
services:
  npm:
    image: docker.1ms.run/jc21/nginx-proxy-manager:latest
    container_name: nginx-proxy-manager
    ports:
      - "80:80"
      - "443:443"
      - "81:81"
    networks:
      - proxy

networks:
  proxy:
    external: true

Jellyfin:

yaml 复制代码
services:
  jellyfin:
    image: docker.1ms.run/linuxserver/jellyfin:latest
    container_name: jellyfin
    ports:
      - "8096:8096"
    networks:
      - proxy

networks:
  proxy:
    external: true

这样 Nginx Proxy Manager 才能用 jellyfin:8096 访问后端。

5. 宿主机端口和容器端口不要混

如果后端服务端口映射是:

yaml 复制代码
ports:
  - "18096:8096"

那么有两个访问方式:

访问方式 地址
宿主机或局域网访问 http://NAS_IP:18096
同 Docker network 容器访问 http://jellyfin:8096

Nginx Proxy Manager 里不能随便混用。

如果填写 jellyfin,端口应该是容器端口 8096

如果填写 NAS IP,端口应该是宿主机映射端口 18096

6. 上游协议要匹配

很多服务内部是 HTTP,不是 HTTPS。

Nginx Proxy Manager 里常见配置:

text 复制代码
Scheme: http
Forward Hostname / IP: jellyfin
Forward Port: 8096

如果后端服务本身没有启 HTTPS,却把 Scheme 填成 https,也可能出现异常。

一般建议:公网入口用 HTTPS,反代到内网服务用 HTTP。

7. 镜像拉取失败也会伪装成 502

如果你刚升级后端服务,先确认镜像和容器状态:

bash 复制代码
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100

如果镜像拉取慢或失败,后端服务可能没有完成更新。可以先把镜像拉取链路单独验证,避免把部署失败误判成反代问题。

8. 排查命令汇总

bash 复制代码
# 后端是否运行
docker compose ps
docker compose logs --tail=100 jellyfin

# 宿主机访问
curl -I http://192.168.1.20:8096

# 反代容器访问
docker exec -it nginx-proxy-manager sh
wget -S -O- http://jellyfin:8096
wget -S -O- http://192.168.1.20:8096

# Docker 网络
docker network ls
docker network inspect proxy

9. 总结

Nginx Proxy Manager 502 通常不是证书问题,而是反代容器访问不到上游。

排查顺序建议:

  1. 后端服务是否启动。
  2. 宿主机能否访问后端。
  3. 反代容器能否访问后端。
  4. Docker network 是否一致。
  5. 宿主机端口和容器端口是否混用。
  6. Scheme 是否填错。
  7. 镜像更新是否真的完成。

按这个顺序查,基本能把 502 从"玄学问题"拆成具体配置问题。

相关推荐
Patrick_Wilson7 小时前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy17 小时前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭17 小时前
运行你的第一个Docker容器
后端·docker·容器
宋均浩2 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
Avan_菜菜2 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
程序员老赵2 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua1113 天前
LM Studio Docker 部署——本地大模型一键启动
docker
曲幽4 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
武子康5 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
ping某6 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx