nginx四层负载均衡需启用stream模块(1.9.0+,编译加--with-stream),用least_conn算法、合理健康检查、so_keepalive与精准超时参数,并协同调优内核网络参数以降低游戏长连接时延。

Nginx 实现游戏服务器的四层负载均衡,关键在于绕过应用层解析、减少协议处理开销,从而压低端到端时延。游戏服务通常基于长连接 TCP(如 WebSocket 底层、自定义 TCP 协议),对连接稳定性、首包延迟和抖动敏感,不适合走七层 HTTP 代理。用 stream 模块做纯传输层转发是最直接有效的方案。
必须启用 stream 模块并验证版本支持
Nginx 1.9.0+ 才内置 ngx_stream_core_module,但默认不编译进二进制。安装或升级时需显式添加 --with-stream 参数:
- 检查是否已启用:运行
nginx -V 2>&1 | grep -o with-stream,有输出即支持 - 若未启用,重新编译时加入:
./configure --with-stream ...(其他模块按需保留) - 确认主配置文件顶部加载模块(部分旧版需手动声明):
load_module modules/ngx_stream_module.so;
针对游戏流量优化的 upstream 配置
游戏客户端连接频繁建连、心跳保活、状态强依赖后端节点,需避免连接漂移和单点过载:
- 优先用 least_conn 算法:比轮询更适应长连接场景,把新连接导向当前活跃连接数最少的服务器
- 禁用权重浮动干扰:游戏服性能通常较一致,
weight可统一设为 1;若存在异构机器(如混用 16C/32C),再按 CPU 核心数比例设权 - 设置合理健康检查参数:
max_fails=2 fail_timeout=15s,避免因瞬时网络抖动误判下线 - 慎用
backup:游戏服一般无冷备,备用节点可能引入额外跳转延迟;如需灾备,建议用 DNS 切流或独立 LB 层
server 块中的低时延关键参数
游戏通信对建立延迟(connect)、空闲断连、数据透传效率极为敏感,以下参数直接影响 P99 延迟表现:
-
listen 7001 so_keepalive=on;:开启 socket 保活,防止中间设备(如 NAT 网关)静默断连 -
proxy_connect_timeout 500ms;:控制与后端游戏服建连超时,避免卡在失败连接上 -
proxy_timeout 30s;:设为略大于游戏心跳周期(如心跳 25s),既防僵死连接,又不误杀正常长连 - 禁用
proxy_next_upstream类重试:游戏协议非幂等,重试可能导致重复登录、指令错乱 - 不设
proxy_upload_rate/proxy_download_rate:限速会引入缓冲和排队,放大 jitter
系统级协同调优不可忽略
Nginx 四层转发性能受内核网络栈制约明显,尤其高并发下:
- 增大连接队列:
net.core.somaxconn = 65535、net.ipv4.tcp_max_syn_backlog = 65535 - 复用 TIME_WAIT 连接:
net.ipv4.tcp_tw_reuse = 1(仅客户端为本机时有效) - 关闭 SYN Cookie(若不暴露公网):
net.ipv4.tcp_syncookies = 0,减少握手开销 - Nginx worker 进程数设为 CPU 核心数,启用
use epoll;(Linux 下默认)
游戏服务器四层负载均衡不是简单配个 proxy_pass 就完事。它要求模块启用正确、算法匹配长连接特性、超时策略贴合心跳节奏,并与内核参数联动。配置本身不复杂,但每项取值都影响毫秒级体验。











