nginx正向代理需依赖ngx_http_proxy_connect_module模块支持https隧道,通过配置listen端口、resolver、proxy_connect指令及客户端显式设置代理实现;默认不支持socks或透明代理,仅适用于curl或浏览器手动配置的http/https请求场景。

正向代理不是 Nginx 的原生强项,它默认更擅长反向代理。但通过合理配置和 Docker 封装,可以快速构建一个轻量、隔离、可复用的 Nginx 正向代理服务,适用于开发测试、内网访问外网、或统一出口管控等场景。
明确正向代理的适用边界
Nginx 本身不支持 SOCKS 或 HTTP CONNECT 隧道的完整实现(如 Squid 那样),但它可通过 proxy_connect 模块支持标准 HTTP CONNECT 方法,用于代理 HTTPS 请求(如浏览器访问 https://example.com)。对 HTTP 明文请求,也可用 proxy_pass 转发。注意:Nginx 正向代理需客户端显式配置代理地址(如浏览器设为 http://192.168.1.100:8080),不能自动拦截流量。
- 仅适用于客户端主动发起代理请求的场景(如 curl -x、浏览器手动设置)
- 不替代系统级透明代理或防火墙 NAT 出口
- 生产环境建议搭配认证(Basic Auth)或 IP 白名单,避免被滥用
准备带 proxy_connect 模块的镜像
官方 Nginx 镜像不含 proxy_connect 模块,需使用已编译好的第三方镜像,或自行构建。推荐直接拉取成熟镜像:
-
richarvey/nginx-proxy-connect:latest(轻量、Alpine 基础、预编译模块) - 或使用
nginx:alpine+ 自定义编译(复杂,测试环境不建议)
执行命令拉取:
编写最小化配置文件
在宿主机新建 forward.conf,放在例如 /opt/nginx-forward/conf.d/ 目录下:
server 0.0.0.0:8080;
}
server {
listen 8080;
resolver 114.114.114.114 valid=30s;
proxy_connect;
proxy_connect_allow 443;
proxy_connect_timeout 10s;
proxy_connect_auth_basic "Forward Proxy";
proxy_connect_auth_basic_user_file /etc/nginx/.htpasswd;
}
-
resolver指定 DNS,确保能解析目标域名 -
proxy_connect_allow 443表示只允许建立到 443 端口的隧道(即 HTTPS) -
.htpasswd文件需提前生成(可用htpasswd -c .htpasswd user1)
一键启动容器
运行以下命令,将配置、认证文件和日志目录挂载进去:
docker run -d \--name nginx-forward \
-p 8080:8080 \
-v /opt/nginx-forward/conf.d:/etc/nginx/conf.d:ro \
-v /opt/nginx-forward/.htpasswd:/etc/nginx/.htpasswd:ro \
-v /opt/nginx-forward/logs:/var/log/nginx \
--restart=unless-stopped \
richarvey/nginx-proxy-connect:latest
- 端口映射
-p 8080:8080对外暴露代理服务 - 所有挂载路径设为只读(
:ro),提升安全性 -
--restart=unless-stopped保证意外退出后自动恢复
验证是否生效:在另一台机器上执行
curl -x http://:8080 https://httpbin.org/ip若返回 JSON 中含真实出口 IP,说明正向代理已通。











