Caddy续期失败不会导致服务中断,但HTTPS会失效:浏览器显示“不安全”警告,NET::ERR_CERT_EXPIRED错误,API和移动端可能拒绝连接;HTTP仍可访问(若未强制跳转),OCSP缓存或临时可用但不可依赖。

不会直接断,但 HTTPS 会失效,浏览器将显示“不安全”警告,部分客户端(如 iOS App、curl -k 以外的调用)可能拒绝连接。
Let’s Encrypt 续期失败后实际表现
FrankenPHP 内置 Caddy,自动管理 Let’s Encrypt 证书。续期失败 ≠ 站点下线,而是证书过期后:
-
https://访问会触发浏览器证书错误(NET::ERR_CERT_EXPIRED),HTTP 仍可访问(如果没强制跳转) - API 客户端、移动端 SDK、curl 默认行为会中断请求(除非加
-k或忽略证书校验) - Caddy 不会主动停服务,
http://和已缓存的 OCSP 响应可能暂时维持部分可用性,但不可依赖
Caddy 的续期机制与失败场景
Caddy 默认每 24 小时检查一次证书有效期,距离到期不足 30 天时自动尝试续期。常见失败原因:
- 域名 DNS 解析失败或
HTTP-01挑战端口(80)被拦截(防火墙/NAT/CDN 未透传) - 站点根目录下缺少可公开访问的
.well-known/acme-challenge/路径(FrankenPHP 默认支持,但若 Caddyfile 中php路由覆盖了该路径则会拦截) - Let’s Encrypt 接口限流(同一域名 7 天内最多 5 次失败续期)
- 磁盘满或
/var/lib/caddy(默认证书存储路径)权限异常
如何提前发现并避免断连
靠等浏览器报错太晚。必须主动监控:
立即学习“PHP免费学习笔记(深入)”;
- 查日志:
journalctl -u frankenphp -n 100 | grep -i "acme\|cert"或看 Caddy admin 端点http://localhost:2019/metrics中caddy_http_handler_acme_http_challenge_total{code="error"} - 用
caddy validate --config /etc/caddy/Caddyfile确保配置无语法错误(尤其别误删tls块) - 手动触发测试续期:
caddy reload --config /etc/caddy/Caddyfile --force后观察日志是否出现renewing cert及成功标记 - 在 Caddyfile 中显式设置备用邮箱和重试策略(非必需但更稳):
{<br> email your@example.com<br> acme_ca https://acme-v02.api.letsencrypt.org/directory<br>}
真正危险的不是“续期失败一次”,而是失败后无人知晓、无人干预——Caddy 不发告警,也不会自动降级到自签名证书。运维必须自己搭一层健康检查,盯住 frankenphp_tls_cert_expires_seconds 这类指标(需开启 metrics 并暴露)。



















