nginx -t 通过了,线上还是旧配置:两个 server_name 撞车

举报
yd_298384123 发表于 2026/11/09 09:32:24 2026/11/09
【摘要】 上周给一个内部后台加跳转,改完 nginx.conf 跑 nginx -t,输出 syntax is ok 和 test is successful,reload 返回 200。我打开页面,走的还是老逻辑。第一反应是浏览器缓存。硬刷新、开无痕、换 curl 直接打接口,结果一模一样。又怀疑 reload 没生效,ps 看了下 master 进程的启动时间,是新的,配置确实重新加载过了。这时候...

上周给一个内部后台加跳转,改完 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 一下,多出来的、少掉的都看得见。比事后靠猜省事多了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。