Nginx原生不支持HTTPS正向代理,需编译ngx_http_proxy_connect_module模块以处理CONNECT请求建立TLS隧道;配置须指定resolver、proxy_connect_allow 443、超时参数,并通过http://IP:port设置客户端代理。

Nginx 本身不是为正向代理设计的,尤其面对 HTTPS 流量时,它默认不支持 CONNECT 方法,也就无法建立 TLS 隧道。所谓“加密网关”,本质是透传 HTTPS 加密流量的隧道代理,而非解密重签(即非中间人)。要让内网服务器通过 Nginx 下载 GitHub、npm、PyPI、Docker Hub 等外部依赖,关键不是“加速”,而是可靠打通 HTTPS 出口——而这个能力,标准 Nginx 原生不具备。
下面直击重点,分三类场景说明配置逻辑与实操要点:
HTTP 依赖下载(纯明文,极少见,仅限测试或老旧内部源)
适用于:http:// 开头的镜像源、旧版 Maven 仓库、未启用 HTTPS 的私有包管理器。
- 可直接用
proxy_pass,无需额外模块 - 客户端需设置
http_proxy=http://nginx-ip:port - 配置示例(监听 8080):
server { listen 8080; resolver 114.114.114.114; location / { proxy_pass $scheme://$host$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - ⚠️ 注意:浏览器或现代工具(如 curl 8.0+)可能拒绝该模式;仅推荐用于
curl -x或 CI 脚本中明确指定代理的场景。
HTTPS 依赖下载(主流需求,必须支持 CONNECT)
适用于:https://github.com、https://registry.npmjs.org、https://pypi.org、https://docker.io 等全部主流源。
必须编译安装
ngx_http_proxy_connect_module模块Nginx 版本需严格匹配补丁(如 nginx-1.20.2 →
proxy_connect_rewrite_1018.patch)-
关键配置项不可省略:
-
proxy_connect;— 启用 CONNECT 处理 -
proxy_connect_allow 443 563;— 仅允许目标端口(443 是 HTTPS 标准端口) -
resolver必须显式指定(不能靠系统 DNS) -
proxy_connect_timeout建议设为10s,避免卡住构建流水线
-
-
典型 server 块(监听 3128,兼容多数工具默认端口):
server { listen 3128; resolver 114.114.114.114 ipv6=off; proxy_connect; proxy_connect_allow 443; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; location / { proxy_pass https://$host$request_uri; } } -
✅ 客户端生效方式(任选其一):
- Linux 全局:
export https_proxy=http://nginx-ip:3128(注意协议写http://,不是https://) - Docker 构建:在
Dockerfile中加ENV HTTP_PROXY=http://nginx-ip:3128 HTTPS_PROXY=http://nginx-ip:3128 - pip:
pip install --proxy http://nginx-ip:3128 requests - yum/dnf:在
/etc/yum.conf中添加proxy=http://nginx-ip:3128
- Linux 全局:
安全与稳定性增强(生产必备)
单纯能通 ≠ 可靠可用。CI/CD 场景下常因以下问题失败:
-
无访问控制 → 所有知道 IP 的机器都能用,易被滥用
解法:加白名单allow 192.168.10.0/24; allow 127.0.0.1; deny all;
DNS 解析失败导致超时 → 尤其在容器或精简镜像中
解法:固定resolver,禁用 IPv6(加ipv6=off),并设resolver_timeout 5s-
长连接或 WebSocket 超时中断下载(如
git clone、docker pull)
解法:在location /内补充:proxy_http_version 1.1; proxy_set_header Connection ''; proxy_buffering off;
日志缺失,排错困难
解法:开启独立 access/error 日志,记录$request和$status,便于追踪哪个依赖拉取失败。
基本上就这些。Nginx 正向代理不是“开箱即用”的功能,它是一套需手动编译、版本对齐、参数调优的定制链路。如果你追求开箱即用、带认证、审计、缓存和 WebSocket 支持,Squid 或 TinyProxy 更合适;但若已有 Nginx 运维体系,且只需支撑 CI 流水线中的 HTTPS 依赖下载,这套方案足够轻量、可控、可集成进现有监控体系。


















