ip_hash仅适用于http流量,不支持tcp/udp等非web流量;替代方案是stream模块的hash指令,如hash $remote_addr consistent;或hash $binary_remote_addr consistent;。

ip_hash 本身不处理非 Web 类型流量。
ip_hash 仅适用于 HTTP 流量
ip_hash 是 Nginx HTTP 模块中 upstream 块的指令,只能用在 http{...} 配置块内。它对 HTTP 请求生效,依赖于 Nginx 的 HTTP 解析能力(如识别 $remote_addr、处理请求头等)。
对于 TCP/UDP 等原始四层流量,Nginx 的 stream 模块完全不识别 ip_hash 指令——配置会直接报错或被忽略。
非 Web 流量该用什么替代?
若需在 TCP/UDP 层实现类似“固定客户端路由”,应使用 stream 模块中的 hash 指令:
-
hash $remote_addr consistent;:对客户端 IP 做一致性哈希,适合长连接、数据库代理、Redis 代理等场景 -
hash $binary_remote_addr consistent;:更精确地处理 IPv4/IPv6 地址二进制表示,推荐用于高精度绑定 - 不加
consistent时为普通取模哈希,节点增减仍会导致大量连接重映射
常见非 Web 场景示例
比如代理 MySQL 或 WebSocket(非 HTTP 升级后的纯 TCP 连接):
- MySQL 代理:客户端 IP 固定打到某台后端 DB,避免权限上下文切换失败
- 自建 MQTT 服务:确保同一设备的 TCP 连接始终落在同一 broker 节点,维持会话状态
- gRPC over TCP:虽是 HTTP/2 封装,但若走 stream 模块反代,就不能用 ip_hash,而要用
hash $binary_remote_addr
注意真实 IP 的获取方式
stream 模块不解析 HTTP 头,$remote_addr 就是直连客户端地址。若前方有 LVS、F5 或四层 SLB,且未开启 PROXY 协议,则无法拿到真实 IP。
必须满足以下任一条件才能可靠使用基于 IP 的哈希:
- 客户端直连 Nginx stream 服务
- 前置负载均衡器启用了 PROXY 协议,且 Nginx stream 配置了
proxy_protocol on;











