🚀 第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 状态。