frankenphp 默认监听端口由 server_name 环境变量决定,而非配置文件或启动参数;设为 :8080 则监听 :8080,需同步用 -p 8080:8080 映射,且非 root 用户须避开 1–1023 端口。

FrankenPHP 安装后修改默认监听端口,关键不是改配置文件或加启动参数,而是通过 SERVER_NAME 环境变量控制——它直接决定容器内 Caddy 的监听地址,且优先级高于 frankenphp.toml、Caddyfile 甚至命令行 --listen。
SERVER_NAME 是核心开关
SERVER_NAME 不是“设置端口”的辅助选项,而是 FrankenPHP 内置服务行为的总开关:
-
SERVER_NAME=:8080→ 容器内监听:8080(纯 HTTP,不启用 HTTPS) -
SERVER_NAME=:80→ 监听:80,但需宿主机有权限(非 root 用户会失败) -
SERVER_NAME=localhost或example.com→ 触发 HTTPS 自动流程,默认监听:80和:443,不适合仅调端口需求 - 值中不能含协议、路径或端口混写(如
http://localhost:8080或localhost:8080都无效)
必须同步配置 Docker 端口映射
光设 SERVER_NAME=:8080 不够,Docker 默认不暴露任何端口。必须用 -p 显式映射,且左右端口数字要一致:
- 正确:
docker run -e SERVER_NAME=:8080 -p 8080:8080 dunglas/frankenphp - 错误:
SERVER_NAME=:8080却只写-p 8080:80→ 容器没监听:80,请求进不去 - 错误:
SERVER_NAME=:80却用-p 8080:8080→ 容器监听的是:80,映射:8080白搭
想用非默认端口(比如 :3000)?照这个逻辑来
- 启动命令:
docker run -e SERVER_NAME=:3000 -p 3000:3000 dunglas/frankenphp - 如果镜像以非 root 用户运行(如
www-data),:3000可用;:80会报bind: permission denied,必须避开 1–1023 端口
验证是否真在监听,别只看日志
容器日志显示 Starting on http://localhost:8080 不代表成功。进容器执行:
-
ss -tln | grep ':8080'→ 看是否有0.0.0.0:8080(不是127.0.0.1:8080) - 宿主机执行
curl -v http://localhost:8080/health→ 返回200才算真正就绪
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











