Nginx Stream模块仅支持四层TCP转发,无法解析MySQL协议实现SQL级读写分离;需通过端口、域名或账号前缀等客户端行为区分流量,并配合upstream路由到主从库。

Stream 模块本身不支持 MySQL 协议解析,无法直接实现基于 SQL 语义的读写分离(如识别 SELECT 或 INSERT)。它只能做四层(TCP 层)转发,因此真正的“读写分离路由”需结合其他机制——常见且可行的方案是:**利用客户端连接行为区分读/写流量(例如不同端口、不同域名、或账号前缀),再由 Nginx Stream 模块按规则分发到对应后端 MySQL 实例**。
用端口区分读写流量(最常用)
让应用连接不同端口:写库走 3307,读库走 3308,Nginx Stream 根据监听端口将请求转发到对应 MySQL 后端。
- 在
nginx.conf的stream块中配置两个 server:
upstream mysql_write {
server 192.168.1.10:3306; # 主库
}
upstream mysql_read {
server 192.168.1.11:3306; # 从库1
server 192.168.1.12:3306; # 从库2
}
server {
listen 3307;
proxy_pass mysql_write;
}
server {
listen 3308;
proxy_pass mysql_read;
}
}
- 应用配置中,写操作使用
host:port = nginx_ip:3307,读操作使用nginx_ip:3308 - 优点:简单、稳定、零协议解析开销;缺点:需业务层配合改造连接逻辑
用账号前缀或用户名特征做简单分流(需配合 auth_pass)
MySQL 登录时会先发送初始握手包,其中包含用户名。Nginx Stream 虽不能解析完整 SQL,但可通过 auth_http 模块调用外部鉴权服务,在连接建立前检查用户名(如 rw_app 走写,r_app 走读),动态返回目标 upstream。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 启用
auth_http需编译 Nginx 时加入--with-stream和--with-stream_auth_http_module - 鉴权接口返回 HTTP 200 表示允许,并通过响应头
Set-Cookie: upstream=write;或自定义 header 传递路由标识 - Nginx 根据该标识选择不同
proxy_pass目标(需搭配 map 指令或 Lua 模块增强逻辑) - 实际部署较复杂,适合已有统一认证网关的场景
注意事项与限制
Stream 模块不具备状态感知能力,无法识别事务中的读请求是否应发往主库(例如事务内 SELECT 必须走主),也不处理连接复用、长事务、GTID 等高级特性。
- 所有连接都是无状态透传,主从延迟导致的脏读需业务自行规避
- 不支持自动故障转移,需配合健康检查(
health_check)和手动/脚本切换 - 若需真正智能 SQL 路由(如强制读主、拆分 sharding),应选用专用中间件:MyCat、ShardingSphere-Proxy、Vitess 或 ProxySQL
替代建议:轻量级方案优先考虑 ProxySQL
如果必须基于 SQL 内容路由,ProxySQL 是更合适的选择。它原生支持 MySQL 协议解析、读写分离规则、连接池、缓存和实时热配置,且部署简单:
- 安装 ProxySQL,配置
mysql_servers加入主从地址 - 设置
mysql_query_rules:匹配^(SELECT.*FOR UPDATE)|(UPDATE|INSERT|DELETE)等正则,指定destination_hostgroup - 应用只需连 ProxySQL 的 6033 端口,其余全自动
- 比自研或强改 Nginx 更可靠、可维护


















