必须显式映射443端口:docker run -p 443:443 -p 80:80 ...,否则https不可用;还需放行防火墙及云安全组的80/443 tcp端口,并持久化/data卷以保存证书。

docker run 时必须显式映射 443 端口
FrankenPHP 容器默认监听 :443(当 SERVER_NAME 是域名且未设为 :80 时),但 Docker 不会自动暴露端口。光靠 ENV SERVER_NAME=example.com 不足以让 HTTPS 可访问,宿主机必须把 443 映射进来。
正确写法是:docker run -p 443:443 -p 80:80 ... dunglas/frankenphp
-
-p 443:443是 HTTPS 流量入口,缺了就无法建立 TLS 连接 -
-p 80:80建议同时加上——用于 HTTP 跳转、ACME 挑战响应(Let’s Encrypt 验证必需) - 若只映射
80:80却没开443:443,浏览器访问https://会直接报ERR_CONNECTION_REFUSED - UDP 端口也要映射才能启用 HTTP/3:
-p 443:443/udp
Caddy 自动 HTTPS 需要 443 TCP + 80 TCP 双端口开放
FrankenPHP 内置 Caddy 默认启用自动 HTTPS(ACME),它依赖两个端口协同工作:
- 80 端口:接收 Let’s Encrypt 的 HTTP-01 挑战请求(
/.well-known/acme-challenge/...) - 443 端口:提供最终的 TLS 服务,且必须由 Caddy 主动监听并加载证书
- 如果防火墙或云服务器安全组没放行 80 和 443(TCP),Caddy 日志会反复报错
acme: error: 400 :: POST :: https://acme-v02.api.letsencrypt.org/acme/authz-v3/... :: urn:ietf:params:acme:error:connection - 阿里云/腾讯云等平台需在安全组中单独添加这两条入方向规则,仅开放 TCP 协议
证书挂载后 Caddy 才能绑定 443
即使端口映射和防火墙都对了,Caddy 仍可能拒绝监听 :443——原因通常是证书不可用。FrankenPHP 不自带证书,它依赖 Caddy 在运行时自动申请或读取已挂载的证书。
- 首次启动时,Caddy 会尝试向 Let’s Encrypt 申请证书,前提是:域名 DNS 解析正常 + 80/443 可达 +
SERVER_NAME是有效域名(如example.com,不能是localhost或127.0.0.1) - 若想跳过 ACME、用已有证书,需挂载
fullchain.pem和privkey.pem到容器内,并在 Caddyfile 中显式声明:https://example.com { tls /path/to/fullchain.pem /path/to/privkey.pem } - 证书路径必须是容器内路径,且文件权限需为
600(否则 Caddy 拒绝加载) - 常见错误:
caddy http app: listening on :443: listen tcp :443: bind: permission denied—— 这通常是因为容器没以 root 启动,或宿主机 443 被占用(非容器场景)
本地开发别硬绑 443,改用 4433 更安全
在 localhost 环境下直接监听 :443 很容易失败:Linux/macOS 要求 root 权限,Windows 可能被 IIS 或其他服务占位。这不是 FrankenPHP 的问题,而是系统级限制。
- 开发时推荐改用非特权端口,比如
docker run -p 4433:4433 ... -e SERVER_NAME=localhost:4433,再配 Caddyfile:https://localhost:4433 { tls internal } -
tls internal启用 Caddy 自签名证书,适合本地调试,浏览器会提示不安全,但可手动信任 - 不要写
SERVER_NAME=localhost:4433并指望自动 HTTPS 生效——Caddy 不识别带端口的主机名格式,会 fallback 到默认行为,导致 HTTPS 不触发 - 真正要跑通本地 HTTPS,关键是 Caddyfile 配置 + 端口映射一致,而不是死磕
:443
/data 下,如果每次重启容器都丢掉这个目录,就会无限重试 ACME,触发 Let’s Encrypt 的速率限制。务必用 named volume 挂载 caddy_data,哪怕只是本地测试。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











