高 基础
正向代理与反向代理#
一句话答案#
正向代理代替客户端发请求(客户端知道代理,服务端不知道真实客户端),反向代理代替服务端收请求(客户端不知道代理,请求被透明转发到后端)。Nginx 是最常用的反向代理。
核心要点
正向代理 vs 反向代理:
| 维度 | 正向代理(Forward Proxy) | 反向代理(Reverse Proxy) |
|---|---|---|
| 代理谁 | 代理客户端,替客户端发请求 | 代理服务端,替服务端收请求 |
| 谁知道代理 | 客户端知道代理存在(主动配置) | 客户端不感知代理(透明转发) |
| 典型场景 | 科学上网、企业出口审计、缓存加速 | 负载均衡、SSL 终端、隐藏后端、缓存 |
| 典型软件 | Squid、V2Ray、Clash | Nginx、HAProxy、Caddy、Envoy |
| 请求方向 | 客户端 → 正向代理 → 目标服务器 | 客户端 → 反向代理 → 后端服务集群 |
正向代理:
Client ──→ [Forward Proxy] ──→ Server
客户端知道代理,服务端只看到代理 IP
反向代理:
Client ──→ [Reverse Proxy] ──→ Backend Server 1
──→ Backend Server 2
──→ Backend Server 3
客户端只知道代理地址,不知道后端服务器plaintext反向代理的核心作用:
- 负载均衡:将请求分发到多个后端实例(轮询/加权/IP Hash/最少连接)
- SSL 终端:在代理层统一处理 HTTPS,后端服务只需处理 HTTP,简化证书管理
- 安全隔离:隐藏后端服务 IP 和端口,外网无法直接访问后端
- 静态资源缓存:反向代理缓存静态文件(JS/CSS/图片),减少后端压力
- 请求过滤:在代理层做限流、黑白名单、请求头改写
Nginx 反向代理典型配置:
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
server 192.168.1.12:8080 backup; # 备用节点
}
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
root /var/www;
expires 30d; # 静态资源缓存 30 天
}
}nginxNginx vs Spring Cloud Gateway:
| 维度 | Nginx | Spring Cloud Gateway |
|---|---|---|
| 定位 | 基础设施层反向代理 | 应用层 API 网关 |
| 职责 | SSL 终端、静态资源、四/七层转发 | 业务路由、鉴权、限流、服务发现 |
| 性能 | C 语言实现,极高吞吐 | Java + WebFlux,吞吐低于 Nginx |
| 服务发现 | 不支持(需手动配置 upstream) | 集成 Nacos/Eureka 动态发现 |
| 典型部署 | 最外层,面向公网 | Nginx 之后,面向微服务集群 |
生产环境常见架构:Client → Nginx(SSL + 静态资源 + 负载均衡)→ Gateway(鉴权 + 路由 + 限流)→ 微服务
面试回答(2分钟版)
正向代理和反向代理的区别在于代理的对象不同。正向代理是代理客户端,客户端主动配置代理地址,通过代理去访问目标服务器,服务端看到的是代理的IP而不是客户端真实IP,典型场景是科学上网和企业出口网关。反向代理是代理服务端,客户端完全不感知代理的存在,请求发到代理后被透明转发到后端服务集群,最典型的就是Nginx。反向代理在后端架构中作用很大:首先是负载均衡,Nginx可以按轮询、加权、IP Hash等策略把请求分发到多个后端实例;其次是SSL终端,在Nginx层统一处理HTTPS加解密,后端服务只需HTTP通信,简化了证书管理和性能开销;第三是安全隔离,后端服务的IP和端口对外完全不可见;第四是静态资源缓存,Nginx直接返回JS/CSS/图片等静态文件不打到后端。在微服务架构中通常Nginx和Spring Cloud Gateway配合使用:Nginx在最外层负责SSL终端、静态资源和基础负载均衡,Gateway在Nginx之后负责业务级路由、鉴权、限流和服务发现。面试中容易混淆的是Nginx和Gateway的职责边界,简单记就是Nginx管基础设施层,Gateway管业务应用层。
追问与易错
追问方向:
- “正向代理和反向代理的区别?”→ 正向代理代理客户端(客户端知道代理,服务端不知道真实客户端),反向代理代理服务端(客户端不感知,请求被透明转发到后端)
- “Nginx 常用的负载均衡策略?”→ 轮询(默认)、加权轮询(weight)、IP Hash(会话保持)、最少连接(least_conn)、一致性哈希(适合缓存场景)
- “Nginx 和 Gateway 怎么配合?”→ Nginx 在最外层负责 SSL 终端、静态资源和基础负载均衡,Gateway 在 Nginx 之后负责业务路由、鉴权、限流和服务发现
- “后端怎么获取客户端真实 IP?”→ 从 X-Forwarded-For 请求头取第一个 IP(多级代理逗号分隔),或从 X-Real-IP 取值,Nginx 需配置 proxy_set_header 传递
易错点:
- ❌ “反向代理就是负载均衡”——负载均衡只是反向代理的功能之一
- ❌ “Nginx 和 Gateway 二选一”——两者职责不同,生产环境通常配合使用
- ❌ “反向代理后 request.getRemoteAddr() 就是客户端 IP”——拿到的是代理 IP,需要读 X-Forwarded-For