nginx集群聊天室(五)nginx配置tcp服务器负载均衡

集群 聊天项目: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
  1. 后端聊天服务器:多个 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

七、高可用补充(可选)

  1. 节点健康检查 :Nginx 默认仅通过连接失败判断节点不可用,可结合ngx_stream_proxy_moduleproxy_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次
    }
}
  1. Nginx 主备:结合 Keepalived 实现 Nginx 节点高可用,避免 Nginx 单点故障。

八、常见问题排查

客户端连接超时:

检查 Nginx 监听端口是否开放(netstat -tulnp | grep 8000);

检查后端节点是否存活(telnet 192.168.1.101 8080);

检查防火墙 / 安全组是否放行 8000 端口。

连接被频繁断开:

调大proxy_timeout(如设为 30m);

检查后端聊天服务是否主动断开连接。

负载分发不均:

调整weight权重;

切换为least_conn策略。

通过以上配置,Nginx 可稳定实现 TCP 层的负载均衡,支撑集群聊天项目的高并发和高可用需求。

相关推荐
报错小能手2 小时前
如何手撕集群聊天室项目?
linux·服务器
HAPPY酷2 小时前
Ubuntu 中如何启用 root 账户?—— 从 “su: 认证失败” 到成功切换 root 的完整指南
服务器·数据库·ubuntu
焦糖玛奇朵婷2 小时前
盲盒小程序一站式开发
java·大数据·服务器·前端·小程序
生活予甜2 小时前
2026AI智能体爆发,天翼云服务器成OpenClaw理想部署载体
运维·服务器
weixin_462446232 小时前
OpenClaw 完整部署指南:从用户创建、安装配置到 Nginx 反向代理
运维·nginx·openclaw
云飞云共享云桌面2 小时前
SolidWorks云电脑如何多人共享访问?
运维·服务器·人工智能·3d·自动化·云计算·电脑
AMoon丶2 小时前
C++基础-类、对象
java·linux·服务器·c语言·开发语言·jvm·c++
桌面运维家3 小时前
Linux/Windows终端密码设置:保护你的vDisk数据
linux·运维·服务器
小周学学学3 小时前
ESXI虚拟机故障关机处理记录
服务器·vmware·虚拟化