集群 聊天项目:Nginx 配置 TCP 服务器负载均衡
在集群聊天项目中,Nginx 可通过
stream模块实现 TCP 层的负载均衡(聊天服务通常基于 TCP 长连接),核心是转发客户端的 TCP 连接到后端多个聊天服务器节点,实现高可用和负载分发。
一、前提条件
Nginx 版本:需 1.9.0+(stream 模块从该版本开始支持)。
模块编译:Nginx 编译时需开启 --with-stream 模块(默认未开启)。
检查是否开启:nginx -V | grep stream,若输出包含 --with-stream 则已开启;
重新编译(示例):
cpp
# 下载源码(以1.24.0为例)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz && cd nginx-1.24.0
# 编译(保留原有模块,新增stream)
./configure --prefix=/usr/local/nginx --with-stream
make && make install
- 后端聊天服务器:多个 TCP 聊天服务节点(示例:192.168.1.101:8080、192.168.1.102:8080)。
二、核心配置步骤
Nginx 的 TCP 负载均衡配置在 nginx.conf 的 stream 块中(与 http 块同级),核心包括:
上游服务器池(upstream):定义后端聊天服务节点;
监听 TCP 端口(server):转发客户端连接到上游池。
三、完整配置示例
cpp
# 全局配置
user root;
worker_processes auto; # 自动匹配CPU核心数
error_log /usr/local/nginx/logs/error.log warn;
pid /usr/local/nginx/logs/nginx.pid;
# 事件模块(影响连接处理)
events {
worker_connections 10240; # 单worker最大连接数(适配长连接)
use epoll; # 高性能IO模型(Linux)
}
# TCP/UDP 流处理模块(核心)
stream {
# 1. 定义上游聊天服务器池
upstream chat_servers {
# 负载均衡策略(默认轮询,可选:ip_hash、least_conn)
# ip_hash:按客户端IP哈希,保证同一客户端连接固定节点(适配长连接会话)
ip_hash;
# 后端节点(weight=权重,max_fails=失败重试次数,fail_timeout=失败超时)
server 192.168.1.101:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 weight=1 max_fails=3 fail_timeout=30s;
# 可新增更多节点
# server 192.168.1.103:8080 weight=2; # 权重2,接收更多连接
}
# 2. 监听TCP端口(客户端连接的入口)
server {
listen 8000; # Nginx监听的TCP端口(客户端连接此端口)
proxy_connect_timeout 10s; # 与后端节点连接超时
proxy_timeout 30m; # TCP连接超时(聊天长连接需设大,如30分钟)
proxy_pass chat_servers; # 转发到上游服务器池
proxy_buffer_size 4k; # 缓冲区大小(适配聊天消息)
}
# 可选:配置日志(记录TCP连接日志)
log_format tcp_log '$remote_addr [$time_local] $protocol $status '
'$bytes_sent $bytes_received $session_time';
access_log /usr/local/nginx/logs/tcp_access.log tcp_log;
}
# 保留http块(若需nginx提供http服务,如监控、静态页面)
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
四、关键配置说明

五、负载均衡 策略选择
轮询(默认):按顺序分发连接到后端节点,适合节点性能一致的场景。
ip_hash:按客户端 IP 哈希固定节点,解决聊天会话粘滞问题(推荐)。
least_conn:分发连接到当前连接数最少的节点,适合节点性能不一致的场景。
hash $remote_port:按客户端端口哈希,补充 ip_hash 的粒度(可选)。
六、配置验证与启动
检查配置语法:
cpp
/usr/local/nginx/sbin/nginx -t
启动 / 重启 Nginx:
cpp
# 启动
/usr/local/nginx/sbin/nginx
# 重启(配置修改后)
/usr/local/nginx/sbin/nginx -s reload
# 停止
/usr/local/nginx/sbin/nginx -s stop
七、高可用补充(可选)
- 节点健康检查 :Nginx 默认仅通过连接失败判断节点不可用,可结合
ngx_stream_proxy_module的proxy_next_upstream增强:
cpp
stream {
upstream chat_servers {
ip_hash;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
server {
listen 8000;
proxy_pass chat_servers;
proxy_next_upstream on; # 连接失败时自动切换到下一个节点
proxy_next_upstream_timeout 1s; # 切换超时
proxy_next_upstream_tries 2; # 最多切换2次
}
}
- Nginx 主备:结合 Keepalived 实现 Nginx 节点高可用,避免 Nginx 单点故障。
八、常见问题排查
客户端连接超时:
检查 Nginx 监听端口是否开放(netstat -tulnp | grep 8000);
检查后端节点是否存活(telnet 192.168.1.101 8080);
检查防火墙 / 安全组是否放行 8000 端口。
连接被频繁断开:
调大proxy_timeout(如设为 30m);
检查后端聊天服务是否主动断开连接。
负载分发不均:
调整weight权重;
切换为least_conn策略。
通过以上配置,Nginx 可稳定实现 TCP 层的负载均衡,支撑集群聊天项目的高并发和高可用需求。