整理 Nginx location 的匹配规则,顺带记录一次线上超时问题的排查过程。

匹配顺序

  1. 精确匹配 = /path,命中即停止;
  2. 最长前缀匹配 ^~ /path,命中后不再检查正则;
  3. 正则匹配 ~ pattern,按配置顺序,命中即停;
  4. 普通前缀匹配,记录最长者,若被上述正则淘汰则用之。

一句话记忆:精确 > 前缀(^~ 优先)> 正则(书写顺序)> 普通前缀。

proxy_pass 的尾斜杠

location /api/ {
  proxy_pass http://upstream/;
}

带尾斜杠时,/api/foo 会被替换为 /foo 转发(location 前缀被「去掉」);不带尾斜杠则原样转发 /api/foo。这个细节坑过不少人,包括我。

一次 502 排查

现象:流量高峰期间歇性 502,低谷期完全正常。排查路径:

  • 先看 error log:connect() failed / timeout,集中在 upstream 连接阶段;
  • 确认 upstream 服务本身健康,压测单独服务无异常;
  • 最终定位:未开启 upstream keepalive,每个请求都新建 TCP 连接,高峰时端口和握手开销打满。

加上 keepalive 与 proxy_http_version 1.1、proxy_set_header Connection "" 后恢复。

小结

location 匹配和 proxy_pass 的行为都值得动手试一遍——读十遍配置不如抓一次包。