ngx_stream_ssl_module 是 NGINX Stream 模块的 TLS 扩展,用于四层代理中实现 TLS 终止、透传、SNI/ALPN 路由及 mTLS 重加密,需编译时启用 --with-stream_ssl_module,不替代端到端加密,仅在代理环节提供 TLS 控制能力。

可以实现,但需注意:stream_ssl_module 并非用于加密 TCP 流量本身,而是为四层(Stream)模块提供 TLS 终止/透传能力,核心用途是验证上游或客户端的 TLS 证书、启用 ALPN/SNI 路由、或在代理环节做 TLS 卸载/重加密。它不替代 TLS 加密链路——真正的加密仍由客户端和后端服务协商完成。
明确 stream_ssl_module 的实际作用
该模块是 Nginx Stream 模块的扩展,让 stream { ... } 块支持 TLS 相关指令,典型能力包括:
- 接受客户端 TLS 连接(
ssl_certificate+ssl_certificate_key),即做 TLS 终止(类似 HTTPS 的 http ssl) - 向上游发起带 TLS 的连接(
proxy_ssl_certificate等),即 TLS 重加密(mTLS 场景) - 基于 SNI 或 ALPN 协议名路由流量(如区分 gRPC / HTTPS / MySQL over TLS)
- 校验上游证书(
proxy_ssl_verify on)、设置验证路径(proxy_ssl_trusted_certificate)
常见使用场景与配置示例
场景一:TLS 终止 + 明文转发(四层 SSL 卸载)
适用于前端统一处理 TLS,后端服务无需支持 TLS(如旧版 Redis、MySQL):
stream {
upstream backend {
server 192.168.1.10:6379;
}
<pre class="brush:php;toolbar:false;">server {
listen 6380 ssl;
ssl_certificate /etc/nginx/ssl/tls.crt;
ssl_certificate_key /etc/nginx/ssl/tls.key;
proxy_pass backend;
proxy_timeout 1s;
proxy_responses 1;
}}
场景二:TLS 透传(SNI 路由 + 不终止)
不解密流量,仅根据 SNI 分发到不同后端(如多租户 TLS 服务共用 IP):
stream {
map $ssl_server_name $upstream_backend {
hostnames;
example.com backend-a:443;
api.example.org backend-b:8443;
default fallback:443;
}
<pre class="brush:php;toolbar:false;">server {
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5:!RC4;
# 关键:不配置 ssl_certificate → 不终止 TLS,仅提取 SNI
proxy_pass $upstream_backend;
}}
场景三:mTLS 代理(双向认证 + TLS 重加密)
客户端连 Nginx 需证书,Nginx 连上游也带证书:
stream {
upstream secure_api {
server 10.0.2.5:8443;
}
<pre class="brush:php;toolbar:false;">server {
listen 8443 ssl;
ssl_certificate /etc/nginx/ssl/proxy.crt;
ssl_certificate_key /etc/nginx/ssl/proxy.key;
ssl_client_certificate /etc/nginx/ssl/ca.crt;
ssl_verify_client on;
proxy_pass secure_api;
proxy_ssl on;
proxy_ssl_certificate /etc/nginx/ssl/upstream.crt;
proxy_ssl_certificate_key /etc/nginx/ssl/upstream.key;
proxy_ssl_trusted_certificate /etc/nginx/ssl/upstream-ca.crt;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
}}
关键注意事项
-
模块需显式启用:编译 Nginx 时必须含
--with-stream_ssl_module;若用包管理器安装(如 apt/yum),确认 nginx-full 或 nginx-plus 包含该模块 -
不支持 TLS 1.0/1.1:默认仅启用 TLSv1.2+,如需兼容旧客户端需显式配置
ssl_protocols -
SNI 提取依赖 TLS 握手:客户端必须发送 SNI 扩展,否则
$ssl_server_name为空;纯 IP 连接或老旧 TLS 客户端可能无法路由 -
ALPN 需客户端配合:使用
$ssl_alpn_protocol做路由前,客户端需在 ClientHello 中声明协议(如 h2、http/1.1、grpc) -
性能影响可控:TLS 终止/重加密会消耗 CPU,但 Nginx 的 stream 模块事件驱动模型仍可支撑万级并发;建议开启 OCSP Stapling(
ssl_stapling on)减少握手延迟
验证与调试方法
快速确认是否生效:
- 用
openssl s_client -connect your.domain:port -servername example.com测试 SNI 和证书返回 - 抓包看三次握手后是否为 TLS record(而非明文协议数据),确认加密链路存在
- 查 Nginx error log:出现
SSL_do_handshake() failed多因证书路径错、权限不足或密码套件不匹配 - 启用
error_log /var/log/nginx/stream.log debug;查看 SSL 握手细节(生产慎用)
不复杂但容易忽略:stream ssl 的行为逻辑与 http ssl 高度相似,但上下文完全独立——证书、超时、验证策略都需在 server 块内重新定义,不能复用 http 块配置。











