frankenphp单文件模式需在工作目录放caddyfile配置域名和https,server_name必须为公网可解析域名且80/443端口开放,caddy自动申请并续期let’s encrypt证书。

FrankenPHP单文件模式下怎么配域名和HTTPS
FrankenPHP 的独立二进制(frankenphp)本身不直接读取 Caddyfile,但会自动查找并加载当前工作目录下的 Caddyfile —— 这是启用 HTTPS 和绑定域名的唯一可靠入口。没这个文件,它就只跑 HTTP + localhost,默认不监听 443,也不申请证书。
Caddyfile 必须包含 SERVER_NAME 且不能是 localhost
FrankenPHP 的自动 HTTPS(ACME)只对公网可解析域名生效;localhost 或 127.0.0.1 不会触发 Let’s Encrypt 流程,而是 fallback 到本地自签名证书(仅限开发)。要让 HTTPS 真正生效并被浏览器信任,必须:
-
SERVER_NAME环境变量或Caddyfile中的域名块必须是真实、可 DNS 解析的域名(如example.com或app.example.com) - 该域名的 A/AAAA 记录需指向你运行
frankenphp的服务器 IP - 服务器 80 和 443 端口必须对外可达(防火墙、云厂商安全组都要放行)
- 不要在
Caddyfile里写localhost或127.0.0.1作为主域名块,否则 ACME 会静默失败
最小可用 Caddyfile 示例(带 HTTPS + 域名)
把以下内容保存为当前目录下的 Caddyfile,然后执行 ./frankenphp:
{
frankenphp {
num_threads auto
}
}
example.com {
php_server
encode zstd br
}
注意点:
- 第一行
example.com必须替换成你自己的域名,不能带https://或端口 - 不需要手动配置 TLS;Caddy 会在首次启动时自动向 Let’s Encrypt 申请证书,并写入
~/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/ - 如果想强制跳转 HTTP → HTTPS,加一行
redir https://{host}{uri} permanent在域名块内即可 - 证书续期完全自动,无需 cron 或额外脚本
常见失败现象和对应检查项
跑起来后访问 https://your-domain.com 显示连接被拒绝、证书无效或空白页?优先查这几项:
-
curl -v http://your-domain.com返回 502?→ 检查php_server是否在正确位置(必须在域名块内,不能放在全局块) - 浏览器提示“您的连接不是私密连接”,且地址栏显示
Not Secure?→ 域名未解析到本机,或 80 端口被拦截(ACME 需要 80 端口验证) -
./frankenphp启动后立刻退出?→Caddyfile语法错误,用caddy validate(需单独安装 Caddy)提前检查 - 日志里出现
failed to obtain certificate?→ 确认SERVER_NAME环境变量没覆盖Caddyfile中的域名(二者冲突时以环境变量为准,但环境变量值若为localhost会禁用 ACME)
最易忽略的是:单二进制模式下,Caddyfile 必须存在且路径正确;它不像 Docker 镜像那样内置默认配置,少一个文件,HTTPS 就不会启动。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











