nginx集群聊天室(五)nginx配置tcp服务器负载均衡
集群 聊天项目:Nginx 配置 TCP 服务器负载均衡
在集群聊天项目中,Nginx 可通过
stream模块实现 TCP 层的负载均衡(聊天服务通常基于 TCP 长连接),核心是转发客户端的 TCP 连接到后端多个聊天服务器节点,实现高可用和负载分发。
一、前提条件
Nginx 版本:需 1.9.0+(stream 模块从该版本开始支持)。
模块编译:Nginx 编译时需开启 --with-stream 模块(默认未开启)。
检查是否开启:nginx -V | grep stream,若输出包含 --with-stream 则已开启;
重新编译(示例):
# 下载源码(以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):转发客户端连接到上游池。
三、完整配置示例
# 全局配置 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 的粒度(可选)。
六、配置验证与启动
检查配置语法:
/usr/local/nginx/sbin/nginx -t启动 / 重启 Nginx:
# 启动 /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增强:
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 层的负载均衡,支撑集群聊天项目的高并发和高可用需求。
