downuuship

Nginx 多站点配置与证书自动续期的几个细节

2026-10-21

同一台机器上跑多个站点,最常见的做法是在 conf.d/ 下按域名分文件。这个习惯本身没什么问题,真正容易出问题的是下面几处细节。

server_name 的匹配顺序

Nginx 匹配 server_name 时,精确匹配优先于通配符,通配符优先于正则。但如果请求的 Host 一个都没命中,就会落到该端口的 default_server,也就是第一个监听该端口的 server 块。

这意味着配置文件的加载顺序(默认是字典序)会影响兜底行为。如果不想依赖文件名排序,显式写 listen 80 default_server; 更稳妥。

reload 与 restart 的区别

改完配置先 nginx -t,通过后再 systemctl reload nginx。reload 是平滑重载:旧 worker 处理完存量连接再退出,不会掐断正在传输的请求。restart 会直接断开所有连接。

nginx -t && systemctl reload nginx

证书路径与续期钩子

用 acme.sh 或 certbot 时,证书文件不要手工复制来复制去,容易忘。acme.sh 的 --install-cert 支持一次性写死目标路径和重载命令:

acme.sh --install-cert -d example.com --ecc \
  --key-file       /ssl/example.key \
  --fullchain-file /ssl/example.crt \
  --reloadcmd      "systemctl reload nginx"

之后每次自动续期都会自动写文件并触发 reload,不需要再进服务器。

多域名证书

一个证书覆盖 example.com、www.example.com 和一个子域时,HTTP-01 验证要求每个名字都能解析到本机并且 80 端口可达。任何一个不满足,整张证书就签不下来。

最后一条最容易被忽略:很多人给 80 端口写了全站跳转 HTTPS,结果验证请求也被跳走了,签证书时报 404 或 403。