容器里跑建站程序时,程序端口和网关端口怎么对上
容器里跑建站程序时,程序端口和网关端口对不上,多数情况不是哪一层写错了,而是三层被当成了一层。AnQiCMS 的镜像是 anqicms/anqicms,默认监听 8001 端口,部署方式里同时提供 Docker 镜像与宝塔面板、aaPanel 一键部署,这两条路径下的端口关系是一样的:程序监听端口、容器映射端口、网关对外端口,三层各自有含义。
三层端口分别指什么
第一层在容器内部,是程序自己 bind 的地址,也就是配置里的监听端口。这一层只关心进程能不能起来,与外界用什么端口无关。
第二层是容器运行时的映射,把宿主上的某个端口接到容器内的监听端口。写映射时两侧都要看清,混淆「宿主侧」与「容器侧」的顺序是最常见的错法。
第三层是网关对外,也就是访客实际访问的端口,通常是网页服务的 80 与 443,由反向代理接住再转给宿主端口。
| 层 | 配置位置 | 典型取值 | 写错时的表现 |
|---|---|---|---|
| 程序监听 | 应用运行配置 | 8001 | 容器起来但连不上,健康检查失败 |
| 容器映射 | 运行参数或编排文件 | 宿主端口指向容器 8001 | 换个端口才通,或访问返回拒绝连接 |
| 网关转发 | 代理站点配置 | 80、443 转发到宿主端口 | 直连能通、走域名不通 |
| 对外地址 | 站点地址与重定向表 | 域名与协议 | 跳转后落到带端口的内网地址 |
映射写错的典型表现
三种现象能定位到不同层。用 IP 加端口直连正常、走域名异常,问题在网关转发;直连也异常,先看容器映射;连映射都对但页面打不开,回到程序监听端口与容器日志。
还有一类更隐蔽:页面能开,但样式与接口请求 404。这通常是路径转发或伪静态规则没接上——代理只转了首页路径,静态资源与改写后的地址没按同一套规则处理。核对时要看代理实际转发的路径,而不是浏览器地址栏的写法。
反向代理要补的请求头
代理之后,程序看到的请求来自转发方,不是真实访客。要让应用正确生成绝对地址、判断协议与记录来源,转发时需要把协议、主机名与访客地址一并传过去,并在应用侧配置为可信代理,避免直接采信可被伪造的头值。
协议头传不到应用侧,会造成两个典型后果:一是 https 访问被判成明文,生成的一串地址回落到错误协议,出现混合内容告警;二是重定向跟着错误的Host 走,用户被跳到带端口的内部地址。301 重定向表也要按同一套对外地址写,否则新旧地址在两套语义间来回弹。
部署后要核的四项
先核对外访问:域名、证书、默认页与一个内页,确认状态码与内容都符合预期。再核后台入口与登录回跳,确认跳转后的地址仍是对外地址。三核数据落盘位置:容器重建是否丢数据,静态文件与附件目录是否挂在持久卷上。四核备份:AnQiCMS 支持数据与静态文件的备份和恢复,容器环境的备份要把数据库文件、上传目录与运行配置一起纳入,只留镜像不够,因为镜像里没有你后来的改动。
常见问题
能不能把程序监听端口直接改成 80? 容器内改端口只是把错放到下一层,外部仍由网关终止 80;程序端口保持默认,映射与转发对准它更清晰。
多站点共用一套容器时端口怎么分? 程序侧仍是一个监听端口,多站点靠域名与站点配置区分,由网关按主机名转发,不需要为每个站点开一个端口。
换了宿主机端口要改哪些地方? 改映射与网关转发两处即可,应用配置里的监听端口保持不变;随后检查对外地址与站点地图里是否残留旧端口写法。