Nginx 之四层负载模块 ngx_stream_ssl_preread_module
ngx_stream_ssl_preread_module 是 Nginx 的一个 stream 模块,用于在不终止 SSL/TLS 连接的情况下从 ClientHello 消息中提取信息,比如 SNI(服务器名称指示)、ALPN(应用层协议协商)和支持的最高协议版本。
该模块默认不构建,需要通过 --with-stream_ssl_preread_module 配置参数启用。主要指令是 ssl_preread,变量包括 $ssl_preread_server_name、$ssl_preread_alpn_protocols、$ssl_preread_protocol 等。
模块编译与启用
该模块默认不构建,需要在编译 Nginx 时显式启用:
./configure --with-stream --with-stream_ssl_preread_module # 其他原有参数
make && make install
编译后可通过 nginx -V 2>&1 | grep stream_ssl_preread 验证模块是否已包含。
核心指令与变量
指令:
ssl_preread on | off;在stream { server { ... } }上下文中使用,开启后 Nginx 会在收到 ClientHello 后提取 SNI、ALPN 等信息。
内置变量:
| 变量名 | 含义 | 引入版本 |
|---|---|---|
$ssl_preread_server_name | 从 SNI 扩展中提取的服务器域名(空串表示未提供) | 1.11.5 |
$ssl_preread_alpn_protocols | 客户端在 ALPN 扩展中声明的、逗号分隔的协议列表(如 h2,http/1.1) | 1.13.10 |
$ssl_preread_protocol | 客户端支持的最高 TLS/SSL 版本(如 TLSv1.3;空串表示无 SSL 握手信息) | 1.15.2 |
为编译安装的 Nginx 配置四层负载均衡,可以通过子配置文件的方式实现模块化管理。以下是完整配置方案:我们可以通过 include 指令引入子配置文件。创建子配置文件,例如在 /usr/local/nginx/stream/conf.d/stream.conf,并在该文件中配置四层负载均衡。具体配置示例:主配置文件(nginx.conf)中,在 http 配置块之外,添加 stream 配置块的引入:注意:stream 配置块和 http 配置块是平级的。
mkdir -p /usr/local/nginx/stream/conf.d/ # 用于存放四层负载均衡的子配置文件目录
编辑主配置文件 nginx.conf,在 http 块同级添加 stream 配置:
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
# HTTP 层配置
http {
include mime.types;
default_type application/octet-stream;
}
stream {
include /usr/local/nginx/stream/conf.d/*.conf;
log_format basic ;
access_log logs/stream_access.log basic;
error_log logs/stream_error.log;
preread_buffer_size 32k;
preread_timeout 30s;
proxy_connect_timeout 5s;
proxy_timeout 60s;
}


