正向代理vs反向代理

130 阅读7分钟

1. 基本概念理解

1.1 生活化比喻

代理类型生活比喻核心特点为谁服务
正向代理代购替客户做事,隐藏客户身份为客户端服务
反向代理理发店前台替服务方接客,隐藏内部结构为服务端服务

1.2 技术架构对比

正向代理架构:
客户端 → 正向代理 → 目标服务器
(你)   → (代购)   → (海外商店)

反向代理架构:
客户端 → 反向代理 → 后端服务器
(顾客)  → (前台)   → (理发师)

2. 正向代理详解

2.1 工作原理

用户想访问外部网站:
你的电脑 → 代理服务器 → 目标网站
         (替你访问)

流程:
1. 你告诉代理:"我要访问某个网站"
2. 代理用自己的身份访问目标网站
3. 目标网站看到的是代理的IP,不是你的IP
4. 代理把网站内容返回给你

2.2 正向代理的应用场景

2.2.1 企业网络管理

公司网络架构:
员工电脑 → 公司代理服务器 → 互联网

好处:
- 统一管理员工上网行为
- 过滤恶意网站
- 节省带宽(缓存常用资源)
- 记录访问日志

2.2.2 缓存加速

第一次访问:
用户 → 代理 → 目标网站 → 代理缓存内容 → 返回给用户

后续访问:
用户 → 代理 → 直接返回缓存内容(速度更快)

2.2.3 访问控制

学校/企业网络控制:
学生电脑 → 校园代理 → 互联网
                ↓
        - 屏蔽游戏网站
        - 限制视频网站
        - 记录访问行为
        - 节省带宽

2.3 正向代理配置示例

2.3.1 Squid 正向代理配置

# /etc/squid/squid.conf
http_port 3128                    # 代理端口
cache_mem 256 MB                  # 内存缓存
maximum_object_size 1024 MB       # 最大缓存对象

# 访问控制
acl localnet src 192.168.1.0/24  # 允许的客户端网段
http_access allow localnet        # 允许本地网络访问
http_access deny all              # 拒绝其他访问

# 缓存规则
cache_dir ufs /var/spool/squid 1000 16 256

2.3.2 客户端配置

# Linux 客户端配置
export http_proxy=http://proxy-server:3128
export https_proxy=http://proxy-server:3128

# Windows 客户端配置
# 控制面板 → 网络选项 → 代理设置
# 代理服务器:proxy-server:3128

3. 反向代理详解

3.1 工作原理

用户访问淘宝:
用户浏览器 → Nginx反向代理 → 淘宝服务器集群
           (前台接待)

流程:
1. 用户访问 taobao.com
2. Nginx接收请求:"欢迎光临"
3. Nginx查看哪台服务器有空:"服务器A比较空闲"
4. Nginx转发请求给服务器A
5. 服务器A处理请求并返回结果
6. Nginx把结果返回给用户

3.2 反向代理的应用场景

3.2.1 负载均衡

# 将请求分散到多台服务器
upstream backend-servers {
    server web1.internal:8080 weight=3;  # 权重3
    server web2.internal:8080 weight=2;  # 权重2
    server web3.internal:8080 weight=1;  # 权重1
}

server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://backend-servers;
    }
}

负载分配效果:

1000个请求的分配:
- web1.internal:8080 处理 500个请求 (权重3/6)
- web2.internal:8080 处理 333个请求 (权重2/6)  
- web3.internal:8080 处理 167个请求 (权重1/6)

3.2.2 故障转移

upstream backend-servers {
    server web1.internal:8080 max_fails=3 fail_timeout=30s;
    server web2.internal:8080 max_fails=3 fail_timeout=30s;
    server web3.internal:8080 backup;  # 备用服务器
}

# 工作流程:
# 1. 正常情况:请求分发给 web1 和 web2
# 2. web1 故障:自动切换到 web2 和 web3
# 3. web1 恢复:重新加入负载均衡

3.2.3 SSL 终止

server {
    listen 443 ssl;
    server_name secure.example.com;
    
    # SSL 证书配置
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    
    location / {
        # 后端使用 HTTP,简化配置
        proxy_pass http://backend-servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
    }
}

好处:

  • 只需在反向代理上配置SSL证书
  • 后端服务器无需处理SSL加密解密
  • 统一管理证书更新

3.2.4 缓存加速

# 定义缓存区域
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;

server {
    listen 80;
    server_name example.com;
    
    location /api/products/ {
        proxy_cache my_cache;
        proxy_cache_valid 200 5m;      # 成功响应缓存5分钟
        proxy_cache_valid 404 1m;      # 404错误缓存1分钟
        
        proxy_pass http://backend-servers;
    }
    
    location /static/ {
        proxy_cache my_cache;
        proxy_cache_valid 200 1d;      # 静态资源缓存1天
        
        proxy_pass http://static-servers;
    }
}

3.3 电商网站反向代理实例

# 电商网站完整配置
upstream product-cluster {
    server product1.internal:8080;
    server product2.internal:8080;
    server product3.internal:8080;
}

upstream user-cluster {
    server user1.internal:8080;
    server user2.internal:8080;
}

upstream order-cluster {
    server order1.internal:8080;
    server order2.internal:8080;
}

server {
    listen 80;
    server_name shop.com;
    
    # 静态资源直接返回
    location /static/ {
        root /var/www/static;
        expires 1d;                    # 浏览器缓存1天
        gzip on;                       # 启用压缩
    }
    
    # 商品API - 启用缓存
    location /api/products/ {
        proxy_pass http://product-cluster;
        proxy_cache product_cache;
        proxy_cache_valid 200 5m;      # 商品信息缓存5分钟
        
        # 添加代理头
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    
    # 用户API - 不缓存(数据敏感)
    location /api/users/ {
        proxy_pass http://user-cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    
    # 订单API - 不缓存(实时性要求高)
    location /api/orders/ {
        proxy_pass http://order-cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4. 动态代理配置

4.1 基于变量的动态路由

location /api/ {
    set $upstream_name "com.ststability.traceability.api";
    proxy_pass http://$upstream_name;
}

# 对应的 upstream 定义
upstream com.ststability.traceability.api {
    server traceability-api-1.internal:8080;
    server traceability-api-2.internal:8080;
    server traceability-api-3.internal:8080;
}

4.2 条件路由

# 基于请求参数的动态路由
location /api/ {
    set $upstream_name "default-service";
    
    # 根据版本参数选择服务
    if ($arg_version = "v1") {
        set $upstream_name "api-service-v1";
    }
    if ($arg_version = "v2") {
        set $upstream_name "api-service-v2";
    }
    
    proxy_pass http://$upstream_name;
}

# 请求示例:
# GET /api/data?version=v1  → 路由到 api-service-v1
# GET /api/data?version=v2  → 路由到 api-service-v2

4.3 A/B 测试配置

# 基于用户ID的A/B测试
location /api/ {
    set $upstream_name "api-service-stable";
    
    # 用户ID末位为偶数使用测试版本
    if ($arg_user_id ~ ".*[02468]$") {
        set $upstream_name "api-service-beta";
    }
    
    proxy_pass http://$upstream_name;
}

5. 常用代理软件

5.1 正向代理软件

软件特点适用场景
Squid功能强大,缓存效果好企业网络代理
Privoxy隐私保护,广告过滤个人隐私代理
Apache HTTP Server模块丰富,配置灵活企业级代理服务
Nginx高性能,低资源消耗高并发代理场景

5.2 反向代理软件

软件特点适用场景
Nginx高性能,低资源消耗Web服务器、负载均衡
Apache HTTP Server功能丰富,模块多传统Web服务
HAProxy专业负载均衡高可用架构
Traefik自动服务发现容器化环境

6. 实际应用架构

6.1 企业网络架构

企业内网 → 正向代理 → 互联网
         ↓
    - 访问控制
    - 内容过滤  
    - 缓存加速
    - 日志记录

互联网用户 → 反向代理 → 企业服务器集群
           ↓
      - 负载均衡
      - SSL终止
      - 缓存加速
      - 安全防护

6.2 微服务架构

用户请求 → API网关(反向代理) → 微服务集群
                ↓
        ┌─────────────────┐
        │ 用户服务 x3     │
        │ 商品服务 x5     │
        │ 订单服务 x3     │
        │ 支付服务 x2     │
        └─────────────────┘

7. 性能优化配置

7.1 Nginx 性能优化

# nginx.conf 性能优化配置
worker_processes auto;                    # 自动设置工作进程数
worker_connections 1024;                  # 每个进程最大连接数

# 启用高效的事件模型
events {
    use epoll;                           # Linux下使用epoll
    multi_accept on;                     # 一次接受多个连接
}

http {
    # 启用sendfile
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    
    # 连接超时设置
    keepalive_timeout 65;
    client_max_body_size 50m;
    
    # 启用gzip压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1000;
    gzip_types text/plain text/css application/json application/javascript;
    
    # 缓存配置
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m max_size=1g;
}

7.2 负载均衡算法

# 不同的负载均衡算法
upstream backend {
    # 1. 轮询(默认)
    server web1.example.com;
    server web2.example.com;
    
    # 2. 加权轮询
    # server web1.example.com weight=3;
    # server web2.example.com weight=1;
    
    # 3. IP哈希(同一IP总是访问同一服务器)
    # ip_hash;
    
    # 4. 最少连接
    # least_conn;
    
    # 5. 健康检查
    server web1.example.com max_fails=3 fail_timeout=30s;
    server web2.example.com max_fails=3 fail_timeout=30s;
}

8. 监控和调试

8.1 日志配置

# 自定义日志格式
log_format detailed '$remote_addr - $remote_user [$time_local] '
                   '"$request" $status $body_bytes_sent '
                   '"$http_referer" "$http_user_agent" '
                   'rt=$request_time uct="$upstream_connect_time" '
                   'uht="$upstream_header_time" urt="$upstream_response_time"';

server {
    # 使用详细日志格式
    access_log /var/log/nginx/detailed.log detailed;
    error_log /var/log/nginx/error.log warn;
}

8.2 状态监控

# 启用状态页面
location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;        # 只允许本地访问
    deny all;
}

# 访问 http://localhost/nginx_status 查看状态
# Active connections: 2
# server accepts handled requests
#  16630 16630 31070
# Reading: 0 Writing: 1 Waiting: 1

9. 安全配置

9.1 基本安全设置

server {
    # 隐藏Nginx版本信息
    server_tokens off;
    
    # 防止点击劫持
    add_header X-Frame-Options DENY;
    
    # 防止MIME类型嗅探
    add_header X-Content-Type-Options nosniff;
    
    # XSS保护
    add_header X-XSS-Protection "1; mode=block";
    
    # 限制请求方法
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 405;
    }
    
    # 限制请求大小
    client_max_body_size 10m;
}

9.2 访问控制

# IP白名单
location /admin/ {
    allow 192.168.1.0/24;   # 允许内网访问
    allow 10.0.0.0/8;       # 允许VPN访问
    deny all;               # 拒绝其他访问
    
    proxy_pass http://admin-servers;
}

# 基本认证
location /private/ {
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;
    
    proxy_pass http://private-servers;
}

10. 故障排查

10.1 常见问题和解决方案

问题可能原因解决方案
502 Bad Gateway后端服务器无响应检查后端服务状态
504 Gateway Timeout后端响应超时调整超时设置
413 Request Entity Too Large请求体过大增加client_max_body_size
499 Client Closed Request客户端主动断开检查网络和响应时间

10.2 调试命令

# 检查配置语法
nginx -t

# 查看配置详情
nginx -T

# 重载配置
nginx -s reload

# 查看进程状态
ps aux | grep nginx

# 查看端口监听
netstat -tlnp | grep nginx

# 实时查看日志
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

# 测试连接
curl -I http://localhost
curl -v http://localhost

11. 总结

11.1 核心区别

对比项正向代理反向代理
服务对象客户端服务端
隐藏对象隐藏客户端身份隐藏服务端细节
典型应用企业上网管理、缓存加速负载均衡、缓存加速
配置位置客户端配置服务端配置
用户感知用户知道使用了代理用户不知道有代理

11.2 选择建议

使用正向代理的场景:

  • 需要隐藏客户端身份
  • 企业网络访问控制
  • 缓存常用资源节省带宽
  • 内容过滤和安全防护

使用反向代理的场景:

  • 需要负载均衡
  • SSL终止和安全防护
  • 缓存静态资源
  • 微服务架构的API网关

11.3 最佳实践

  1. 正向代理最佳实践:

    • 合理设置缓存策略
    • 配置访问控制列表
    • 定期清理日志文件
    • 监控代理服务器性能
  2. 反向代理最佳实践:

    • 根据业务需求选择负载均衡算法
    • 配置健康检查和故障转移
    • 合理设置缓存策略
    • 添加安全防护措施
    • 监控后端服务器状态

记忆口诀:正向代理像代购(替客户做事),反向代理像前台(替服务方接客)