Stream模块需显式启用,否则报“unknown directive 'stream'”;必须与http同级、置于events后;仅支持TCP/UDP透传,不兼容rewrite等HTTP指令;无自动健康检查,需外部监控补位。

Stream模块必须显式启用,否则所有配置都会被拒绝——这不是语法错误,是模块压根不存在。
确认Nginx是否带stream模块
运行nginx -V 2>&1 | grep -o with-stream,无输出即不支持。常见发行版默认包通常不含该模块:
- Ubuntu/Debian:改用
nginx-extras(含stream),别装nginx-light或nginx-core - CentOS/RHEL 8+:用
dnf install nginx-mod-stream,但需确保模块版本与nginx主程序严格匹配 - 最稳妥方式:源码编译时加
--with-stream,再make && sudo make install
错误现象:nginx: [emerg] unknown directive "stream"——这不是你写错了,是模块没编译进去。
stream块必须放在顶层,不能嵌套在http里
stream和http是同级块,必须并列出现在events之后、http之外。写在http{}内部会直接报错:"stream" directive is not allowed here。
正确结构示例:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
events {
worker_connections 1024;
}
<p>stream {
upstream db_cluster {
server 192.168.1.10:3306;
server 192.168.1.11:3306;
}
server {
listen 3306;
proxy_pass db_cluster;
}
}</p><p>http {</p><h1>其他HTTP配置</h1><p>}
stream模块只支持有限指令,不兼容HTTP语义
它不做协议解析,只做TCP/UDP透传,因此以下指令全部不可用:
-
rewrite、proxy_set_header、return、location等HTTP层指令——出现即报unknown directive -
proxy_pass只接受IP:PORT格式;若要用域名,必须先配resolver - UDP场景需显式加
udp标记:listen 53 udp,并设proxy_responses和proxy_timeout - TLS SNI路由可用
ssl_preread on+$ssl_preread_server_name,但仅读握手阶段,不解析应用层
监听低端口需root权限,且proxy_timeout影响连接生命周期
比如listen 22或listen 21,Nginx主进程必须以root启动(worker可降权)。非root用户会报:bind() to 0.0.0.0:22 failed (13: Permission denied)。
proxy_timeout控制空闲连接超时,默认为60秒。对数据库长连接,常需调大(如proxy_timeout 1h);但设太大会堆积无效连接,尤其在大量短连接场景下容易耗尽文件描述符。
真正容易被忽略的是:四层没有健康检查自动剔除机制(不像HTTP有max_fails+fail_timeout自动摘除),max_fails在stream中虽可用,但仅对connect失败生效,对后端服务已启动但应用层卡死的情况完全无感知——得靠外部探活或主动监控补位。

















