参考:
https://blog.csdn.net/william_n/article/details/127387009
AI问答
Nginx 正向代理 vs 反向代理详解
1. 正向代理(Forward Proxy)
定义
- 客户端主动配置的代理服务器,代表客户端向外部服务器发送请求。
- 隐藏客户端真实 IP,突破访问限制(如翻墙)。
工作原理
客户端 → 正向代理 → 互联网 → 目标服务器
- 客户端明确知道自己使用了代理(如浏览器设置代理服务器)。
- 目标服务器看到的是代理服务器的 IP,而非客户端真实 IP。
典型用途
- 企业内网访问外网(所有员工流量经过公司代理)。
- 科学上网(通过代理访问被封锁的网站)。
- 缓存加速(代理服务器缓存常用资源)。
Nginx 配置正向代理
Nginx 默认不支持正向代理(需额外模块如 ngx_http_proxy_connect_module
):
server {listen 3128; # 代理端口resolver 8.8.8.8; # DNS解析服务器location / {proxy_pass http://$http_host$request_uri; # 转发到目标地址proxy_set_header Host $http_host;}
}
- 客户端需手动配置代理(如浏览器设置
SOCKS5://代理IP:3128
)。
2. 反向代理(Reverse Proxy)
定义
- 服务端部署的代理服务器,代表后端服务器接收客户端请求。
- 隐藏后端真实 IP,实现负载均衡、安全防护等。
工作原理
客户端 → 反向代理 → 后端服务器(Server 1/2/3...)
- 客户端不知道后端服务器的存在(以为代理就是目标服务器)。
- 后端服务器看到的是代理服务器的 IP,而非客户端 IP。
典型用途
- 负载均衡(将请求分发到多个后端服务器)。
- 隐藏后端架构(防止直接暴露服务器IP)。
- SSL 终止(在代理层处理 HTTPS 加解密)。
- 缓存静态资源(减轻后端压力)。
Nginx 配置反向代理
server {listen 80;server_name example.com;location / {proxy_pass http://backend_servers; # 转发到后端服务器组proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}upstream backend_servers {server 192.168.1.100:8080; # 后端服务器1server 192.168.1.101:8080; # 后端服务器2server 192.168.1.102:8080; # 后端服务器3
}
3. 核心区别对比
特性 | 正向代理 | 反向代理 |
---|---|---|
配置方 | 客户端(如浏览器设置代理) | 服务端(Nginx 服务器配置) |
隐藏对象 | 隐藏客户端 IP | 隐藏后端服务器 IP |
客户端感知 | 客户端知道自己在用代理 | 客户端无感知 |
典型场景 | 科学上网、内网访问外网 | 负载均衡、API 网关、CDN |
Nginx 支持 | 需额外模块(非原生支持) | 原生支持(proxy_pass 指令) |
4. 高级用法示例
(1) 反向代理 + 负载均衡
upstream backend {least_conn; # 最少连接算法server 10.0.0.1:80 weight=3; # 权重3server 10.0.0.2:80;server 10.0.0.3:80 backup; # 备用服务器
}server {listen 80;location / {proxy_pass http://backend;}
}
(2) 反向代理 + SSL 终止
server {listen 443 ssl;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;location / {proxy_pass http://backend; # 明文转发到后端}
}
(3) 正向代理(需编译模块)
# 编译 Nginx 时添加模块
./configure --add-module=/path/to/ngx_http_proxy_connect_module
5. 如何选择?
- 用正向代理:当需要客户端主动通过代理访问外部资源(如爬虫、翻墙)。
- 用反向代理:当需要保护后端服务器、负载均衡或统一入口(如 Web 应用)。
6. 常见问题
Q1: Nginx 能同时做正向和反向代理吗?
- 可以,但需分开配置(正向代理需额外模块支持)。
Q2: 反向代理会影响性能吗?
- 会增加少量延迟(代理层处理),但可通过缓存和负载均衡优化。
Q3: 如何调试代理问题?
- 检查日志:
tail -f /var/log/nginx/access.log tail -f /var/log/nginx/error.log
- 验证请求头:
curl -v http://example.com
掌握这两种代理模式,你就能灵活应对各种网络架构需求! 🚀