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 层的负载均衡,支撑集群聊天项目的高并发和高可用需求。

相关推荐
lwx91485238 分钟前
Linux-特殊权限SUID,SGID,SBIT
linux·运维·服务器
小义_3 小时前
随笔 3(Linux)
linux·运维·服务器·云原生·红帽
cccccc语言我来了4 小时前
Linux(10)进程概念
linux·运维·服务器
原来是猿5 小时前
Linux进程信号详解(二):信号产生
linux·运维·服务器
chxii5 小时前
Nginx性能优化-压缩(返回头报文介绍)
运维·nginx·性能优化
n 55!w !1085 小时前
IP-vlan实验报告
服务器·网络·tcp/ip
胖咕噜的稞达鸭6 小时前
C++技术岗面试经验总结
开发语言·网络·c++·网络协议·tcp/ip·面试
扑火的小飞蛾6 小时前
Kali Linux 安装 OpenClaw 详细教程
linux·运维·服务器
王琦03186 小时前
第二次作业
linux·运维·服务器
qZ6bgMe437 小时前
记录一次bug:不可见字符/零宽字符
服务器·.net