正向代理与反向代理

理解正向代理和反向代理的区别及应用场景

问题

正向代理与反向代理的区别是什么?

解答

正向代理

正向代理代理的是客户端,服务端不知道真实的客户端是谁。

客户端 -> 正向代理 -> 服务端
         (代理客户端)

典型场景:

  • 科学上网(VPN)
  • 访问受限资源
  • 隐藏客户端 IP
# 正向代理配置示例
server {
    listen 8080;
    
    location / {
        # 代理到目标服务器
        proxy_pass http://$http_host$request_uri;
    }
}

反向代理

反向代理代理的是服务端,客户端不知道真实的服务端是谁。

客户端 -> 反向代理 -> 服务端
         (代理服务端)

典型场景:

  • 负载均衡
  • 隐藏服务器真实 IP
  • SSL 终止
  • 缓存静态资源
# 反向代理配置示例
upstream backend {
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
}

server {
    listen 80;
    server_name example.com;
    
    location / {
        # 反向代理到后端服务器集群
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

对比图示

正向代理:
[客户端A] ─┐
[客户端B] ─┼─> [正向代理] ──> [服务端]
[客户端C] ─┘
           客户端知道代理存在,服务端不知道真实客户端

反向代理:
                          ┌─> [服务端A]
[客户端] ──> [反向代理] ──┼─> [服务端B]
                          └─> [服务端C]
             客户端不知道真实服务端,服务端知道代理存在

关键点

  • 代理对象不同:正向代理代理客户端,反向代理代理服务端
  • 隐藏对象不同:正向代理隐藏客户端,反向代理隐藏服务端
  • 配置位置不同:正向代理配置在客户端,反向代理配置在服务端
  • 用途不同:正向代理用于访问控制,反向代理用于负载均衡、安全防护
  • 感知方不同:正向代理客户端主动配置,反向代理对客户端透明