Nginx 反向代理配置有哪几种方式?三种场景一次讲清

编程狮(w3cschool.cn) 2026-10-12 07:04:48 浏览数 (128)
反馈

你搭网站时,常听说用 Nginx 挡在前面。核心答案一句话:Nginx 反向代理用 location 匹配路径、再用 proxy_pass 把请求转发到后端服务,常见有「按路径转发」「按域名转发」「统一入口加负载」三种配置方式;配好之后还能顺手做缓存、HTTPS 和动静分离。本文以 Nginx 1.2x 稳定版为例,讲清三种反向代理配置写法、它们各自的适用场景,以及 proxy_pass 结尾斜杠这种最容易被忽略的坑。看完你不仅能写出正确的代理配置,还能判断该按路径还是按域名来分流。今天这篇文章,编程狮就把这块讲透。

Nginx 反向代理三种场景一次讲清

先看结论

三种配置方式对应的是不同的分流需求,先想清楚再写:

你的场景 首选方式 一句话理由
单域名下不同路径给不同服务 按路径转发 location 匹配最直观
多个域名各指向不同后端 按域名转发 用 server_name 区分
一个后端要扛多台机器 统一入口加 upstream 在代理层做负载均衡

一、Nginx 反向代理到底在做什么

正向代理是「客户端借服务器去访问外网」,反向代理正好反过来:客户端以为在访问 Nginx,其实 Nginx 把请求转给了后面的应用服务器,客户端并不感知后端是谁。它挡在应用前面,统一收口入口、隐藏后端、还能做 HTTPS 和缓存。要系统学基础,可以先过一遍 Nginx 入门指南,把 Nginx 的配置结构铺平。

理解正向与反向代理的区别,有助于你判断什么时候该上反向代理,也决定了你该把哪些流量收口到 Nginx 前面。

⚠️ 注意:反向代理一旦配错,所有流量都会打偏。改完配置务必先 nginx -t 检查语法,再用 nginx -s reload 平滑生效,避免直接重启把线上流量切断。

二、proxy_pass 基础:把请求转到后端

反向代理的核心指令就是 proxy_pass,它写在 location 里,告诉 Nginx 把匹配到的请求转发到哪个后端地址。最基础的单服务转发长这样:

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

上面这段做了「监听 80 端口,把根路径下的所有请求转发到本机 8080 端口的应用」。预期结果是访问 example.com 时,实际由 8080 上的服务返回内容。proxy_pass 后面跟的是后端地址,可以是一个端口,也可以是一个 upstream 名字。

# 把 /api 开头的请求单独转给后端接口服务
location /api/ {
    proxy_pass http://127.0.0.1:9000;
}

这样一来,静态页和接口就能分别交给不同服务处理,正是动静分离的雏形。

Nginx 反向代理三种配置方式怎么选?

三、Nginx 反向代理三种配置方式

第一种是按路径转发:用不同的 location 把不同前缀的请求分给不同后端,适合一个域名下挂多个服务。第二种是按域名转发:用 server_name 区分多个域名,每个域名各自反代到自己的后端,适合多站点共用一台 Nginx。第三种是统一入口加 upstream:在代理层用 upstream 块定义一组后端,再做负载均衡,适合单服务要横向扩机器。想从原理上分清正向与反向代理,可以看 探秘网络代理。

方式 适用场景 优点 代价
按路径转发 单域名多服务 location 直观 路径规划要规范
按域名转发 多站点共用 server_name 清晰 需多个域名
upstream 入口 后端多机器 代理层做负载 要多配健康检查

踩坑清单

  1. 现象:代理后页面能开但接口 404;原因:location 与 proxy_pass 的斜杠不一致;修复:确认转发路径是否多带或少带结尾斜杠。
  2. 现象:后端拿不到真实客户端 IP;原因:没透传请求头;修复:加上 proxy_set_header Host 和 X-Real-IP。
  3. 现象:大文件上传被截断;原因:代理缓冲和超时太小;修复:调大 client_max_body_size 与 proxy_read_timeout。
  4. 现象:upstream 一台挂了全站变慢;原因:没有故障转移配置;修复:给上游加 max_fails 与 fail_timeout。

nginx -t 与 reload 验证输出示例

四、proxy_pass 斜杠与上线前检查

proxy_pass 结尾的斜杠是最隐蔽的坑:当 location 是 /api/ 而 proxy_pass 是 http://127.0.0.1:9000/ 时,Nginx 会把 /api/ 这段前缀去掉再转发;如果 proxy_pass 没有结尾斜杠,则连前缀一起转发。两者差一个字符,后端收到的路径就完全不同,所以一定要按后端期望的路径来对齐。

上线前除了 nginx -t 检查语法,还要用 curl 实际打一下代理地址,确认返回的是后端内容而不是 Nginx 默认页。若同时做动静分离,静态资源走 Nginx、动态请求走后端,能显著减轻后端压力。

总结

Nginx 反向代理的配置思路很清晰:用 location 或 server_name 决定分流方式,用 proxy_pass 把请求转给后端,流量大时再用 upstream 在代理层做负载均衡。记住最隐蔽也最经典的一课:proxy_pass 结尾有没有斜杠,直接决定后端收到的路径,上线前务必用 curl 实测一遍。

要点带走:

  • 按路径转发适合单域名多服务,按域名转发适合多站点;
  • 后端多机器就用 upstream 做代理层负载均衡;
  • 改完配置先 nginx -t 再 reload,斜杠对齐别忘了。

下一步可以动手给常用接口补上 upstream 与健康检查,直观感受反向代理带来的流量收口能力。

动手验证清单

下面这组动作帮你在本机验证反向代理配置,按你自己的环境执行,结果以实际输出为准(本文配置未在作者本机执行,仅给出预期形态):

  1. 安装:本机装好 Nginx 1.2x 和一个监听 8080 的测试服务;
  2. 配置:在 nginx.conf 里写 location 与 proxy_pass 指向 8080;
  3. 命令:执行 nginx -t 检查配置语法;
  4. 运行:执行 nginx -s reload 平滑加载新配置;
  5. 检查:用 curl http://localhost 看是否返回后端内容;
  6. 预期:返回的是 8080 服务的内容,而不是 Nginx 默认页;
  7. 失败:若返回默认页,检查 location 匹配与 proxy_pass 地址;
  8. 修复:修正斜杠与监听端口后重新 reload;
  9. 验证:curl 多个路径确认动静分离与转发都正确。

延伸学习

想把 Nginx 配置补完整,可以顺着这条线:

  1. 先过一遍 Nginx 快速入门指南,把基础铺平;
  2. 看实例读 Nginx 反向代理实战;
  3. 想深入协同再读 Nginx 与 Tomcat 协同。

常见问题

Q:反向代理和正向代理有什么区别?

A:正向代理是客户端主动借服务器访问外网,服务器对目标站点是「客户端」;反向代理是服务端把外部请求转给内部应用,客户端以为在和 Nginx 直接对话,其实后端被隐藏了。

Q:proxy_pass 结尾的斜杠到底影响什么?

A:它决定转发时是否去掉 location 匹配到的前缀。location 是 /api/、proxy_pass 带斜杠时,后端收到的是去掉 /api/ 后的路径;不带斜杠时,连前缀一起转发。差一个字符,后端收到的路径就不同。

Q:后端拿不到用户真实 IP 怎么办?

A:因为请求经过 Nginx 后,对后端来说来源变成了 Nginx 自己。解决办法是在 location 里加 proxy_set_header Host $host; 和 proxy_set_header X-Real-IP $remote_addr;,把原始信息透传过去。

0 人点赞