我正在尝试根据主机名将 SSL 请求转发到我的机器上运行的子守护程序。为了实现这种行为,我尝试使用 nginx,它将充当反向代理/路由器。
我的配置文件:
# ...
location / {
proxy_set_header Host $http_host;
if ($host = 'hostname01.example.com') { proxy_pass https://127.0.0.1:8001; }
if ($host = 'hostname02.example.com') { proxy_pass https://127.0.0.1:8002; }
if ($host = 'hostname03.example.com') { proxy_pass https://127.0.0.1:8003; }
if ($host = 'hostname04.example.com') { proxy_pass https://127.0.0.1:8004; }
if ($host = 'hostname01.example1.com') { proxy_pass https://127.0.0.1:8005; }
if ($host = 'hostname01.example2.com') { proxy_pass https://127.0.0.1:8006; }
if ($host = 'hostname01.example3.com') { proxy_pass https://127.0.0.1:8007; }
if ($host = 'hostname01.example4.com') { proxy_pass https://127.0.0.1:8008; }
# ...
}
但是,由于 SSL 的特性,主机也是加密的。尝试请求 URL 时,我得到的是OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
。让其中一个守护进程监听端口 443 就可以了。
是否可以使用 nginx 进行此类设置?如果没有,是否有工具可以实现此行为?
每个子服务都使用自己的 SSL 证书。一个想法是为每个服务使用不同的机器,让它们监听 443 本身,但这正是我想要避免的。
对此有什么想法吗?
答案1
是否可以使用 nginx 进行此类设置?如果没有,是否有工具可以实现此行为?
正如您已经注意到的,您的反向代理对 URI 或 HTTP 标头一无所知,因为这些信息被封装并加密在 TLS 协议中。基于名称的虚拟主机无法轻易与 TLS 配合使用。
此规则唯一值得注意的例外是 TLS 的服务器名称指示扩展,但这需要服务器的支持以及全部潜在客户。NGNIX 支持 SNI在服务器端,但我认为它仍然需要终止应用程序的 TLS 连接。HAproxy能够根据 SNI 提供的主机名做出后端决策而不终止隧道-也许你想调查一下这一点。
如果你能拿到一张包含所有主机名 *.example*.com´组合为存储区域网络属性,您可以使用此证书设置 NGNIX 以终止所有隧道,检查标头并根据值作为反向代理传递流量。这种解决方案具有获得更多潜在客户支持的机会但是有一个明显的缺点,那就是每次需要从列表中添加或删除主机名时都需要重新颁发证书。