🚀 第08章 · 配置检查与重载

nginx -t / reload / 热加载

配置检查与重载

这一章讲 Nginx 更改配置后最要紧的一步:先检查配置再重载。生产环境绝不"改完直接 reload",因为一个语法错误就可能让你服务整个挂掉。本机所有站点配置都由 Certbot 托管,改完更要小心。

核心三连:-t(测试)→ -s reload(平滑重载)→ 验证

# 1) 测试配置语法,错误会告诉你哪个文件哪一行
sudo nginx -t

# 2) 平滑重载(不中断连接)
sudo nginx -s reload        # 等价于 systemctl reload nginx

# 3) 验证服务仍健康
curl -sS -o /dev/null -w "%{http_code}\n" https://learn.bangdream.xyz/

关键 | nginx -t 通过后才 reload。若 -t 报错,Nginx 不会重载,仍用旧配置,而且新配置不生效。此时要修复报错再 reload。这与"改完直接 systemctl restart"不同——restart 会短时间断开连接。

nginx -t 报错怎么看

nginx -t 会给出 [emerg]/[error] 及出错的位置,例如:

nginx: [emerg] unknown directive "proxy_pas" in /etc/nginx/sites-enabled/bangdream.xyz.conf:12
  • [emerg] = 致命错误,必须解决。
  • 位置 :12 是配置文件行号。
  • 常见:拼错指令、少了分号、括号不匹配、引号未闭合、location 块内乱嵌套。

使用 master/worker 机制理解 reload 为什么平滑

Nginx 启动一个 master 进程和若干 worker 进程:

  • master 监听端口,负责 Manage 配置、fork 新的 worker。
  • worker 处理实际请求。
  • reload 时,master 先 -t 检查(其实 reload 也会),再用新配置 fork 出新的一组 worker;等旧的 worker 处理完手头请求后 gracefully 退出。这样新连接走新配置,旧连接平滑完成,实现"不中断 reload"。

启用 / 禁用 / 修改站点配置的完整流程

以新增一个 learn.bangdream.xyz 站点为例(本机就是这么做):

# /etc/nginx/sites-available/learn.bangdream.xyz.conf
server {
    server_name learn.bangdream.xyz;
    root /var/www/learn;
    ...
}
# 放到 sites-available,并软链到 sites-enabled 启用
sudo cp learn.bangdream.xyz.conf /etc/nginx/sites-available/
sudo ln -sf /etc/nginx/sites-available/learn.bangdream.xyz.conf /etc/nginx/sites-enabled/

# 测试 + 重载
sudo nginx -t && sudo systemctl reload nginx

禁用某个站点:删掉软链(不要删原文件),再 nginx -t && reload:

sudo rm /etc/nginx/sites-enabled/learn.bangdream.xyz.conf
sudo nginx -t && sudo systemctl reload nginx

注意 | 软链删除后,sites-enabled/ 里没有了,但 sites-available/ 里文件还在,方便恢复。改完配置、启停完站点,一定 nginx -t 再 reload,不要漏。

Certbot 修改配置后别忘了 reload

Certbot 会给你的站点文件加上 TLS 相关的块(ssl_certificate、listen 443 等),如本机这些 # managed by Certbot 注释。证书续期后 Certbot 会自动 reload;但你手动改动过配置文件,要确保:

sudo nginx -t
sudo systemctl reload nginx    # 或 certbot 续期后的 reload 由它自己做

诊断:改动后没效果

现象 原因 排查
改了配置不生效 没 reload,或软链没建对 nginx -t && systemctl reload nginx;ls -l sites-enabled/ 看软链
改 server_name 不生效 软链重复/默认 server 抢占 检查是否有重复 server_name;nginx -T 看完整生效配置
改了 ssl 相关报错 证书路径/权限问题 nginx -t;ls -l /etc/letsencrypt/live/<域>/
reload 失败连接被断 -t 没过就 restart 了 先 nginx -t 再 reload;必要时 sudo nginx 看启动日志

看"最终生效"的完整配置

sudo nginx -T        # 打印合并所有 include 后的完整配置,排查重复/覆盖问题

提示 | nginx -T(大写)会输出所有站点合并后的真实配置,是定位"以为改了其实被别的 server 覆盖"的利器。

相关命令

  • nginx -t 测试; nginx -s reload / systemctl reload nginx 平滑重载。
  • nginx -T 查看合并配置; nginx -s stop / systemctl stop nginx。
  • systemctl status nginx 看 master/worker 状态。