Nginx SSL 证书自动续期 Let-s Encrypt

HTTPS 是标配,证书用 Let's Encrypt,免费、自动续期、不花钱。

为什么 Let's Encrypt

- 免费 — 不花一分钱

- 自动 — 配好之后不用管

- 安全 — 90 天一换,防泄露

- 广泛 — 浏览器都认

安装 Certbot

# Ubuntu

apt update

apt install certbot python3-certbot-nginx

验证

certbot --version

申请证书

方式一:Nginx 插件(推荐)

certbot --nginx -d soulwrite.xyz -d www.soulwrite.xyz

按提示输入邮箱、同意条款,证书自动放到 /etc/letsencrypt/live/soulwrite.xyz/

方式二:Standalone

不启动 Web 服务器时用:

certbot certonly --standalone -d soulwrite.xyz

自动续期

Let's Encrypt 证书 90 天过期,Certbot 自动配好定时任务:

# 检查自动续期

certbot renew --dry-run

手动续期

certbot renew

续期成功后重载 Nginx:

systemctl reload nginx

配合 Docker Nginx

我用的是 OpenResty 跑在 Docker 里。证书需要映射出来:

volumes:

- ./ssl:/etc/nginx/ssl

证书生成后复制过去:

cp /etc/letsencrypt/live/soulwrite.xyz/fullchain.pem ./ssl/

cp /etc/letsencrypt/live/soulwrite.xyz/privatekey.pem ./ssl/

多个域名

一个证书可以包含多个域名:

certbot --nginx -d soulwrite.xyz -d blog.soulwrite.xyz -d api.soulwrite.xyz

通配符域名要 DNS 验证,稍微复杂点。

OCSP 装订

加速 SSL 握手:

ssl_stapling on;

ssl_stapling_verify on;

resolver 8.8.8.8 8.8.4.4 valid=300s;

resolver_timeout 5s;

踩坑记录

坑 1:验证失败

80 端口被占用。停掉占用进程或用 DNS 验证:

certbot certonly --manual --preferred-challenges dns -d soulwrite.xyz

坑 2:续期后 Nginx 没重载

手动检查续期日志:

cat /var/log/letsencrypt/renew.log

确保续期脚本里有 systemctl reload nginx

坑 3:容器内证书过期

Docker 容器内的 Nginx 看不到宿主机的证书变化。解决方案:定期重启容器或挂载 /etc/letsencrypt 目录。

我的配置

/etc/letsencrypt/

├── live/

│ └── soulwrite.xyz/

│ ├── fullchain.pem

│ ├── privatekey.pem

│ └── chain.pem

└── renewal/

└── soulwrite.xyz.conf

总结

Let's Encrypt 是中小站点的最佳选择:

- 免费:不花钱

- 自动:配好不用管

- 安全:90 天换发

- 简单:一条命令搞定

唯一要注意的是 Docker 容器要映射证书目录,或者定期重启刷新。