前几天我帮一个朋友看 Nginx 配置。他把 proxy_pass 写好了,但问了我一句:
“我这个是不是正向代理?”
我看了一眼,其实是反向代理。
这类问题很常见。很多人一看到“代理”两个字,就默认是同一回事。但在 Nginx 里,正向代理和反向代理虽然都叫代理,站的位置完全不同。
我一般用一句话区分:
正向代理,是客户端找代理出去;反向代理,是服务端放代理在前面接请求。
正向代理:替客户端访问外部资源
正向代理站在客户端这一边。
请求关系大概是:
text复制
客户端 → 正向代理 → 目标服务器
客户端不直接访问目标网站,而是把请求交给代理服务器,由代理服务器替它访问目标网站。
目标服务器看到的,通常是代理服务器,而不是原始客户端。
典型场景包括:
- 内网机器通过统一出口访问外网;
- 开发环境临时调试外部接口;
- 公司网关统一做访问审计;
- 采集任务统一管理出口 IP;
- 客户端不希望直接暴露真实来源。
这里的重点是:代理替客户端出去。
如果你需要在客户端、程序或系统网络里配置代理地址,那大概率就是正向代理。
反向代理:替后端服务接收外部请求
反向代理站在服务端这一边。
请求关系大概是:
text复制
用户 → Nginx → 后端服务
用户访问的是 Nginx 暴露出来的域名,真实后端服务藏在 Nginx 后面。
比如用户访问:
text复制
https://example.com/api/user
Nginx 实际可能转发到:
text复制
http://127.0.0.1:8080/user
用户不知道后面是什么服务、什么端口、几台机器。它只知道访问一个域名。
这就是反向代理的典型用途:
- 网站统一入口;
- API 请求转发;
- HTTPS 证书统一管理;
- 后端服务隐藏;
- 多个服务共用一个域名;
- 负载均衡;
- 缓存、限流、压缩。
大多数线上网站用 Nginx,主要就是用它做反向代理。
一张表看懂区别
| 对比项 | 正向代理 | 反向代理 |
|---|---|---|
| 代理站在哪边 | 客户端一侧 | 服务端一侧 |
| 替谁工作 | 替客户端访问外部资源 | 替服务端接收请求 |
| 隐藏谁 | 隐藏客户端 | 隐藏真实后端 |
| 谁配置 | 客户端或客户端所在网络 | 服务端部署方 |
| 用户是否感知 | 通常需要配置代理 | 一般无感知 |
| 常见场景 | 统一出口、采集代理、访问外部资源 | 网站入口、API 转发、负载均衡 |
| Nginx 是否擅长 | 能做简单场景 | 非常成熟 |
Nginx 反向代理配置示例
最常见的反向代理配置是这样:
nginx复制
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1: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-Proto $scheme;
}
}
这段配置表示:
用户访问 example.com,Nginx 接住请求,然后转发给本机 8080 端口的后端服务。
几个头字段也别省:
Host:把原始域名传给后端;X-Real-IP:传递用户真实 IP;X-Forwarded-For:记录请求经过的代理地址;X-Forwarded-Proto:告诉后端原始请求是 HTTP 还是 HTTPS。
不少线上问题不是 proxy_pass 写错,而是这些头没传好。
Nginx 正向代理配置示例
Nginx 也可以做简单 HTTP 正向代理:
nginx复制
server {
listen 8888;
resolver 8.8.8.8;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
}
客户端把代理地址设置为:
text复制
http://代理服务器IP:8888
之后客户端访问外部 HTTP 网站,请求会先到 Nginx,再由 Nginx 去访问目标站点。
但这段配置更适合说明概念,不建议直接当完整生产方案。因为 HTTPS 正向代理通常需要 CONNECT 隧道,原生 Nginx 的 HTTP 模块并不完整支持。真要长期跑,通常会用专门的正向代理服务,或者确认 Nginx 已加载相关第三方模块。
最后说一句
判断正向代理和反向代理,不要只看有没有 proxy_pass。
你要看它替谁办事。
替客户端出去,是正向代理。
替服务端接请求,是反向代理。
做网站入口、API 转发、负载均衡,按反向代理理解。
做统一出口、采集代理、外部资源访问,按正向代理理解。
这个方向判断清楚,Nginx 配置就不容易跑偏。