WebSocket 与负载均衡:Nginx/HAProxy 的配置与优化

一、WebSocket 负载均衡核心挑战
  1. 长连接特性:WebSocket 连接在建立后持续存在,传统 HTTP 的短连接负载策略不适用
  2. 会话保持需求:客户端需始终连接同一后端服务器,避免状态丢失
  3. 协议升级处理:需正确处理 HTTP 到 WebSocket 的协议升级(Upgrade 头)
  4. 超时控制:连接空闲时需防止代理层过早断开

二、Nginx 配置详解
基础配置
location /ws/ {
    proxy_pass http://backend_servers;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    
    # 长连接优化
    proxy_read_timeout 86400s;  # 保持连接24小时
    proxy_send_timeout 86400s;
}

关键优化项
参数 推荐值 作用
proxy_read_timeout 86400s 防止Nginx主动断开空闲连接
proxy_buffers 16 64k 增大缓冲区避免消息分片
tcp_nodelay on 禁用Nagle算法降低延迟
keepalive_timeout 650s 保持TCP长连接
会话保持方案
upstream backend_servers {
    ip_hash;  # 基于客户端IP的会话保持
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
}


三、HAProxy 配置详解
基础配置
frontend websocket_front
    bind *:80
    mode http
    option forwardfor
    
    # WebSocket 流量识别
    acl is_websocket hdr(Upgrade) -i WebSocket
    use_backend ws_servers if is_websocket

backend ws_servers
    mode http
    balance source  # 基于源IP的会话保持
    server ws1 192.168.1.10:8080 check maxconn 5000
    server ws2 192.168.1.11:8080 check maxconn 5000
    
    # 长连接优化
    timeout tunnel  86400s  # 保持WebSocket隧道

关键优化项
参数 推荐值 作用
timeout tunnel 86400s 维持WebSocket隧道超时
maxconn 5000+ 调高单服务器最大连接数
option httpclose ❌禁用 防止强制关闭HTTP连接
option http-server-close ❌禁用 保持后端连接复用

四、通用优化策略
  1. 健康检查

    • Nginx: 集成 health_check 模块监控后端状态
    • HAProxy: 使用 check inter 5s 实时检测服务器存活
  2. TLS 加速

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 24h;  # 复用SSL会话降低握手开销
    

  3. 资源限制调整

    • 系统级:增大 nofile(文件描述符)和 nproc(进程数)限制
    • 内核:调高 net.core.somaxconnnet.ipv4.tcp_max_tw_buckets
  4. 监控指标

    • Nginx: 监控 stub_statusActive connections
    • HAProxy: 通过 stats 接口跟踪 Session rateQueue depth

五、故障排查要点
  1. 连接意外断开

    • 检查代理层和后端服务器的超时设置是否匹配
    • 验证 UpgradeConnection 头部是否透传
  2. 负载不均衡

    • 测试会话保持是否生效(多次连接同一客户端IP应路由到相同后端)
    • 检查后端服务器的 maxconn 限制是否合理
  3. 性能瓶颈

    ss -s  # 查看TCP连接状态
    netstat -an | grep TIME_WAIT | wc -l  # 检查TIME_WAIT堆积
    

最佳实践:生产环境建议使用 HAProxy 处理 WebSocket,因其原生支持 mode tunnel 和更灵活的会话保持策略,性能开销低于 Nginx。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐