FrankenPHP 自动续期证书省去了手动申请、certbot定时任务、Nginx重载、SSL配置20行、证书路径权限管理、HTTP/3与OCSP手工配置等全部运维操作。

FrankenPHP 自动续期证书到底省了哪些配置
FrankenPHP 内置 Caddy,而 Caddy 默认启用 Let’s Encrypt 自动 HTTPS,只要域名解析正确、80/443 端口可达,caddy run 或 frankenphp php-server 启动后几秒内就能拿到有效证书——完全不用手动申请、不用写 certbot 定时任务、也不用 reload 服务。
对比 Nginx + PHP-FPM 方案,你得同时维护:
- Nginx 的
ssl_certificate和ssl_certificate_key路径指向 - 单独部署
certbot并配置systemd timer或cron每两个月续一次 - 续期成功后必须触发
nginx -s reload,否则新证书不生效 - 还要处理 DNS-01 验证失败、rate limit 被封、acme.sh 与 certbot 冲突等边缘问题
Caddyfile 里一行就搞定 HTTPS,Nginx 需要至少 20 行
FrankenPHP 的 Caddyfile 示例(仅需三行):
example.com
php_server
tls admin@example.com
这行 tls admin@example.com 就完成了:自动注册账户、申请证书、HTTP-01 验证、存储到 /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/、自动续期、热加载。Nginx 则要手写完整的 server 块,包括 listen 443 ssl、ssl_protocols、ssl_ciphers、ssl_trusted_certificate、OCSP stapling 开关……漏一项都可能被安全扫描标红。
立即学习“PHP免费学习笔记(深入)”;
证书路径不可写?FrankenPHP 不会崩,Nginx 会直接启动失败
FrankenPHP 把证书存放在 Caddy 默认数据目录(如 /var/lib/caddy),只要进程有写权限,它自己建目录、设权限、降权运行;而 Nginx 对 ssl_certificate 路径是硬依赖:如果文件不存在、路径没读权限、甚至父目录属主不对,nginx -t 就报错,systemctl start nginx 直接退出。
常见翻车点:
-
certbot生成的证书属主是root,但 Nginx worker 是www-data,忘了chown就 502 - 用
acme.sh放在/root/.acme.sh/下,Nginx 配置却硬写绝对路径,一重启就找不到 - 容器里挂载证书卷时没加
:Z(SELinux)或:ro权限错乱,Nginx 拒绝启动
HTTP/3 和 OCSP stapling 是开箱即用,不是“再配一个模块”
FrankenPHP(即 Caddy)默认开启 HTTP/3(基于 QUIC)、自动启用 OCSP stapling、支持 ECH(Encrypted Client Hello),这些在 Nginx 里要么需要编译定制版(如 nginx-quic),要么得额外装 ngx_http_ssl_module 并手工配 ssl_stapling、ssl_stapling_verify、resolver——稍有不慎 stapling 就失效,浏览器控制台报 ERR_SSL_OCSP_RESPONSE_EXPIRED。
更实际的影响是:FrankenPHP 的证书生命周期完全脱离人工干预,只要域名活着、端口通着,证书就一直有效;而 Nginx 方案里,哪怕只漏掉一次 certbot renew --quiet --post-hook "systemctl reload nginx",60 天后整个站就变红色警告页。
真正省事的不是“少敲几行命令”,而是把证书这件事从运维 checklist 里彻底划掉——它不再是个需要人盯、需要加监控、需要写 SOP 的独立事项。



















