使用Docker中NGINX Proxy Manager与NGINX部署静态站遇反向代理问题
排查NGINX Proxy Manager反向代理静态站点跳转默认页面问题
问题概述
在家庭实验室部署静态站点,使用CloudFlare托管域名,通过Docker运行NGINX Proxy Manager(NPM)和静态站NGINX容器,配置反向代理后始终跳转至NPM默认的"Congratulations"页面。已确认:
- 两个容器处于同一网络
- 宿主机IP+端口可正常访问静态站
- 可通过4081端口访问NPM管理面板
- CloudFlare SSL配置完成
现有配置
NGINX Proxy Manager Docker Compose
version: '3.9' services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '4080:80' # Public HTTP Port - '40443:443' # Public HTTPS Port - '4081:81' # Admin Web Port volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt - /var/run/docker.sock:/var/run/docker.sock:ro
静态站NGINX Docker Compose
version: '1.0' services: nginx: restart: unless-stopped image: nginx:latest ports: - 4090:80 volumes: - /static-site/:/usr/share/nginx/html:ro - /var/run/docker.sock:/var/run/docker.sock:ro
排查步骤与解决方案
1. 修正代理主机的目标地址配置
NPM反向代理的目标地址需使用容器内部的服务名+端口,而非宿主机IP+映射端口:
- 进入NPM管理面板(4081端口),找到创建的代理主机
- 将「转发主机名/IP」改为静态站容器的服务名
nginx - 「转发端口」改为容器内部端口
80(不是宿主机的4090)
原因:同一Docker网络内,容器可通过服务名直接通信,使用宿主机端口会绕开内部网络,且可能因Host网络配置导致规则不匹配。
2. 确认Docker网络的一致性
若两个容器是分别启动的Compose项目,默认会生成各自独立的Docker网络,需手动指定同一自定义网络:
- 先创建自定义网络:
docker network create homelab-network - 修改两个Compose文件,添加网络配置:
NPM Compose新增:
networks: default: external: name: homelab-network静态站NGINX Compose新增:
networks: default: external: name: homelab-network - 重启两个容器,确保它们加入同一网络。
3. 验证NPM容器与静态站的连通性
进入NPM容器,测试是否能正常访问静态站:
# 进入NPM容器(替换为你的容器ID或名称) docker exec -it nginx-proxy-manager-app-1 /bin/bash # 测试ping静态站服务名,确认网络连通 ping nginx # 测试获取静态站内容,确认服务正常 curl http://nginx:80
如果curl能返回静态站的HTML内容,说明网络和静态站服务正常;若失败,需检查网络配置或静态站容器状态。
4. 检查代理规则的匹配条件
NPM的默认页面仅在无匹配代理规则时触发,需确保:
- 代理主机配置的域名与CloudFlare解析的域名完全一致(包括子域名)
- 访问时使用配置的域名(如
https://your-domain.com),而非直接访问宿主机IP+4080端口(此时Host头不匹配,NPM无法找到对应规则) - 关闭或删除可能冲突的泛域名代理规则(如
*.your-domain.com)
5. 检查SSL与强制跳转配置
在NPM代理主机的SSL配置中:
- 选择正确的SSL证书(CloudFlare证书或NPM自动生成的Let's Encrypt证书)
- 开启「Force SSL」,确保HTTP请求自动跳转至HTTPS
- 开启「HTTP/2 Support」(可选,但能优化访问体验)
内容的提问来源于stack exchange,提问作者wutang
相关产品推荐
相关产品推荐

