Nginx 多站点配置与证书自动续期的几个细节
同一台机器上跑多个站点,最常见的做法是在 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 端口可达。任何一个不满足,整张证书就签不下来。
- 先确认 DNS 三个名字都指向本机;
- 确认 80 端口没有被防火墙挡住;
- 确认 80 端口的 server 块里
/.well-known/acme-challenge/没有被 301 重定向掉。
最后一条最容易被忽略:很多人给 80 端口写了全站跳转 HTTPS,结果验证请求也被跳走了,签证书时报 404 或 403。