swoole不支持https证书自动续期,因其仅为php扩展级网络框架,未集成acme客户端、计划任务调度、dns/api调用及证书验证响应能力,且ssl配置为静态路径、不监听文件变化或热重载。

Swoole 本身不支持 HTTPS 证书自动续期,必须借助外部工具(如 certbot、acme.sh 或 httpsok)完成申请与更新,再通过脚本触发 Swoole 重载或进程重启。
为什么 Swoole 没有内置自动续期能力
Swoole 是一个 PHP 扩展级网络框架,它只负责加载和使用证书文件,不集成 ACME 客户端,也不提供计划任务调度、DNS/API 调用、证书验证响应等能力。它的 ssl_cert_file 和 ssl_key_file 都是静态路径配置,启动后不会动态监听文件变化或自动 reload。
- 常见错误现象:
no certificate for domain、failed to load SSL certificate、服务启动后证书过期仍无响应 - 即使你把证书路径指向一个软链接,Swoole 也不会感知目标文件变更
- 想靠修改配置后调
$server->reload()来热更新证书?不行——Swoole 的 reload 不重读 SSL 配置项
certbot + deploy hook 实现 Swoole 证书自动续期
这是目前最稳定、可落地的方案:用 certbot 管理证书生命周期,用 deploy hook 通知 Swoole 进程更新。
- certbot 必须使用
--webroot或--dns模式申请证书(不能用--nginx插件,Swoole 不是 Nginx) - 申请时指定 webroot 目录(如
/var/www/.well-known),并确保该目录能被公网 HTTP 访问到(用于 Let’s Encrypt 验证) - 创建 deploy hook 脚本:
/etc/letsencrypt/renewal-hooks/deploy/swoole-reload.sh - 脚本内容示例:
#!/bin/bash # 确保路径正确,且 PHP 可执行文件在 PATH 中 pkill -f "php /path/to/your/server.php" sleep 1 php /path/to/your/server.php > /dev/null 2>&1 &
- 赋予可执行权限:
chmod +x /etc/letsencrypt/renewal-hooks/deploy/swoole-reload.sh - 验证是否生效:
sudo certbot renew --dry-run,观察是否触发脚本执行
acme.sh + systemd timer 更适合生产环境
相比 certbot,acme.sh 更轻量、无 Python 依赖,且原生支持更多 DNS 提供商,适合部署在容器或最小化系统中。
- 用 DNS-01 方式申请(推荐):
acme.sh --issue --dns dns_ali -d example.com -d *.example.com - 证书生成后,用
--reloadcmd指定重载逻辑:--reloadcmd "pkill -f server.php && php server.php &" - 配合 systemd timer,避免 crond 权限问题:
[Unit] Description=Renew acme.sh certificates [Service] Type=oneshot ExecStart=/root/.acme.sh/acme.sh --renew-all --force User=root [Install] WantedBy=timers.target
- 注意:Swoole 进程必须由同一用户(如 root)启动,否则
pkill会失败 - 私钥路径需在 Swoole 配置中硬编码为绝对路径,例如
/root/.acme.sh/example.com/example.com.key
容易被忽略的关键点
证书自动续期不是“配完就完事”,以下三点出错率最高:
-
ssl_key_file对应的私钥不能加密——Swoole 不支持密码提示,openssl rsa -in privkey.pem -out privkey-decrypted.pem必须提前解密 - 证书链要完整:Let’s Encrypt 的
fullchain.pem= 域名证书 + 中间 CA,不能只用cert.pem,否则部分客户端握手失败 - 进程管理方式决定 reload 是否可靠:如果用 supervisor/pm2 启动 Swoole,hook 中不能只
pkill,而要调用对应控制命令(如supervisorctl restart swoole)










