正向代理:代表客户端出击
正向代理与反向代理虽然都叫"代理",但服务的对象完全相反,这是理解两者的关键。正向代理部署在客户端一侧,由客户端主动配置,代表内网用户去访问外部服务:企业出口的 Squid 缓存代理、个人翻墙用的自建代理、爬虫使用的 IP 轮换代理,都属于正向代理。它的特征是目标服务器不知道最终用户是谁,只看到代理在访问;而客户端清楚地知道自己在用代理。
反向代理:代表服务端接客
反向代理部署在服务端入口,用户通常毫无察觉。网站把真实服务器藏在 Nginx、HAProxy 或云负载均衡器后面,用户请求先到反向代理,再由它分发给后端的某一台上游服务器。反向代理承担的典型职责包括负载均衡、TLS 终结、静态资源直出、请求限速,以及把应用服务器与公网隔离以缩小攻击面。此时不知道真相的一方换成了客户端:用户以为自己在和网站本体通信,实际对接的是代理。
核心差异对比表
| 对比维度 | 正向代理 | 反向代理 |
|---|---|---|
| 服务对象 | 客户端(用户侧) | 服务端(网站侧) |
| 部署位置 | 内网出口或用户终端附近 | 机房入口、真实服务器之前 |
| 谁感知代理存在 | 客户端知道,服务端不清楚 | 服务端知道,客户端通常无感 |
| 典型用途 | 隐私保护、缓存加速、访问控制、IP 轮换 | 负载均衡、TLS 终结、安全防护、灰度发布 |
| 代表软件 | Squid、3proxy、Shadowsocks 客户端链路 | Nginx、HAProxy、Traefik、CDN 边缘节点 |
一个便于记忆的类比:正向代理是"替你去买东西的代购",反向代理是"替商家接待客人的前台"。CDN 本质上就是分布在全球的反向代理集群。
Nginx 反向代理最小配置
以下是一段可直接使用的 Nginx 反向代理配置,把进入 80 端口的请求转发给内网上游,并传递真实客户端 IP:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://192.168.1.10:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
其中 proxy_set_header 三行是把原始请求信息透传给上游的关键,漏掉 X-Forwarded-For 会导致后端日志里记录的全是代理内网 IP。写好后用 nginx -t 检查语法,再 nginx -s reload 平滑生效。
使用提醒
两种代理技术都应服务于正当用途:正向代理使用者需遵守目标网站条款与当地法规,不做违法访问;反向代理运维者应正确配置头部透传、访问日志与安全策略,履行数据保护义务。
Article ID: 12
(本文仅供技术交流,请遵守法律法规)