frankenphp启动报443冲突,说明其内置caddy因server_name含域名、证书存在或配置启用https而强制监听:443及:443/udp,与--addr参数无关;需设https_port=0、禁用automatic_https、删除certs/目录并移除udp端口映射来彻底禁用。

frankenphp 启动报 443 冲突但没改过 HTTPS 配置?
这说明 FrankenPHP 实际尝试监听了 :443,哪怕你只改了 HTTP 端口。根本原因是它内置的 Caddy 默认启用 HTTPS + HTTP/3,且当 SERVER_NAME 或配置中未显式禁用 TLS 时,会自动 fallback 到 :443 绑定——哪怕你只跑了 frankenphp serve --addr :8080。
为什么 --addr :8080 还会去占 443?
Caddy 的行为不完全受 --addr 控制;它还会根据以下条件主动监听 :443:
-
SERVER_NAME环境变量含域名(如example.com或localhost),且未设HTTP_PORT/HTTPS_PORT -
frankenphp.yaml或frankenphp.toml中启用了https相关字段(如tls、automatic_https) - 项目里存在
certs/目录或有效的本地证书(Caddy 会自动加载并启用 HTTPS)
此时即使 --addr :8080 成功绑定,Caddy 仍会单独尝试 bind :443(TCP)和 :443/udp(QUIC),任一失败即报 “address already in use”。
怎么确认是不是 Caddy 在抢 443?
别只看控制台错误,查 error.log(通常在 var/log/error.log 或项目根目录)末尾几行,找这类线索:
failed to listen on [::]:443: address already in use failed to listen on :443/udp: address already in use http: TLS handshake error from 127.0.0.1:...: no certificate for ...
如果看到 :443 或 :443/udp,就是 Caddy 在试图启动 HTTPS —— 和你配的 --addr 无关。
彻底禁用 443 监听的实操方式
必须从 Caddy 层面切断 HTTPS 自动启用逻辑:
- 启动时加环境变量:
SERVICE_NAME=:8080 HTTP_PORT=8080 HTTPS_PORT=0 frankenphp serve --addr :8080(HTTPS_PORT=0是关键) - 用
frankenphp.yaml显式关闭:server: { addr: ":8080", https: false } - Docker 场景下,确保没传
-e SERVER_NAME=localhost或类似值;若必须用域名,加-e HTTPS_PORT=0 - 删掉项目下的
certs/目录和.caddy/(避免 Caddy 自动签发并启用 TLS)
改完后,netstat -ano | findstr :443 应无输出,且 error.log 不再出现 443 绑定失败记录。
容易被忽略的 UDP 443 干扰
即使你禁用了 HTTPS,Docker 启动时若带了 -p 443:443/udp,而宿主机上已有服务(如 IIS、Skype)占着 UDP 443,FrankenPHP 启动时仍会因无法 bind :443/udp 报错——错误信息和 TCP 冲突一模一样,但根源是 UDP 层被拦。验证方法:netstat -ano -p UDP | findstr :443。解决:要么停掉占用 UDP 443 的进程,要么删掉 Docker 的 /udp 映射(前提是不需要 HTTP/3)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











