nginx大家都不陌生,但多数人只用它做Web服务器或反向代理。其实只要几行配置,nginx也能变身正向代理服务器,帮你统一出口、隐藏来源IP。这篇教程从原理讲到实操,手把手带你用nginx配出一个可用的HTTP正向代理。
先搞懂:什么是正向代理
概念其实很简单:正向代理就是替客户端去访问目标网站的"中间人"。你把请求交给代理服务器,由它转发给目标站点,再把结果原样带回来。对目标站点来说,它只看到代理服务器的IP,看不到你的真实IP。
举个生活化的例子:你想从一家不熟悉的店里买东西,但又不想暴露自己的住址,于是找了一位跑腿小哥代买。店家只认识跑腿小哥,完全不知道背后是谁。正向代理干的就是这个活。
很多人容易把正向代理和反向代理搞混,一张表说清楚:
| 对比项 | 正向代理 | 反向代理 |
|---|---|---|
| 服务对象 | 客户端(帮用户出头) | 服务端(帮网站挡事) |
| 谁来配置 | 客户端主动指定代理 | 服务器管理员设置 |
| 目标站看到谁 | 代理服务器的IP | 反向代理的IP |
| 典型用途 | 隐藏来源、统一出口、访问控制 | 负载均衡、安全防护 |
nginx做正向代理的原理
nginx平时更多被用作反向代理,但它同样可以承担正向代理的角色,核心靠两条配置:
1. proxy_pass 变量转发。普通配置里 proxy_pass 后面写死一个地址,而做正向代理时,我们把它写成 $scheme://$host$request_uri,意思是"用户访问哪个网站,就转发到哪个网站",nginx不再关心目标是谁,只负责当搬运工。
2. resolver 指定DNS。因为目标域名是动态传入的,nginx必须自己解析域名,所以要配置 resolver(比如 223.5.5.5),否则转发时会直接报错。
还有一个绕不开的点:HTTPS的处理。浏览器访问HTTPS网站时,会先发一个 CONNECT 请求建立隧道,而nginx原生并不支持CONNECT方法,需要借助第三方模块 ngx_http_proxy_connect_module。纯HTTP的正向代理则不需要额外模块,开箱即用。
nginx配置http正向代理完整教程
下面以一台Linux服务器为例,带你配出一个可用的HTTP正向代理。
第一步:确认nginx环境
如果只是做HTTP代理,直接用系统里已安装的nginx即可,先确认版本:
nginx -v
# 输出示例:nginx version: nginx/1.24.0
第二步:编写代理配置
编辑配置文件(一般是 /etc/nginx/nginx.conf 或 conf.d 下的自定义文件),加入下面这段:
server {
# 代理监听端口,可自定义
listen 8888;
# DNS解析器,用于解析用户要访问的域名
resolver 223.5.5.5 ipv6=off;
resolver_timeout 5s;
location / {
# 用户访问什么,就转发什么
proxy_pass $scheme://$host$request_uri;
# 透传必要的请求头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 超时控制,避免请求卡死
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
}
}
几个关键点解释一下:
listen 8888:代理服务的端口,建议避开80、443等常用端口,减少冲突。
resolver:必须配置,否则nginx无法解析动态传入的域名。
proxy_pass $scheme://$host$request_uri:这是正向代理的灵魂,把请求原样转发出去。
第三步:检查并重载配置
# 检查语法
nginx -t
# 没问题后重载
nginx -s reload
看到 syntax is ok 和 test is successful,说明配置已经生效。
验证代理是否生效
配置完成后,用curl指定代理来测试,最直观:
# 通过代理访问IP查询站点
curl -x http://你的服务器IP:8888 http://myip.ipip.net
如果返回的IP是你代理服务器的IP,而不是你本机的IP,恭喜,正向代理已经跑通了。
浏览器端也可以验证:在系统或浏览器的代理设置里,把HTTP代理指向服务器IP和8888端口,再访问任意IP查询网站,就能看到出口IP的变化。
想让代理支持HTTPS?加上这个模块
上面这套配置只对HTTP生效。如果直接用它访问HTTPS站点:
curl -x http://你的服务器IP:8888 https://example.com
# 报错:Received HTTP code 400 from proxy
原因是nginx原生不处理CONNECT隧道请求。解决办法是给nginx打上 ngx_http_proxy_connect_module 补丁:
# 1. 下载模块
git clone https://github.com/chobits/ngx_http_proxy_connect_module.git
# 2. 进入nginx源码目录打补丁(补丁版本按nginx版本选择)
cd nginx-1.24.0
patch -p1 < ../ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_102101.patch
# 3. 重新编译安装
./configure --add-module=../ngx_http_proxy_connect_module
make && make install
然后在server块里追加几行:
server {
listen 8888;
# 开启CONNECT隧道支持
proxy_connect;
proxy_connect_allow 443 80;
proxy_connect_connect_timeout 10s;
resolver 223.5.5.5 ipv6=off;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $host;
}
}
重载后再测HTTPS,就能正常返回了。
nginx正向代理的局限,以及更省心的选择
自己用nginx搭正向代理,适合学习原理、内网统一出口这类轻量场景。但真到业务里用,几个短板很快会暴露:
| 痛点 | 说明 |
|---|---|
| 出口IP单一 | 所有请求都从你这台服务器出去,IP固定,容易被目标站识别和限制 |
| 维护成本高 | 模块编译、HTTPS补丁、DNS、超时参数都要自己调,出问题自己排查 |
| 无IP轮换能力 | nginx本身不提供IP池,需要换IP时只能手动换服务器 |
| 稳定性看机器 | 带宽、延迟完全取决于你那台服务器,没有冗余 |
如果你的业务需要大量、可轮换的国内IP——比如数据采集、价格监控、多账号运营——更务实的做法是直接使用专业的代理IP服务。天启HTTP就是面向国内业务场景的代理IP服务商,提供海量的国内IP池,支持API批量提取、高匿名访问,稳定性和并发能力都远超自建方案,省去了自己维护服务器和IP资源的麻烦。
常见问题
Q: nginx正向代理配置好了,为什么访问HTTPS网站报400?
A: 因为nginx原生不支持CONNECT方法。需要编译安装 ngx_http_proxy_connect_module 模块,并在server块中开启 proxy_connect 指令,具体步骤见上文。
Q: 配置里不写resolver会怎样?
A: nginx会无法解析动态传入的域名,转发时直接报错。做正向代理必须配置resolver,建议使用稳定的公共DNS,如223.5.5.5。
Q: nginx正向代理能隐藏我的真实IP吗?
A: 可以。目标站点只能看到代理服务器的出口IP。但要注意,出口IP是固定的,如果目标站对这个IP做了限制,所有请求都会失败。
Q: 自建nginx代理和用天启HTTP这类代理服务,怎么选?
A: 想学习原理、内网统一出口、请求量小,自建nginx够用;业务需要大量IP轮换、高并发、高稳定,直接选天启HTTP这类专业服务更省心,通过API即可批量获取IP,无需自己维护服务器。
Q: nginx正向代理支持SOCKS5吗?
A: 不支持。nginx的proxy模块只处理HTTP协议,需要SOCKS5能力要考虑其他方案。





