websocket代理高可用需四层协同调优:代理层精准透传upgrade头与长连接配置、重设超时与禁用缓冲、路径匹配兼容查询参数、系统级放开文件描述符与内核连接队列限制;apisix比nginx更适配高并发ai协同场景。

要让WebSocket代理真正支撑起高可用、低延迟的在线协同编辑网关,关键不在“连得上”,而在“稳得住、转得快、不丢消息”。这需要从代理层(如Nginx或APISIX)、连接生命周期、协议透传、资源限制四个层面协同调优。
代理层必须精准透传WebSocket握手
Nginx或类似反向代理若未显式支持协议升级,协作编辑前端会卡在HTTP 200响应里,永远收不到101 Switching Protocols。这不是代码问题,是配置缺失:
-
启用HTTP/1.1:
proxy_http_version 1.1;—— HTTP/1.0不支持Upgrade头 -
透传Upgrade头:
proxy_set_header Upgrade $http_upgrade;—— 不加这句,后端根本看不到客户端想升级 -
显式声明连接升级:
proxy_set_header Connection "upgrade";—— 注意引号不能少,也不能写成'Upgrade'
长连接超时与缓冲策略必须重设
默认60秒超时对协作场景是灾难性的:用户静默几秒光标就断连,操作丢失,状态不同步。
-
延长空闲等待时间:
proxy_read_timeout 86400;(24小时)或至少3600(1小时),确保心跳包不被误杀 -
关闭代理缓冲:
proxy_buffering off;+proxy_cache off;—— 协作消息讲究“所见即所得”,缓存或批量转发会导致光标跳变、内容延迟 -
路径匹配要带参兼容:如
/ws?docId=abc需用location ^~ /ws { ... }或正则location ~ ^/ws,避免查询参数被截断
系统级资源必须放开连接上限
单机撑不过5000连接?大概率是Linux内核和进程限制没调。
-
提升文件描述符上限:在
/etc/security/limits.conf中添加* soft nofile 1048576* hard nofile 1048576 -
调大内核连接队列:修改
/etc/sysctl.conf,加入net.core.somaxconn = 65535net.ipv4.tcp_tw_reuse = 1 - 确认服务由对应用户启动**:ulimit设置只对同一shell及其子进程生效,Java或Node进程必须由该用户启动才生效
选对网关比调参数更重要
当并发突破5000,Nginx内存增长会陡峭上升;APISIX基于OpenResty+etcd,实测10万连接内存稳定在800MB以内。
- 连接管理粒度更细:APISIX支持连接级限流、鉴权、日志,Nginx只能做到进程级
- 动态热更新无reload:增删上游节点或调整路由规则无需中断现有长连接
- 适合AI协同类场景:可为代码补全通道单独启用压缩/限速插件,不影响文档同步通道











