nginx基于路径的负载分发需三步:先在http块定义upstream组(如user-svc),再在server块用location按优先级匹配路径(=、^~、~*等),最后通过proxy_pass转发并注意末尾斜杠对路径拼接的影响。

在 nginx.conf 中配置基于路径的负载分发,核心是用 location 匹配请求路径,再通过 proxy_pass 指向预定义的 upstream 组。整个过程分三步:先定义后端服务组,再写路径匹配规则,最后注意路径拼接细节。
定义 upstream 服务组
在 http 块内声明多个 upstream,每个代表一类业务的后端集群:
- 用 server 指令列出真实后端地址,可加 weight、max_fails 等参数控制调度行为
- 同一业务路径应绑定唯一 upstream 名称,比如 user-svc、order-svc
- 示例:
upstream user-svc {
server 10.0.1.10:8080 weight=2;
server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
}
用 location 写路径匹配规则
在 server 块中按优先级顺序写 location,Nginx 会自动选中最匹配的一项:
- = /health:精确匹配,只响应 /health,不带子路径
- ^~ /api/v1/:前缀最长匹配,不进正则阶段,适合 API 入口
- /static/:普通前缀匹配,优先级低于 ^~,但比正则高
- ~* \.(js|css|png)$:不区分大小写的正则,适合静态资源识别
设置 proxy_pass 并处理路径拼接
proxy_pass 的末尾斜杠直接影响转发路径是否被重写:
- location /admin/ { proxy_pass http://admin-svc/; } → 请求 /admin/user 转发为 http://admin-svc/user
- location /admin { proxy_pass http://admin-svc; } → 请求 /admin/login 转发为 http://admin-svc/admin/login
- 避免 location /api + proxy_pass http://backend/api 这类重复拼接,应统一用 /api/ + http://backend/
组合使用实现多业务分流
实际配置常需多个路径协同工作,例如:
- 所有 /api/auth/ 开头的请求走认证集群
- 所有 /api/order/ 开头的请求走订单集群
- 根路径 / 或 /web/ 走前端服务
- 每条规则都对应独立 upstream,彼此隔离、互不影响











