在一些特殊场景下,尤其是多网络区的环境中,难免使用proxy来代理请求。其中HTTPS会提供更安全的数据传输,同时也添加了代理配置的复杂性(特别是证书的管理)。

通过nginx ngx_stream_ssl_preread_module模块,可以使用四层代理代理不同的服务。它允许从 ClientHello 消息中提取信息,而不会终止 SSL/TLS,例如提取通过 SNI 请求的服务器名称并保存在变量$ssl_preread_server_name中,于是我们可以通过对该变量进行转发请求到对应的上游服务。

配置示例如下:

proxy 1配置:

1
2
3
4
5
6
7
8
stream {
server {
listen 443;
resolver 8.8.8.8;
proxy_pass 10.0.0.4:10443;
ssl_preread on;
}
}

proxy 2 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
stream {
map $ssl_preread_server_name $name {
baidu.com prod;
stg.baidu.com stage;
}

upstream prod {
server baidu.com:443;
}

upstream stage {
server stg.baidu.com:443;
}

server {
listen 10443;
resolver 8.8.8.8;
proxy_pass $name;
ssl_preread on;
}
}

做好域名解析后,在本地curl/浏览器访问资源,即可获得对应的资源。

1
curl https://baidu.com

参考文档

http://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html: ngx_stream_ssl_preread_module 模块(1.11.5)允许从 ClientHello 消息中提取信息,而不会终止 SSL/TLS,例如提取通过 SNI 请求的服务器名称。默认情况下不构建此模块,您可以在构建时使用 –with-stream_ssl_preread_module 配置参数启用此模块。