浏览 1.6k
最近我在一个项目中遇到一个需求,从TCP的8185端口接收TLS流量,然后根据TLS ClientHello中的server name将TLS流量转发至不同的上游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/zxy/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/zxy/nginx-cfg/cert/server1.key;
proxy_pass $stream_map;
proxy_ssl off;
#ssl_preread on;
}
error_log /etc/nginx/logs/error.log debug;
}
我们在测试的时候发现,如果在nginx的server块中加入ssl_preread on,TCP服务端接收不到任何内容;如果将ssl_preread on注释掉,即把ssl_preread配置为off,就可以进行正常通信。一开始我们没有注意到ssl_preread on这个配置会有这么大的影响,我同事偶然把这个ssl_preread on注释了,发现可以正常进行转发了。
我们尝试探索了为什么关闭ssl_preread就能够正常进行转发,我们让nginx把debug日志给打印出来了,对比日志之后发现有一处是不一样的,如下图所示:

左侧是转发成功的日志,右侧是转发失败的日志,我们发现转发成功的日志中包含proxy connection handler这行日志而转发失败的日志中没有,我们想通过日志去源码中寻找原因,奈何源码太复杂,投入了几天时间没有结果。
想请教各位大神,为什么开启ssl_preread之后,会影响nginx向上游TCP转发TLS流量?

按点赞数排序
按时间排序
sticky模块只能在linux下吧,win下没有。tomcat好像有个session复制吧,或者可以用共享session。
没办法完全不受影响的,因为mirror是子请求,当子请求未结束时,主请求消耗的内存至少是无法释放的。你可以尝试在/mirror里,把超时时间大幅度调低,包括connect/read/send,再压下看看。
微信公众号
加入微信群