nginx 关于将ssl负载转发到上游tcp服务器的问题

xjreopfe  于 2023-02-03  发布在  Nginx
关注(0)|答案(1)|浏览(502)

这些天来,我正在使用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会禁用转发,但是为什么,你能告诉我原因吗?

4ktjp1zp

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,经过多次实验发现转发不起作用,今天我知道原因和这个问题一样。

相关问题