stream模块与http模块是nginx中完全平行、互不嵌套的两个顶级模块,必须同级配置于nginx.conf全局作用域下;前者工作在l4,仅支持tcp/udp透传与连接级负载均衡,后者工作在l7,支持http语义解析与高级功能。

stream 模块和 http 模块在 Nginx 配置中是完全平行、互不嵌套的两个顶级模块,不能混放,也不能互相包含。它们各自独立解析流量,适用场景和配置逻辑有本质区别。
配置位置必须平级
在 nginx.conf 主配置文件中,http 块与 stream 块必须同级,都位于全局作用域下(即与 events、worker_processes 等同级):
- ✅ 正确写法:
events { ... }http { ... }stream { ... } - ❌ 错误写法:
http { stream { ... } }(嵌套非法)stream { http { ... } }(嵌套非法)location { stream { ... } }(语法不支持)
协议层与功能边界不同
两者处理的网络层级不同,导致可配置项和行为逻辑不可互换:
-
http 模块 工作在应用层(L7),能识别并操作 HTTP 方法、URI、Header、Cookie、状态码等;支持
location路由、缓存、重写、SSL 终止、Header 改写等高级功能 - stream 模块 工作在传输层(L4),只看到原始 TCP/UDP 连接和字节流;不解析内容,无法做 URI 匹配或 Header 处理;仅支持基于 IP、端口、连接数的负载均衡与透传
- 例如:用 stream 代理 HTTP 流量,后端收不到合法 HTTP 请求头,会直接报错或拒绝连接
核心指令与上下文差异
每个模块支持的指令范围严格受限于其设计目标:
-
upstream在两者中都存在,但含义不同:
•http upstream可配合proxy_pass实现带协议语义的转发
•stream upstream只做纯连接转发,依赖proxy_pass(属于 stream 指令)指向该 upstream - 常见 http 专用指令如
location、rewrite、add_header、proxy_set_header在 stream 块中完全不可用 - stream 特有指令如
proxy_timeout、proxy_responses、ssl_preread在 http 块中无效
启用前提与编译依赖不同
模块是否可用取决于 Nginx 编译时的选项:
-
http模块默认内置,无需额外开启 -
stream模块需显式启用:
编译时加--with-stream参数;
若未启用,配置stream { }会导致 nginx -t 报错:unknown directive "stream" - 若还需 TLS 相关能力(如
ssl_preread),还需额外添加--with-stream_ssl_preread_module











