frankenphp生产环境必须开放80/tcp、443/tcp和443/udp三个端口:80用于http重定向和acme挑战,443/tcp承载https流量,443/udp是http/3(quic)必需的独立udp端口,缺一不可。

云服务器必须开放的 FrankenPHP 基础端口
FrankenPHP 默认依赖 Caddy 提供 HTTP/HTTPS/HTTP/3 服务,因此云服务器安全组(或防火墙)必须显式放行以下三个端口,缺一不可:
-
80/tcp:用于 HTTP 重定向、ACME HTTP-01 挑战(Let’s Encrypt 证书申请必需) -
443/tcp:HTTPS 流量主端口,所有加密请求走这里 -
443/udp:HTTP/3(QUIC)必需的 UDP 端口,仅开放 TCP 的 443 不会启用 HTTP/3
注意:443/udp 是独立协议类型,不能用 “TCP 443” 规则替代;部分云平台(如腾讯云、阿里云)在安全组配置中需单独添加 UDP 协议条目,且协议字段必须选 UDP,端口填 443。
开发调试阶段可能额外需要的端口
如果你在云服务器上运行 FrankenPHP 的开发模式(比如本地访问 https://your-domain.com 但域名尚未解析或只用 https://localhost),Caddy 会自动为 localhost 签发自签名证书 —— 此时仍需开放 80 和 443,但无需 DNS 配置。不过,若你启用了 Caddy Dashboard(默认关闭),它监听 2019/tcp,需手动放行才能访问 https://your-server-ip:2019 管理界面。
- 仅当明确启用 dashboard 时才需开放
2019/tcp - FrankenPHP 自身不监听其他管理端口,
php_server指令完全由 Caddy 内部处理,不暴露额外端口 - 不要开放
7000、9000等常见调试端口 —— 这些和 FrankenPHP 无关,属于 FRP 或 Xdebug 场景
常见错误:端口开了但 HTTPS 仍失败
典型现象是浏览器提示“连接被拒绝”或 curl 返回 curl: (7) Failed to connect,即使 ufw status 显示已允许 443。根本原因往往是:
- 云平台安全组未同步更新(比系统防火墙优先级更高),只改了
ufw但忘了在控制台开安全组 -
443/udp被忽略,导致 HTTP/3 握手失败,部分客户端(如 Chrome)会降级失败 - Caddy 尝试绑定
:443时被占用(比如 nginx 已在运行),FrankenPHP 启动日志里会出现listen tcp :443: bind: address already in use
验证方式:登录服务器执行 sudo ss -tuln | grep ':443',确认输出中同时包含 tcp 和 udp 的 :443 条目。
生产环境建议的最小端口集
上线后应严格遵循最小权限原则,禁止开放任何非必要端口。除上述三项外:
- 不要开放
22给全网(应限制来源 IP) - 不要开放
8000、8080等调试端口给公网 - FrankenPHP 不依赖数据库端口(如
3306、1433),这些属于应用层连接,由 PHP 进程主动 outbound,只需确保目标数据库服务端开放对应端口即可
真正容易被忽略的是 UDP 443 —— 它不像 TCP 端口那样能用 telnet 测试,必须用 nc -u your-ip 443 或抓包确认,否则 HTTP/3 会静默失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











