什么是正向代理和反向代理?
面试考察点
-
概念辨析:面试官不仅仅想知道你能区分 "正向" 和 "反向",更想知道你是否理解它们的本质区别——到底是谁在主动,谁在被代理。
-
实际应用:考察你是否能结合真实场景说出正向代理和反向代理的使用案例,而不是只停留在理论层面。
-
架构认知:反向代理在后端架构中无处不在(Nginx、网关、负载均衡),面试官想知道你对这些基础设施是否有实战经验。
核心答案
| 对比项 | 正向代理(Forward Proxy) | 反向代理(Reverse Proxy) |
|---|---|---|
| 代理谁 | 代理客户端 | 代理服务端 |
| 谁配置 | 客户端自己配置代理地址 | 客户端无感知,服务端配置 |
| 服务端知道真实客户端吗 | 不知道,只看到代理服务器 | 不知道(除非透传),只看到代理服务器 |
| 客户端知道真实服务端吗 | 知道,客户端明确要访问谁 | 不知道,客户端只知道代理地址 |
| 典型场景 | 科学上网、内网穿透 | Nginx 负载均衡、API 网关、CDN |
| 核心作用 | 让客户端 "借道" 访问目标 | 让服务端 "藏起来",统一对外 |
一句话区分:正向代理是客户端的 "中介",帮客户端去访问别人;反向代理是服务端的 "门面",替服务端接待客户端。
先看图,一目了然:
上图清晰地展示了两种代理的核心区别:
- 正向代理:客户端是主动方。客户端明确知道要访问的目标服务器(比如 Google),但因为某些原因无法直接访问,所以找了个 "中介"(代理服务器)代为转发。目标服务器只看到代理服务器的 IP,不知道真正的客户端是谁。
- 反向代理:服务端是主动方。服务端把反向代理(比如 Nginx)摆在前面,所有客户端的请求都先打到反向代理上,再由反向代理转发到内部的真实服务器。客户端以为 Nginx 就是目标服务器,完全不知道后面还藏着多少台机器。
深度解析
一、正向代理的典型场景
正向代理的核心是 "帮客户端出站"。几个常见场景:
1. 突破访问限制
公司内网不能直接访问外网,需要通过代理服务器出去。或者某些网站对地区有限制,通过国外的代理服务器中转访问。VPN 就是典型的正向代理。
2. 隐藏客户端身份
目标服务器只能看到代理服务器的 IP,看不到真实客户端的 IP。爬虫经常用代理 IP 池来隐藏身份,防止被封。
3. 缓存加速
代理服务器可以缓存常用资源,下次请求直接从缓存返回。早期的 HTTP 代理就有这个功能。
二、反向代理的典型场景
反向代理的核心是 "帮服务端入站"。这块在后端架构中用得太多了:
1. 负载均衡
这是反向代理最核心的应用。一台 Nginx 挡在前面,后面挂 10 台 Tomcat,Nginx 按照轮询、权重、最少连接等策略把请求分发到不同的后端服务器。
2. 安全防护
真实的服务器不直接暴露公网 IP,外面只看到 Nginx。攻击者打不到后端真实服务器,Nginx 可以做 WAF(Web Application Firewall)、限流、IP 黑名单等。
3. SSL 卸载
客户端和 Nginx 之间走 HTTPS 加密,Nginx 和内部服务器之间走 HTTP。这样证书管理、加解密运算都集中在 Nginx 上,后端服务器不用操心 SSL 的事。
4. 静态资源服务
Nginx 直接处理图片、CSS、JS 等静态资源请求,不用打到后端应用服务器,减轻后端压力。
三、Nginx 反向代理配置示例
实际项目中 Nginx 反向代理大概长这样:
# Nginx 反向代理 + 负载均衡配置
upstream backend {
# 负载均衡:3 台后端服务器
server 192.168.1.101:8080 weight=3; # 权重 3
server 192.168.1.102:8080 weight=2; # 权重 2
server 192.168.1.103:8080 weight=1; # 权重 1
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend; # 转发到上游服务器组
proxy_set_header Host $host; # 透传原始 Host
proxy_set_header X-Real-IP $remote_addr; # 透传真实客户端 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 静态资源直接由 Nginx 处理
location /static/ {
root /data/www;
}
}
配置要点:
upstream定义了一组后端服务器,通过weight设置权重。请求会按 3:2:1 的比例分配到三台服务器。proxy_pass把请求转发到上游服务器组。proxy_set_header系列配置用于把客户端的真实 IP 透传给后端,否则后端拿到的全是 Nginx 的 IP。这个在生产环境中非常重要,日志分析、限流、审计都要用到真实 IP。
四、常见误区
误区一:"正向代理和反向代理的区别就是代理方向不同"
这话没错,但太笼统了。更准确的说法是:谁存在感更强、谁是被隐藏的。正向代理中,客户端知道目标服务器(但服务器不知道客户端);反向代理中,服务器知道客户端(但客户端不知道真实服务器)。
误区二:"Nginx 只能做反向代理"
Nginx 也能做正向代理,只是不常用。Nginx 正向代理需要额外模块支持,功能不如 Squid、V2Ray 这些专业正向代理工具。
误区三:"反向代理就是负载均衡"
反向代理和负载均衡不是一回事。反向代理是 "代理服务端接收请求",负载均衡是 "把请求分发到多台服务器"。反向代理可以实现负载均衡,但也可以只做简单的请求转发。负载均衡也不一定依赖反向代理(比如 DNS 负载均衡、客户端负载均衡)。
面试高频追问
-
追问一:Nginx 和 HAProxy 都能做反向代理,怎么选?
Nginx 更全能:能做反向代理、静态资源服务、缓存、SSL 卸载,适合作为 Web 服务器 + 反向代理一体化方案。HAProxy 更专注:纯粹做负载均衡,性能更高,支持更丰富的负载均衡算法和健康检查机制。一般中小项目用 Nginx 就够了,大型系统对负载均衡有极致要求的可以考虑 HAProxy。
-
追问二:反向代理怎么透传客户端真实 IP?
通过
X-Forwarded-For(XFF)请求头。每经过一层代理,就把上一跳的 IP 追加到这个头部里。后端从 XFF 头中取第一个非代理 IP 就是真实客户端 IP。但要注意 XFF 可以伪造,生产环境需要配合X-Real-IP或可信代理列表来校验。 -
追问三:CDN 属于正向代理还是反向代理?
CDN 本质上是反向代理。用户请求打到离自己最近的 CDN 节点,CDN 节点缓存了源站内容就直接返回,没有缓存再回源。用户不知道也不关心源站的真实地址。
常见面试变体
- "Nginx 反向代理的原理是什么?"
- "正向代理和反向代理有什么区别?"
- "什么是负载均衡?和反向代理什么关系?"
- "如何保证经过多层反向代理后,后端还能拿到真实客户端 IP?"
记忆口诀
正向代理:客户端找中介,帮我去访问(VPN、代理上网)
反向代理:服务端找门面,帮我接待客户(Nginx、负载均衡)
区分关键:谁在明处谁在暗处——正向代理客户端在暗处,反向代理服务端在暗处
总结
正向代理代理的是客户端,帮客户端 "借道" 访问目标,典型场景是 VPN 和代理上网;反向代理代理的是服务端,帮服务端 "挡在前面" 统一接待请求,典型场景是 Nginx 负载均衡和 API 网关。区分的关键不是 "方向",而是 "谁隐藏在代理后面"。面试时把概念、场景、Nginx 实战配置串起来讲,这道题基本满分。
