FrankenPHP的frankenphp run启动时仍监听443端口,是因为Caddyfile中含域名(如example.com)会默认启用automatic_https特性,自动监听:443并尝试申请证书;彻底禁用需改server块为纯端口监听(如:80 { })、添加automatic_https off、删tls/redir配置,并检查frankenphp.yaml、环境变量及Docker映射。

frankenphp run 启动时为什么还会碰443端口
因为 frankenphp run 默认加载 Caddyfile,而只要 Caddyfile 里出现域名(比如 example.com 或 localhost),Caddy 就会自动启用 automatic_https 特性——它会悄悄监听 :443、尝试申请证书、甚至重定向 HTTP 请求。哪怕你没写 tls,也没配 https://,它照样要抢 443。
Caddyfile 中彻底禁用 HTTPS 监听的写法
关键不是“关 HTTPS”,而是让 Caddy 根本不走 HTTPS 路径:
- 把 server 块监听目标从域名改成纯端口,例如写成
:80 { },而不是example.com { }或localhost { } - 删掉或注释掉所有
tls指令、redir到 https 的行、https://开头的reverse_proxy - 显式禁用全局自动 HTTPS:在 Caddyfile 顶部加一行
automatic_https off(Caddy 2.8+ 默认是on) - 确保没有其他配置(如
import引入的片段)偷偷启用了 TLS
启动时仍报“address already in use:443”怎么办
说明还有别的配置在暗中触发 443 监听。常见漏点:
-
frankenphp.yaml里写了server.address: ":443"—— 改成":80"或"127.0.0.1:8080" - 环境变量
FRANKENPHP_SERVER_ADDRESS覆盖了配置,检查是否设成了:443 - 用了
frankenphp serve命令但没指定--addr,它默认用:80和:443双端口;应明确写成frankenphp serve --addr :8080 - Docker 运行时,
-p 443:443映射还在,即使应用不监听,宿主机端口仍被占用;删掉该映射
验证是否真没碰 443 的最简方法
启动后立刻执行:
立即学习“PHP免费学习笔记(深入)”;
netstat -tuln | grep ':443'
如果无输出,再检查 Caddy 日志里有没有类似 listening on :443 或 automatic_https: enabling 的行。只要日志里没提 443,且 netstat 看不到,就说明干净了——这时候哪怕你本地开了 Nginx 占着 443,FrankenPHP 也完全不受影响。
真正容易被忽略的是 automatic_https on 这个默认行为,它不声不响就把 443 加进监听列表,连 Caddyfile 里什么都没写也会触发。



















