在用nginx正向代理https网站中,了解到如果需要用nginx做正向代理,来支持https的代理,如果nginx不作用ssl的terminator(ssl终结点),那么可行的办法就是用http协议支持的CONNECT请求来构建client->nginx, nginx->rs 之间的连接通道,由于官方原生的nginx是不支持CONNECT请求的,所以需要用到tengine上的ngx_http_proxy_connect_module模块,并且需要对原生nginx打上相应的补丁。本文就对ngx_http_proxy_connect_module模块的实现原理从源码层面来进行一个详细的分析。本文分为上下两部分,上部分主要从配置指令和模块内置变量来说明模块如何使用,下部分主要从源码的层面来进行详细分析。
在用nginx正向代理https网站中已经有详细的描述,这里不再赘述。
接下来对ngx_http_proxy_connect_module模块支持的配置指令进行说明。
指 令: proxy_connect
默认值: none
上下文: server
功能描述: 开启对HTTP方法"CONNECT"的支持。
指 令: proxy_connect_allow all | [port ...] | [port-range ...]
默认值: 443 563
上下文: server
功能描述:指定允许开启CONNECT方法的端口。
默认情况下,只有443和563端口被允许。
使用如下参数来修改默认行为:
all值允许所有端口。
port指定允许的特定端口。
port-range指定允许的指定端口范围,示例:
proxy_connect_allow 1000-2000 3000-4000; # 允许端口范围1000-2000 和 3000-4000
指 令: proxy_connect_connect_timeout time
默认值: none
上下文: main, server
功能描述: 指定与对端服务器建联的超时时间,单位y/M/w/d/h/m/s。
指 令: proxy_connect_read_timeout time
默认值: 60s
上下文: main, server
功能描述: 指定读对端服务器数据的等待时间。
超时时间仅在两次读数据之间生效,而不是整个应答数据时间。
如果对端服务器在超时时间内未发送任何数据,连接将被关闭。
指 令: proxy_connect_send_timeout time
默认值: 60s
上下文: server
功能描述: 指定发送数据到对端服务器的等待时间。
超时时间仅在两次发送数据之间生效,而不是整个请求时间。
如果对端服务器在等待时间内未收取任何数据,连接将被关闭。
指 令: proxy_connect_address address | off
默认值: none
上下文: main, server
功能描述: 指定对端服务器的地址。该值可以包含变量。
值`off`或者不设置该指令,则对端服务器的地址是通过CONNECT请求行的host字段提取并解析(如查询DNS)出来得到。
指 令: proxy_connect_bind address [transparent] | off
默认值: none
上下文: main, server
功能描述: 指定与对端服务器的连接的来源地址。
该值可以包含变量。值"off"或者不设置该指令将由系统自动分配来源地址和端口。
"transparent"参数值使与对端服务器的连接的来源地址为非本地地址。
示例如下(使用客户端地址作为来源地址):
proxy_connect_bind $remote_addr transparent;
为了使`transparent`参数生效,需要配置内核路由表去截获来自对端服务器的网络流量。
指 令: proxy_connect_response response
默认值: none
上下文: main, server
功能描述: 指定和上游服务器连接成功后,给客户端发回的HTTP响应内容,该响应内容应该符合HTTP协议规范并包括HTTP响应头的信息,本指令可以包含动态变量,示例如下:
proxy_connect_response "HTTP/1.1 200 Connection Established\r\n
Proxy-agent: nginx\r\n\r\nCONNECT OK, Upstream addrress: $connect_addr"
指 令: proxy_connect_send_lowat byte
默认值: 0
上下文: main, server
功能描述: 控制发送缓冲区中的数据量,可用单位Kk/Mm/Gg:示例如下:
proxy_connect_send_lowat 1024;
ngx_http_proxy_connect_module模块也提供了若干动态变量,关于动态变量的原理可以查看[[深入理解nginx的动态变量机制]]。
只读变量,用于获取CONNECT请求行的主机名(host)字段。
只读变量,用于获取CONNECT请求行的端口(port)字段。
只读变量,用于获取上游服务器的IP地址和端口,如"192.168.1.5:12345"。
可写变量, 用于获取和设置proxy_connect_connect_timeout指令的超时时间。
可写变量, 用于获取和设置proxy_connect_read_timeout指令的超时时间。
可写变量, 用于获取和设置proxy_connect_send_timeout指令的超时时间。
可写变量,用于获取和设置proxy_connect_response指令设置的给客户端的响应内容。
只读变量,用于获取实际进行域名解析所花的时间,单位: ms。
只读变量,用于获取实际从开始发起连接请求到连接建立所花的时间,单位: ms。
只读变量,用于获取从开始发起连接请求到收到从上游服务器发送过来的第一个字节所花的时间,单位: ms。
未完待续:深入理解ngx_http_proxy_connect_module模块(下)