frankenphp容器健康检查必须访问其实际监听的http端口(默认8080),因它默认绑定127.0.0.1:8080且不自动降级,需确保监听0.0.0.0:8080并正确映射端口,否则curl localhost:8080将超时或失败。

容器健康检查该访问哪个端口?
FrankenPHP 容器的健康检查必须访问它实际监听的 HTTP 端口,而不是 80 或 443 这类“常识性端口”——因为 FrankenPHP 默认监听 :8080(非 root 用户权限下),且不自动降级或 fallback。
为什么不能直接 curl http://localhost:80?
常见错误是假设容器像 Nginx 那样默认占 80 端口。但 docker run dunglas/frankenphp 启动后,进程只监听容器内 127.0.0.1:8080;若没加 -p 8080:8080 映射,宿主机连 curl localhost:8080 都会失败。
- 容器内服务未绑定
0.0.0.0:8080(而是127.0.0.1:8080)→ 外部健康探测收不到响应 - docker run 没写
-p映射 → 端口根本不可达,curl超时或 connection refused - 用了
frankenphp php-server命令 → 它不读 Caddyfile,也不支持 HTTPS/HTTP/2,仅提供最简 HTTP 服务,健康检查只能走 HTTP
健康检查命令怎么写才可靠?
用 curl -f http://localhost:8080 是最轻量、最通用的方式,前提是容器已正确暴露端口并监听 0.0.0.0:8080。若你改了监听地址或端口,健康检查必须同步更新。
- Docker CLI 启动时显式指定:
docker run -p 8080:8080 --health-cmd "curl -f http://localhost:8080 || exit 1" --health-interval=30s dunglas/frankenphp - Docker Compose 中写成:
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080"] interval: 30s timeout: 5s retries: 3
- 别用
https://做健康检查——除非你明确配置了 TLS 证书路径并监听 HTTPS 端口(如:4433),否则curl -k https://...会因证书不可信或端口未开而失败 - 避免依赖
/healthz这类自定义路径——FrankenPHP 默认不提供,需自己在index.php或中间件里实现
容易被忽略的底层细节
健康检查失败往往不是逻辑问题,而是网络层没对齐:Docker 的 --health-cmd 是在容器命名空间内执行的,localhost 指向的是容器自身,所以必须确保 FrankenPHP 进程监听的是 0.0.0.0:8080,而非 127.0.0.1:8080 —— 后者会让健康检查始终超时,且无日志提示。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











