You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动