Nginx基于路径匹配的后端转发策略通过location规则决定“谁来处理”,proxy_pass决定“怎么转”,并可结合upstream实现同一路径下的多实例负载均衡;location匹配遵循=(精确)、^~(前缀最长)、无符号前缀、~或~*(正则)优先级顺序,proxy_pass末尾斜杠影响路径拼接逻辑。

在 Nginx 中,基于路径匹配的后端转发策略,核心是把请求按 URL 路径分发到不同后端服务,而不是简单轮询所有节点。这需要 location 规则与 proxy_pass 协同工作,同时可结合 upstream 实现同一路径下的多实例负载均衡。
路径匹配规则决定“谁来处理”
location 是路径路由的第一关,匹配顺序直接影响转发结果:
-
=:全路径精确匹配,优先级最高。例如
location = /health只响应/health,不匹配/health/check -
^~:前缀最长匹配,不区分大小写,命中即停,不进入正则阶段。适合 API 前缀如
location ^~ /api/v1/ -
无符号前缀(如 /user):普通前缀匹配,优先级低于
^~,但会继续尝试更长前缀或正则,最终取最长匹配 -
~ 或 ~*:正则匹配,
~区分大小写,~*不区分;一旦匹配成功立即终止搜索,适合复杂路径识别(如location ~* \.(js|css|png)$静态资源)
proxy_pass 决定“怎么转”
转发路径拼接逻辑容易出错,关键看 proxy_pass 末尾是否有斜杠:
-
proxy_pass http://backend;(无尾斜杠)→ 完整路径透传:
访问/admin/login,转发为http://backend/admin/login -
proxy_pass http://backend/;(有尾斜杠)→ 剥离 location 前缀:location /admin { proxy_pass http://backend/; }→ 访问/admin/user转发为http://backend/user - 避免混用:若 location 是
/api,proxy_pass 写成http://backend/api会导致重复路径,应改为http://backend/并配合location /api/
路径 + upstream 实现分组负载均衡
同一路径可指向一个 upstream 组,内部实现多节点调度:
- 先定义服务组:
upstream user-svc {<br> server 10.0.1.10:8080 weight=3;<br> server 10.0.1.11:8080 max_fails=2 fail_timeout=30s;<br>} - 再绑定路径:
location ^~ /user/ {<br> proxy_pass http://user-svc/;<br> proxy_set_header Host $host;<br>} - 这样所有以
/user/开头的请求,都由 user-svc 组内服务器按权重或 least_conn 等策略分发
常见组合场景示例
实际部署中常需多路径协同:
-
location /api/auth { proxy_pass http://auth-svc/; }→ 认证服务独立集群 -
location /api/order { proxy_pass http://order-svc/; }→ 订单服务独立集群 -
location ~* \.(jpg|jpeg|gif|css|js)$ { root /var/www/static; }→ 静态资源直接本地响应,不走代理 -
location / { proxy_pass http://web-front/; }→ 默认入口,兜底转发至前端服务


















