有老同事前段时间问我,为何最近几年都没怎么更新博客了。我说这两年实在是太忙了,虽然做的事情还是比较多,但是真的是很少有自己的时间静下来写一下blog。
回到主题,我们有时需要在一些特殊的内网环境访问多个https的网站,但是又没有集中的NAT网关。这个时候可以利用nginx做一个集中的代理。代理HTTP的时候是很简单的,简单配置一下proxy_pass到特定的HTTP地址或者是upstream就行,但是如果目标的网站是多个https的,则因为我们没有证书无法简单实现。
幸运的时随着各种客户端对https sni的支持,可以使用TCP模式的代理来支持这种场景,基于对SSL SNI的识别去选择upstream。一个简单的示例如下:
map $ssl_preread_server_name $selected_upstream {
dockerauth.dockerhub.com upstream_dockerauth;
reg.dockerhub.com upstream_reg;
dauth.dockerhub.com upstream_dauth;
default upstream_dauth;
}
upstream upstream_dockerauth { dockerauth.dockerhub.com :443; }
upstream upstream_reg { server reg.dockerhub.com:443; }
upstream upstream_dauth { server dauth.dockerhub.com:443; }
server {
listen 0.0.0.0:443;
proxy_pass $selected_upstream;
# proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}