很多技术概念,越是基础,越容易在现场被用乱。
Nginx 正向代理和反向代理就是其中一个。
有人把网站转发叫正向代理,有人把采集代理也叫 Nginx 反代。单独看“代理”两个字,确实容易混。但只要回到请求方向,问题就很清楚。
我自己的判断标准很简单:
请求从客户端往外走,用正向代理;请求从外部进入服务端,用反向代理。
先看正向代理
正向代理是客户端侧的代理。
它的结构是:
text复制
客户端 → 代理服务器 → 外部目标站点
客户端本来要访问目标站点,但它不直接访问,而是先把请求交给代理服务器。
目标站点收到请求时,看到的是代理服务器发来的请求。
所以正向代理解决的是“客户端怎么访问外部资源”的问题。
常见例子有:
- 内网机器需要访问外部网站;
- 开发机要临时访问某些外部接口;
- 采集程序需要统一出口;
- 企业网关需要记录员工访问日志;
- 客户端想隐藏真实访问来源。
这类场景里,代理是客户端主动使用的工具。
再看反向代理
反向代理是服务端侧的代理。
它的结构是:
text复制
用户 → Nginx → 后端应用
用户访问的是 Nginx,对后端应用没有直接感知。
比如后端服务实际跑在:
text复制
127.0.0.1:8080
但用户访问的是:
text复制
https://www.example.com
中间就是 Nginx 在转发。
反向代理解决的是“外部请求怎么进入后端服务”的问题。
常见例子有:
- Web 服务对外发布;
- 前后端分离项目部署;
- 多个后端服务共用一个域名;
- HTTPS 证书统一放在 Nginx;
- 多台后端机器做负载分发;
- 静态资源和动态接口分开处理。
反向代理通常由服务端部署方配置,用户一般不知道后面发生了什么。
一个生活化类比
可以把正向代理理解成“代购”。
你想买一个东西,但你不直接去买,而是让代购替你去买。商家看到的是代购,不是你。
这就是正向代理。
反向代理更像“前台”。
客户来到公司,不会直接找后面的工程师、财务、销售,而是先找前台。前台再把人转给对应部门。
这就是反向代理。
一个替客户端出去,一个替服务端接待。
配置上的差异
反向代理在 Nginx 里非常常见:
nginx复制
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这个配置里,用户访问 api.example.com,Nginx 把请求转给后端 8080 服务。
如果后面有多台服务,可以这样写:
nginx复制
upstream backend {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
}
}
这就是典型反向代理加负载分发。
正向代理也可以用 Nginx 做简单 HTTP 示例:
nginx复制
server {
listen 8888;
resolver 8.8.8.8;
location / {
proxy_pass http://$http_host$request_uri;
}
}
但要注意,Nginx 原生对完整 HTTPS 正向代理支持并不舒服。浏览器访问 HTTPS 网站时,常见方式是 CONNECT 隧道,这通常需要第三方模块或专门代理服务。
排障时怎么判断
我通常问三个问题。
第一,代理是谁主动使用的?
如果是客户端主动配置代理地址,是正向代理。
如果是域名解析到 Nginx,再由 Nginx 转到后端,是反向代理。
第二,代理隐藏了谁?
隐藏客户端,是正向代理。
隐藏后端服务,是反向代理。
第三,流量方向是什么?
客户端往外访问,是正向代理。
外部用户访问内部服务,是反向代理。
这三个问题一问,基本不会混。
常见误区
误区一:Nginx 只要用了 proxy_pass,就是反向代理。
不对。proxy_pass 是转发指令,不是概念判断依据。
误区二:反向代理会影响真实用户 IP。
会影响,但可以处理。关键是正确配置 X-Real-IP 和 X-Forwarded-For,后端也要按可信代理读取。
误区三:正向代理和反向代理只是名字不同。
不是名字不同,而是控制方不同、隐藏对象不同、使用场景不同。
最后总结
正向代理和反向代理的区别,可以压缩成两句话:
正向代理:客户端找代理,替自己访问外部资源。
反向代理:服务端放代理,替后端接收外部请求。
如果你是在部署网站、API、后台系统,十有八九是在用 Nginx 做反向代理。
如果你是在处理统一出口、采集访问、外部接口请求,那更接近正向代理。
方向判断清楚,配置才不会写反。





