nginx原生不支持https正向代理,必须通过源码编译集成ngx_http_proxy_connect_module模块(版本限定1.4.x–1.25.x),启用--with-http_ssl_module并严格匹配补丁;配置独立server块监听端口(如3128),使用resolver解析域名、proxy_connect_allow 443限制隧道目标,客户端需显式配置代理且信任证书链。

Nginx 原生不支持正向代理加密通道(尤其是 HTTPS)服务,因为标准 HTTP 代理无法处理 TLS 握手所需的 CONNECT 方法。若需通过 Nginx 访问 HTTPS 网站或加密 API 服务(如 HTTPS 接口、OAuth 登录页、企业 SaaS 服务等),必须满足技术前提并采用特定配置方式,否则将返回 400 Bad Request 或连接失败。
必须启用 ngx_http_proxy_connect_module 模块
这是实现 HTTPS 正向代理的唯一可行路径,官方 Nginx 不包含该模块:
- 需使用源码编译安装,且版本须在 1.4.x–1.25.x 范围内(例如 1.22.1、1.24.0)
- 编译时显式添加:
--add-module=./ngx_http_proxy_connect_module - 确认已启用 SSL 支持:
--with-http_ssl_module - 模块补丁需与 Nginx 版本严格匹配,否则
CONNECT请求会被直接拒绝
HTTPS 正向代理需独立监听 443 端口并配置 resolver
不能复用 HTTP 的 proxy_pass $scheme://... 写法,必须专设 server 块处理 CONNECT 请求:
- 监听端口建议为 3128 或 8443(避免与真实 HTTPS 服务冲突)
-
resolver必须指定(如resolver 114.114.114.114 valid=30s;),用于解析目标域名 - 仅允许
CONNECT方法,禁用其他请求方法防止滥用 - 示例关键配置:
listen 3128;
resolver 114.114.114.114;
proxy_connect;
proxy_connect_allow 443; # 仅允许连接 443 端口
proxy_connect_timeout 5s;
proxy_connect_read_timeout 5s;
proxy_connect_send_timeout 5s;
}
客户端必须主动配置代理且信任证书链
浏览器或命令行工具不会自动识别 Nginx 正向代理的 HTTPS 能力:
- curl/wget 需显式指定:
curl -x http://192.168.0.97:3128 https://api.example.com - 浏览器不原生支持该模式,需配合插件(如 FoxyProxy)或系统级代理设置(Windows/Linux 的
http_proxy环境变量) - 若上游服务使用私有 CA 签发证书,Nginx 服务器需将根证书加入系统信任库,否则会因证书验证失败中断连接
- 不支持 WebSocket over HTTPS(wss://)和 HTTP/2 CONNECT,这类流量会降级或失败
安全与生产环境的关键限制
即使配置成功,仍存在固有短板,不可忽视:
- 无内置用户认证机制,需额外集成 auth_basic 或对接外部鉴权服务
- 不记录完整 TLS 握手日志,审计能力弱于 Squid/TinyProxy
- DNS 解析由 Nginx 执行,无法实现客户端侧 DNS over HTTPS(DoH)
- 不支持 SNI 透传以外的 TLS 扩展,部分金融/政务类加密服务可能握手异常











