必须重新核对80和443端口,确保云安全组、宿主机防火墙及frankenphp监听地址(如0.0.0.0:80)三者一致;k8s中containerport须与service的targetport严格对齐,多站点应改用域名路由而非端口隔离。

容器迁移后 HTTP/HTTPS 入口端口必须重新核对
FrankenPHP 容器迁移到新主机后,80 和 443 端口不是“自动生效”的——即使 Docker 命令没变,也必须确认云厂商安全组、宿主机防火墙、以及 FrankenPHP 自身监听地址三者一致。
常见错误是:旧服务器上能访问 https://example.com,新服务器部署完却 404 或连接被拒绝。问题往往出在:
- 阿里云/腾讯云安全组没开放
443/tcp(Let's Encrypt ACME 验证失败就卡在这一步) - 宿主机 firewalld/ufw 拦截了入站流量(
sudo ufw status查一眼) - FrankenPHP 启动时仍监听
127.0.0.1:8080,而不是0.0.0.0:80(尤其在--network host模式下,漏掉-- -listen 0.0.0.0:80就等于对外不可见)
使用 host 网络时别误以为端口映射还起作用
--network host 模式下,-p 80:80 这类端口映射完全被忽略,Docker 会报 warning 并跳过。但很多人迁移时复制旧命令,既加了 --network host 又写 -p 8080:80,结果发现端口没暴露,反复排查半天。
正确做法只有两步:
- 启动命令里去掉所有
-p参数 - 确保
-- -listen 0.0.0.0:80(或:443)显式传入,且宿主机有权限绑定该端口(非 root 容器绑:80会失败)
Kubernetes 中 containerPort 和 Service targetPort 必须对齐
迁移到 K8s 时,containerPort 不是摆设,它和 Service 的 targetPort 是强绑定关系。如果只改了 Deployment 里的 containerPort: 8080,但 Service 里写的是 targetPort: 80,请求就进不了容器。
更隐蔽的坑是用字符串引用:targetPort: http 要求容器 ports[].name 必须为 http;若 Deployment 改了 name 却忘了同步 Service,K8s 不报错但流量静默丢弃。
建议统一用数字写死 targetPort: 80,避免 name 不一致导致的隐性故障。
多站点场景下别用端口隔离代替域名路由
迁移到新环境后,如果原来靠 :8081、:8082 区分多个站点,现在可以也应当切回标准端口 + Caddy 域名匹配。否则:
- Let's Encrypt 无法为
example.com在:8081上完成 HTTP-01 验证(ACME 默认只走80/443) - Caddyfile 里每个
server块必须显式写example.com,不能只靠端口判断;漏写www.example.com就会导致带 www 的请求 404 - 前端构建时硬编码的 API 地址(如
/api)会因端口变化而跨域失败,而域名方案天然规避这个问题
真正需要额外端口的,只有 worker 模式下的后台常驻进程(如 --addr :8081),这类端口不参与 Web 流量,也不需对外开放。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











