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 最佳实践
-
正向代理最佳实践:
- 合理设置缓存策略
- 配置访问控制列表
- 定期清理日志文件
- 监控代理服务器性能
-
反向代理最佳实践:
- 根据业务需求选择负载均衡算法
- 配置健康检查和故障转移
- 合理设置缓存策略
- 添加安全防护措施
- 监控后端服务器状态
记忆口诀:正向代理像代购(替客户做事),反向代理像前台(替服务方接客)