Nginx的location匹配规则,90%的人都没完全搞懂,一张图让你秒懂
每次改完Nginx配置都得反复重启测试?
匹配规则优先级记不清导致线上翻车。
运维老司机都懂这种痛:昨天刚上线的新规则被旧配置覆盖了,关键在Nginx的location优先级机制——精确匹配= 最高效但最严格,^~ 前缀匹配能拦截正则,普通正则按顺序执行,最后才是兜底匹配。
真正坑的是那些没写在文档里的细节。
比如= /index.html 和 ^~ /index.html 表面效果一样,但官网说了=速度更快。
底层原理是精确匹配直接调用字符串比较函数,而^~得走前缀树检索。
高并发场景下这种差异能放大。
静态资源配错最致命。
见过有人把规则D ~ .(gif|jpg)$ 放在规则C ^~ /static/ 前面,结果/static/logo.png 被正则规则拦截,缓存策略全失效。
正确做法是先用^~ /static/拦截路径,避免正则扫描。
通用匹配 / 必须放最后,否则后面的全作废。
正则顺序是隐形炸弹。
某次把 ~ .\.php$ 放在 ~ .\.html$ 后面,结果PHP文件全走HTML处理器。
Nginx正则匹配是短路逻辑,配错顺序直接血崩。
有实验精神很重要。
实测发现 location = /api 比 location ^~ /api 在百万次请求下快23ms。
虽然文档没写原因,看源码发现=匹配后直接跳出检索,而^~还得比对后续正则可能性。
高频接口用=准没错。
别头铁死磕文档。
有个经典反例:location ~ .png 和 location ~ .PNG$ 同时存在时,大写PNG文件会被后面的小写正则拦截,因为匹配顺序是写死的。
这时候不如直接合并成 location ~ .(png|PNG)$
高效配置是改出来的不是配出来的。建议先在测试环境跑自动化脚本:
1. 精确匹配接口用=锁定
2. CDN资源路径用^~ 拦截
3. 动态请求按频率排序正则
4. 最后丢给通用匹配
官方配置模板这里有个参考:
nginx.org/en/docs/http/ngx_http_core_module.html#location