nginx -t 通过了,线上还是旧配置:两个 server_name 撞车
上周给一个内部后台加跳转,改完 nginx.conf 跑 nginx -t,输出 syntax is ok 和 test is successful,reload 返回 200。我打开页面,走的还是老逻辑。
第一反应是浏览器缓存。硬刷新、开无痕、换 curl 直接打接口,结果一模一样。又怀疑 reload 没生效,ps 看了下 master 进程的启动时间,是新的,配置确实重新加载过了。
这时候才想起来看一眼到底加载了哪几个文件。nginx -T 会把合并后的完整配置打出来,我 grep 自己改的那个 location,出来两份。翻了下目录,/etc/nginx/conf.d 里躺着一个去年做活动留下的 old-admin.conf,server_name 跟新配置里的域名写的是同一个。
两个 server 块监听同一个 80 端口、匹配同一个域名,nginx 只认先加载的那份。conf.d 下是按文件名顺序 glob 的,old-admin.conf 排在 admin.conf 前面,所以生效的一直是那个废弃文件。
nginx -t 抓不住这个。它只校验语法和文件是否存在,重复的 server_name 在它眼里完全合法。reload 也不会有任何提示,因为确实没什么可提示的。
处理起来很简单,把 old-admin.conf 挪到 /etc/nginx/conf.d/disabled/ 下面,文件不删,留个记录,再 reload 一次就好了。真正麻烦的是前面那半小时,我一直在缓存和进程上绕。
之后给自己定了个规矩:改完 nginx,先跑 nginx -T | grep -n "server_name 你的域名",确认只剩一份再 reload。顺带说一句,conf.d 里 10-、20- 这种前缀不是为了让文件名好看,是用来控制加载顺序的,撞过一次才知道顺序真的会决定哪个 server 块生效。
现在每台机器的 /usr/local/bin 下都放了个三行的 ngxsnap,改配置前存一份 nginx -T 的输出,改完存一份,diff 一下,多出来的、少掉的都看得见。比事后靠猜省事多了。
- 点赞
- 收藏
- 关注作者
评论(0)