Jack Jiang

我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
posts - 545, comments - 13, trackbacks - 0, articles - 1

2026年8月4日

本文作者银河技术,有修订和改动。

1、引言

WebSocket 是基于 HTTP/1.1 Upgrade 机制实现的全双工长连接通信协议,广泛应用于 IM即时通讯、实时通知、协同编辑、行情推送、游戏服务等场景。

由于 WebSocket 是长连接 + 状态敏感的协议,在 Nginx 中做反向代理时,需要特别注意一些细节。

这些细节主要是:

  • 1)协议升级(Upgrade);
  • 2)连接保持;
  • 3)超时控制;
  • 4)负载均衡策略;
  • 5)云环境 / K8s 场景下的断连问题。

本文从基础配置、生产配置、Docker / K8s、安全、排障、性能调优,系统性讲清 WebSocket 在 Nginx 中的正确打开方式。

cover-opti

2、WebSocket如何建立长连接

5

WebSocket 通过 HTTP/1.1 完成握手:

GET /ws HTTP/1.1

Upgrade: websocket

Connection: Upgrade

一旦升级成功,连接将不再遵循 HTTP 请求-响应模型,而是长期保持的双向 TCP 通道。

PS:这也是为什么 WebSocket 对 Nginx 超时 / FD / 内核参数 / LB 极度敏感。

更多WebSocket基础资料可以继续阅读:

  1. WebSocket从入门到精通,半小时就够!
  2. 刨根问底HTTP与WebSocket的关系(上篇)
  3. 刨根问底WebSocket与Socket的关系
  4. 搞懂现代Web端即时通讯技术一文就够:WebSocket、socket.io、SSE
  5. Web端即时通讯实践干货:如何让你的WebSocket断网重连更快速?
  6. 理论联系实际:从零理解WebSocket的通信原理、协议格式、安全性

3、基础WebSocket反向代理配置

2

http {

    # 基础 WebSocket 代理配置

    upstream websocket_backend {

        server 192.168.1.100:8080;

        server 192.168.1.101:8080;

        # 支持长连接

        keepalive 10;

    }

 

    server {

        listen 80;

        server_name ws.example.com;

 

        location /ws/ {

            # 核心 WebSocket 配置

            proxy_pass http://websocket_backend;

            proxy_http_version 1.1;

            proxy_set_header Upgrade $http_upgrade;

            proxy_set_header Connection "upgrade";

 

            # 重要:传递原始主机头和客户端 IP

            proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header X-Forwarded-Proto $scheme;

 

            # 长连接超时设置

            proxy_read_timeout 3600s;

            proxy_send_timeout 3600s;

            proxy_connect_timeout 30s;

 

            # 禁用缓冲,确保实时性

            proxy_buffering off;

            proxy_cache off;

        }

    }

}

补充说明:

  • 1)proxy_http_version 1.1:WebSocket 必须;
  • 2)Upgrade / Connection:完成协议升级;
  • 3)proxy_buffering off:防止消息延迟;
  • 4)proxy_read_timeout:防止 Nginx 主动断连。

4、生产环境必须补充的 Upgrade 头处理(关键)

注意:这是原始配置中最容易踩坑、但极其重要的一点。

推荐写法:

map $http_upgrade $connection_upgrade {

    default upgrade;

    '' close;

}

然后在 location 中:

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection $connection_upgrade;

为什么这样更安全?

  • 1)非 WebSocket 请求 → Connection: close;
  • 2)WebSocket 请求 → Connection: upgrade。

PS:避免普通 HTTP 请求被错误升级。

5、完整生产级WebSocket配置

http {

    upstream websocket_cluster {

        ip_hash;

 

        server 10.0.1.10:8080 weight=3;

        server 10.0.1.11:8080 weight=2;

        server 10.0.1.12:8080 backup;

 

        # 以下健康检查依赖 nginx_upstream_check_module(非官方)

        check interval=3000 rise=2 fall=3 timeout=1000 type=http;

        check_http_send "GET /health HTTP/1.0\r\n\r\n";

        check_http_expect_alive http_2xx http_3xx;

    }

 

    server {

        listen 443 ssl http2;

        server_name ws.example.com;

 

        ssl_certificate /etc/nginx/ssl/example.com.crt;

        ssl_certificate_key /etc/nginx/ssl/example.com.key;

        ssl_protocols TLSv1.2 TLSv1.3;

 

        location /chat/ {

            proxy_pass http://websocket_cluster;

 

            # WebSocket 升级

            proxy_http_version 1.1;

            proxy_set_header Upgrade $http_upgrade;

            proxy_set_header Connection $connection_upgrade;

 

            # 原始请求信息

            proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header X-Forwarded-Proto $scheme;

 

            # ⚠️ 长连接超时

            proxy_read_timeout 86400s;

            proxy_send_timeout 86400s;

 

            # 实时性

            proxy_buffering off;

 

            # 连接限制

            limit_conn ws_conn 1000;

        }

    }

}

limit_conn_zone $binary_remote_addr zone=ws_conn:10m;

6、HTTP/2 与 WebSocket 的现实情况

基本配置:

listen 443 ssl http2;

重要认知:

  • 1)浏览器 WebSocket 仍使用 HTTP/1.1;
  • 2)HTTP/2 WebSocket(RFC 8441):浏览器支持有限、Nginx 支持不完整。

PS:这是正常现象,不是配置错误。

WebSocket location 必须显式:

proxy_http_version 1.1;

7、Docker / K8s 场景

3

map $http_upgrade $connection_upgrade {

    default upgrade;

    '' close;

}

 

server {

    listen 80;

 

    location /ws/ {

        proxy_pass http://websocket-service:8080;

 

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection $connection_upgrade;

 

        proxy_read_timeout 7d;

        proxy_send_timeout 7d;

 

        proxy_buffering off;

    }

}

K8s / 云环境的隐藏断连点:

4

PS:Nginx 再怎么配都没用,必须应用层心跳

8、WebSocket心跳保活(生产必做)

推荐 20~30 秒一次:

{ "type": "ping" }

否则云 LB、防火墙、NAT,都会主动断你连接。

9、负载均衡策略的选择

5

upstream websocket_backend {

    ip_hash;

    server 10.0.1.10:8080;

    server 10.0.1.11:8080;

}

实战建议:

6

PS:WebSocket 本质上 不适合强依赖 LB 算法做会话保持

10、优雅下线与灰度发布(生产增强)

K8s 必配:

terminationGracePeriodSeconds: 60

后端逻辑:

  • 1)收到 SIGTERM;
  • 2)停止新 WS;
  • 3)通知客户端重连;
  • 4)平滑下线。

11、Nginx及Linux内核参数(高并发必调)

7

Nginx配置如下:

worker_processes auto;

worker_rlimit_nofile 200000;

 

events {

    worker_connections 65535;

    use epoll;

}

Linux操作系统的配置:

net.core.somaxconn = 65535

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_fin_timeout = 15

12、写在最后

指令如下:

wscat -c ws://domain/ws

ss -an | grep ESTAB | wc -l

13、参考资料

[1] RFC6455 协议文档WebSocket API文档SSE API文档

[2] 新手入门贴:史上最全Web端即时通讯技术原理详解

[3] Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

[4] 详解Web端通信方式的演进:从Ajax、JSONP 到 SSE、Websocket

[5] 网页端IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

[6] 搞懂现代Web端即时通讯技术一文就够:WebSocket、socket.io、SSE

[7] WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)

[8] WebSocket详解(六):刨根问底WebSocket与Socket的关系

[9] Web端即时通讯实践干货:如何让你的WebSocket断网重连更快速?

[10] WebSocket从入门到精通,半小时就够!

[11] 理论联系实际:从零理解WebSocket的通信原理、协议格式、安全性

[12] 浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)

[13] 微信团队分享:来看看微信十年前的IM消息收发架构,你做到了吗

[14] 零基础IM开发入门(一):什么是IM系统?

[15] 转转客服IM系统的WebSocket集群架构设计和部署方案

[16] 基于WebSocket的IM即时通信方案在H5游戏场景下的技术实践

[17] 详解AI大模型实时通信为什么选SSE,而不是WebSocket和WebRTC

[18] 都HTML5了,Web端即时通讯技术到底该用什么?一文即懂!

即时通讯技术学习:

- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM

- 开源IM框架源码:https://github.com/JackJiang2011/MobileIMSDK备用地址点此

(本文同步发布于: http://www.52im.net/thread-4921-1-1.html

posted @ 2026-09-08 10:59 Jack Jiang 阅读(33) | 评论 (0)编辑 收藏

     摘要: 本文作者饭后咖啡,有修订和改动。1、引言离线消息是IM系统的核心能力,当用户不在线时,消息必须可靠存储,待用户上线后完整推送。本文将对比主流的离线消息存储方案,帮你找到最适合业务场景的架构。2、离线消息的业务特征和主流存储方案概览离线消息的业务特征:方案对比总览:3、存储方案1:MySQL分库分表表结构设计:CREATE TABLE offline_message_$table ( &n...  阅读全文

posted @ 2026-08-25 21:02 Jack Jiang 阅读(43) | 评论 (0)编辑 收藏

1、v2.2.7 版更新内容

此版更新内容:
  • 1)[升级] 提升targetSdkVersion至36,全面兼容Android 16;
  • 2)[优化] 开发工程升级适配AGP 9.1最新版;
  • 3)[优化] 升级权限框架以适配最新Android 16系统;
  • 4)[优化] 针对全部界面适配系统强制的Edge to Edge全面屏特性;
  • 5)[优化] 呼叫和聊天界面的ui优化等;
更多历史版本:

2、关于RainbowAV

1

🔥 RainbowAV是一套完整移动端实时音视频框架,不依赖第3方服务,使用方便,部署简单,轻量级、模块化设计。

📱 客户端历经多年、在大量最终用户的真机使用下,兼容性和适配能力强,它并不是个Demo;

🌟 服务端轻量级、极少依赖、简单易用、3行指令即可部署;

🌟 底层核心为C++编写,性能优先,CPU占用约17%(作为对比,同机型下手机QQ约为20%、微信约为19%);

🌟 客户端资源占用极少,持续运行时内存仅占 13MB 左右;

🌟 实时视频聊天时上下行总流量约 30KB/S(作为对比,手机QQ和微信的实时音视频均约 60KB/S);

🌟 实时语音聊天时上下行总流量约 9KB/S(作为对比,手机QQ约 14KB/S、微信约 6KB/S);

🌟 可应用于3G、4G等弱网络,在跨洲际高延迟网络下做过大量测试。

3、RainbowAV的设计目标

鉴于实时音视频技术的高门槛,RainbowAV技术从设计开始就希望能简化集成和使用,因而是以独立工程的方式进行迭代和演进,并不会与RainbowChat这样的IM发生代码耦合性,从而方便开发者自行改进甚至2次开发。

具体就是:

  • 1)与IM工程的解耦:独立工程,方便迭代和演进,甚至2次开发;
  • 2)服务端部署便利:服务端编译成了清爽的可执行程序,3行指令即完成部署;
  • 3)单实例拆分部署:共编译成3个程序,均可独立部署,互相无依赖,进一步提升单实例性能;
  • 4)多实例分布式部署:鉴于实时音视频聊天的特殊性(只在聊天时才需要连接音视频服务器),多实例分布式部署变的简单;
  • 5)服务端的高性能:得益于Linux epoll异步编程模型,服务端拥有极高的并发处理性能。
  • 6)手机端高兼容性:受益于大量的兼容性测试,甚至在Android 5.0上仍可很好地工作,代码表现健壮;
  • 7)手机低资源占用:Android客户端经过大量优化,资源占用低;
  • 8)高压缩低码率:经过编码压缩后的音视频数据,只需很少的流量;
  • 9)P2P通信支持:尽可能降低服务端性能和带宽压力;
  • 10)弱网络的支持:降低弱网络高延迟环境带来的通信脆弱性,保证应用层的稳定运行。

4、RainbowAV的性能指标

客户端性能指标总结:

  • 1)客户端运行稳定后,内存占用约13M左右(以MOTO G XT1077手机为例);
  • 2)实时音视频(视频+语音)时,CPU占用约17%(手机QQ的约为20%、微信的约为19%);
  • 3)实时语音(仅语音)时,CPU占用约11%(手机QQ的约为12%、微信的约为5%);
  • 4)实时音视频(视频+语音)时上下行总流量约30KB/S手机QQ和微信的均约60KB/S);
  • 5)实时语音(仅语音)时上下行总流量约9KB/S手机QQ的约14KB/S、微信的约6KB/S).

服务端性能指标总结:

RainbowAV服务端基于高性能的Linux epoll,理论设计性能是:单机1000到10000人同时使用。鉴于实时音视频的复杂性(P2P、中转等混合发生),想要准确地测试统计非常困难。但鉴于实时音视频技术的高流量特性,通常单机瓶颈会首先出现在带宽上,所以生产部署时需要在单机性能和带宽分流上总体考虑。而也正是得益于实时音视频的特殊性,聊天时可同时部署多个服务端实例,只要引导该对聊天的用户同时连接同一台实例即可进行聊天,从而让分布式部署和负载均衡变的简单。

5、关于RainbowChat

 1

🔥⚡️ 详细介绍版本日志・运行截图(AndroidiOS)・下载体验(AndroidiOS) ⚡️🔥

RainbowChat是一套基于 RainbowAV 音视频聊天框架 的产品级移动端IM系统RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题。RainbowChat可能是市面上提供im即时通讯聊天源码的,唯一一款同时支持TCP、UDP、WebSocket三种通信协议的IM产品。与姊妹产品 RainbowTalkRainbowChat-Web 技术同源,历经考验。

v121_all_in_one_75pct_h2000px

6、运行演示截图

1)RainbowAV独立体验版运行效果:

3

2)RainbowAV集成到 RainbowChat 的实时语音运行效果:RainbowChat介绍更多RainbowChat截图
12_real_voice

3)RainbowAV集成到RainbowChat 后的实时视频运行效果:RainbowChat介绍更多RainbowChat截图
13_real_video

posted @ 2026-08-11 20:38 Jack Jiang 阅读(34) | 评论 (0)编辑 收藏

     摘要: 本文作者京东物流技术团队卢旭,有修订和改动。1、引言在 Web端即时通讯技术的实践开发中,它的核心目标是实现客户端(浏览器)与服务器之间低延迟、双向 / 单向的动态数据交互,而非传统 HTTP 的 “请求 - 响应” 模式。本文分享的是 Web 端最常用即时通讯技术(包括 WebSocket、SSE、WebRTC、轮询等)的原理、优缺点与适用场景等,以及生产环境下的高并发场...  阅读全文

posted @ 2026-08-04 18:19 Jack Jiang 阅读(35) | 评论 (0)编辑 收藏

Jack Jiang的 Mail: jb2011@163.com, 联系QQ: 413980957, 微信: hellojackjiang