面试知识库
基础

正向代理与反向代理#

一句话答案#

正向代理代替客户端发请求(客户端知道代理,服务端不知道真实客户端),反向代理代替服务端收请求(客户端不知道代理,请求被透明转发到后端)。Nginx 是最常用的反向代理。

核心要点

正向代理 vs 反向代理:

维度正向代理(Forward Proxy)反向代理(Reverse Proxy)
代理谁代理客户端,替客户端发请求代理服务端,替服务端收请求
谁知道代理客户端知道代理存在(主动配置)客户端不感知代理(透明转发)
典型场景科学上网、企业出口审计、缓存加速负载均衡、SSL 终端、隐藏后端、缓存
典型软件Squid、V2Ray、ClashNginx、HAProxy、Caddy、Envoy
请求方向客户端 → 正向代理 → 目标服务器客户端 → 反向代理 → 后端服务集群
正向代理:
  Client ──→ [Forward Proxy] ──→ Server
  客户端知道代理,服务端只看到代理 IP

反向代理:
  Client ──→ [Reverse Proxy] ──→ Backend Server 1
                              ──→ Backend Server 2
                              ──→ Backend Server 3
  客户端只知道代理地址,不知道后端服务器
plaintext

反向代理的核心作用:

  1. 负载均衡:将请求分发到多个后端实例(轮询/加权/IP Hash/最少连接)
  2. SSL 终端:在代理层统一处理 HTTPS,后端服务只需处理 HTTP,简化证书管理
  3. 安全隔离:隐藏后端服务 IP 和端口,外网无法直接访问后端
  4. 静态资源缓存:反向代理缓存静态文件(JS/CSS/图片),减少后端压力
  5. 请求过滤:在代理层做限流、黑白名单、请求头改写

Nginx 反向代理典型配置:

Nginx vs Spring Cloud Gateway:

维度NginxSpring 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