Nginx Proxy Manager子域名代理问题:端口限制与HTTPS 403错误排查求助
Nginx Proxy Manager子域名代理问题:端口限制与HTTPS 403错误排查求助
看起来你已经搞定了DNS解析的问题,离成功只差一步了!咱们来逐个拆解你遇到的端口限制和403错误问题:
一、为什么只能用80端口?——先搞定NPM的端口映射
浏览器访问HTTP默认走80端口,HTTPS默认走443端口。你之前临时把NPM绑到80:80才生效,大概率是因为你没给NPM容器映射443端口!
检查Portainer里NPM的端口配置:
- 必须要有
443:443的映射(主机443端口对应容器内443),这是处理HTTPS请求的关键 - 保留
80:80映射,用来处理HTTP自动跳转到HTTPS(后续可以在NPM里开启强制HTTPS) - 管理端口
8185:8185保持不变就行
如果之前没开443端口,用户访问https://heimdall.myserver.lan时,请求根本打不到NPM容器上,自然就无法代理了。
二、HTTPS 403 Forbidden的排查方向
出现403通常是请求被Nginx或者后端Heimdall拒绝了,咱们一步步来:
1. 先检查Heimdall的Host头限制
Heimdall自身开启了HTTPS,可能会校验请求的Host头是否符合预期。默认情况下NPM转发请求时,Host头会是myserver.lan:8444,但Heimdall可能只认heimdall.myserver.lan。
解决方法:在NPM的Proxy Host配置里,找到「Custom Nginx Configuration」(自定义Nginx配置),添加一行:
proxy_set_header Host $host;
这样转发时会把用户请求的真实Host头(也就是heimdall.myserver.lan)传给Heimdall,让它认为这是合法请求。
2. 给子域名配置SSL证书
NPM作为HTTPS代理,必须持有heimdall.myserver.lan的SSL证书才能正常处理HTTPS请求:
- 进入NPM的Proxy Host设置,切换到「SSL」标签页
- 选择「Request a new SSL Certificate」,勾选「Force SSL」和「HTTP/2 Support」
- 确认域名填的是
heimdall.myserver.lan,点击Save等待证书申请完成(内网环境下只要DNS解析正常,Let's Encrypt就能申请成功,嫌麻烦也可以用自签名证书)
3. 修复Docker容器间的网络连通性
你提到NPM容器ping不通Heimdall的容器ID,这说明两个容器不在同一个Docker网络里,默认的bridge网络DNS解析不稳定。
建议这么做:
- 在Portainer里创建一个自定义Docker网络,比如叫
homelab-net - 把NPM和Heimdall容器都迁移到这个自定义网络里
- 之后在NPM的Proxy Host配置中,目标地址直接用Heimdall的容器名(比如
heimdall)加上端口8444,而不是myserver.lan:8444——自定义网络里容器名可以直接解析,比用主机IP/域名更稳定
三、额外的排查小技巧
- 查看NPM的错误日志:进入NPM容器,执行
cat /var/log/nginx/error.log,里面会有403错误的具体原因,比如是权限问题还是Host头不匹配 - 在NPM容器内测试连通性:用
curl -v https://heimdall容器名:8444(如果已经在同一网络),看能不能正常拿到Heimdall的响应,这能快速排除网络问题
按照这个步骤走,应该就能解决你的端口和403问题了!
备注:内容来源于stack exchange,提问作者kamikater




