这些天来,我正在使用nginx将ssl负载转发到上游tcp服务器,最终的nginx配置是在大量实验之后完成的:
stream {
map $ssl_server_name $stream_map {
aby3_task_1 upstream_task_1;
aby3_task_2 upstream_task_2;
}
upstream upstream_task_1 {
server 127.0.0.1:1313;
}
upstream upstream_task_2 {
server 127.0.0.1:1314;
}
server {
listen 8185 ssl;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_pass $stream_map;
ssl_preread off;
}
error_log /etc/nginx/logs/error.log debug;
}
实验过程中最难的问题是nginx没有根据服务器名将ssl payload转发到上游tcp服务器,这个问题我研究了很多天,但是一无所获。昨天我的同事不小心删除了ssl_preread on
,解决了这个问题。ssl_preread
的默认值是off
。因此我们意识到将ssl_preread
设置为off
将帮助我们解决问题,这就是ssl_preread off
出现在最终nginx配置中的原因。
为什么ssl_preread on
对nginx的forward进程有很大的影响?我们收集了一些nginx forward运行良好和运行不良时的调试日志,如下所示:
x一个一个一个一个x一个一个二个x
比较两个日志,我们发现proxy connection handler
只在nginx可以转发ssl有效载荷到上游tcp服务器的情况下发生,所以我们假设ssl_preread on
会禁用转发,但是为什么,你能告诉我原因吗?
1条答案
按热度按时间4ktjp1zp1#
今天我注意到nginx_stream_ssl_preread_module的介绍中有一句话,这句话是
the ngx_stream_ssl_preread_module module (1.11.5) allows extracting information from the ClientHello message without terminating SSL/TLS
,我发现这句话后面隐藏的细节非常少,是without terminating SSL/TLS
,然后我就知道这个问题的答案了。SSL终止指的是将加密的流量沿着后再传递给web服务器的过程,在我们的例子中,我们要将加密的流量解密后传递给TCP服务器,所以我们要Nginx做的事情也可以称为SSL终止,根据ngx_stream_ssl_preread_module的介绍,我们知道这个模块不支持我们的例子。所以我们必须将ssl_preread设置为off。很多天前,我尝试在map块中使用$ssl_preread_server_name,经过多次实验发现转发不起作用,今天我知道原因和这个问题一样。