Nginx、acme.sh 与证书目录:一套可长期维护的 HTTPS 方案
把 Nginx 配置、证书存储、自动续期和日志分离管理,才能让 HTTPS 成为稳定基础设施。
证书目录应该按域名组织
HTTPS 证书由自动化工具申请和续期,但 Nginx 只应该依赖一个稳定的运行路径。示例中可以把最终使用的证书放在 `/etc/ssl/example.com/`,目录名只表达域名,不把生成工具名称写进运行路径。这样 Nginx 配置、备份和排障都更容易理解。
目录中保留 `fullchain.pem`、`cert.pem`、`chain.pem` 和 `privkey.pem`。Nginx 使用 `fullchain.pem` 和 `privkey.pem`;其他文件用于查看证书链或排查问题。私钥权限必须限制,不能让普通用户或 Web 服务目录随意读取。
acme.sh 的职责边界
acme.sh 的工作目录可以放在 `~/.acme.sh/`,它负责保存账户信息、域名配置、申请过程和内部证书版本。Nginx 不需要读取这个内部目录,而是通过 `--install-cert` 把证书复制到稳定的域名目录,并设置 `systemctl reload nginx` 作为续期后的重新加载命令。
这样分层后,证书生成方式可以变化,Nginx 的配置路径不需要变化。证书续期成功后,acme.sh 更新目标文件并重载 Nginx,正在运行的连接不会因为重启而被强制中断。
HTTP-01 验证与 Nginx
最简单的验证方式是开放 80 端口,让 `/.well-known/acme-challenge/` 保持可访问。HTTP 站点的其他请求统一跳转到 HTTPS,但验证目录不能被重定向到不存在的应用,也不能被静态站点的前端回退规则拦截。
配置完成后,先写入一个测试文件,再使用 `curl http://example.com/.well-known/acme-challenge/test` 验证路径确实落到 `/var/www/html/.well-known/acme-challenge/`。确认后再申请证书。
systemd 与配置软链
Ubuntu 的 `systemctl` 管理的是系统服务,Nginx 主配置通常位于 `/etc/nginx/nginx.conf`,站点配置放在 `/etc/nginx/conf.d/`。这样配置、日志和证书各有清晰边界,升级和排障都更容易。
每次改动后的顺序固定为:`nginx -t` 检查语法,`systemctl reload nginx` 平滑加载,`systemctl status nginx` 检查服务状态,最后用 `curl -I https://yu7s.com` 检查响应。不要跳过配置检查直接重启。
自动续期的验收标准
检查 acme.sh 的 cron 是否存在,检查 `--info -d yu7s.com` 中的最终证书路径和 reload 命令,使用 openssl 查看 `notAfter`,再手动运行一次 `--cron` 确认没有错误。续期不需要每天强制申请,只需让定时任务在到期窗口内执行即可。
证书自动化的目标不是让人完全忘记它,而是让检查变得简单、路径稳定、失败可见。目录、权限、验证路径和 reload 命令都清楚,后续维护才真正省心。
