Nginx反向代理关键在于proxy_pass末尾斜杠决定路径截取:不带/则完整拼接,带/则剪掉location前缀;推荐用^~提升静态路径匹配性能;需透传Host、X-Real-IP、X-Forwarded-Proto等头部;多业务应配置独立upstream实现故障隔离。

直接用 location 块配合 proxy_pass 的路径处理逻辑就能实现,关键在斜杠(/)的位置和匹配方式的选择。
明确 location 匹配类型与路径截取规则
Nginx 对请求路径的截取行为,完全由 proxy_pass 指令末尾是否带 / 决定,和 location 中的写法无关:
-
proxy_pass 后不带 /:原请求路径完整拼接到目标地址后。例如
location /api { proxy_pass http://backend; },访问/api/user会转发到http://backend/api/user -
proxy_pass 后带 /:自动剪掉
location匹配到的前缀,再拼接。例如location /shop/ { proxy_pass http://192.168.1.10:8007/; },访问/shop/order实际请求的是http://192.168.1.10:8007/order
推荐使用 ^~ 非正则匹配提升性能
对静态路径前缀(如 /admin、/files)优先选 ^~,避免正则引擎介入,提高匹配效率:
-
location ^~ /admin/ { proxy_pass http://10.0.2.5:9001/; }—— 精确匹配以/admin/开头的请求,且不走正则 - 若需支持大小写不敏感或复杂路径规则,才用
~*,例如location ~* ^/static\.(js|css|png)$ { ... }
注意 Host 头与客户端真实信息透传
后端服务常依赖 Host 和客户端 IP 判断来源,必须显式设置关键头部:
-
proxy_set_header Host $host;—— 保留原始域名,避免后端因 Host 错误返回 404 或重定向异常 -
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For $proxy_add_x_forwarded_for;—— 传递真实客户端 IP,供日志或限流使用 -
proxy_set_header X-Forwarded-Proto $scheme;—— 明确告知后端是 http 还是 https,防止混合内容或跳转错乱
为不同目录配置独立 upstream 提升稳定性
当多个业务系统共用一台 Nginx 时,应为每个目录路由定义专属 upstream,隔离故障影响:
- 先在
http块外定义:upstream shop_backend { server 192.168.1.20:8007 max_fails=2 fail_timeout=30s slow_start=10s; } - 再在对应 location 中引用:
location ^~ /shop/ { proxy_pass http://shop_backend/; } - 这样某套系统超时或频繁失败,不会干扰其他目录的健康检查和路由决策



















