Apache高并发下WebSocket代理内存飙升的根本原因是将其当作应用服务器使用,解决方法是回归代理本职:关闭缓冲(ProxyBuffering Off)、禁用日志、停用重写(RewriteEngine Off)、切换event MPM模型,并配置ProxySet streaming=on、ProxyTimeout 60等透传优化参数。
apache http server 作为 websocket 代理在高并发下内存持续飙升,根本原因不是“连接太多”,而是默认配置把 apache 当成应用服务器在用——它在透传长连接时悄悄做了不该做的事:缓存帧、解析头、维持冗余连接池、写日志、甚至参与协议协商。解决思路很明确:让 apache 回归代理本职,只做轻量透传。
关闭所有非透传功能,禁用协议干预
WebSocket 升级握手只需一次 HTTP 请求,后续全是二进制帧流。Apache 不该参与其中:
- 清除 Upgrade 相关干扰:在虚拟主机或 Location 块中添加 RewriteEngine Off,避免 mod_rewrite 解析路径或重写 Origin;若必须用 Rewrite,严格限定仅匹配
/ws/路径且不修改请求头 - 禁用压缩上下文:显式清空 WebSocket 扩展头,防止后端启用 permessage-deflate 时 Apache 缓存压缩状态:RequestHeader unset Sec-WebSocket-Extensions
- 跳过 TLS 重协商:若前端有 SSL 终止设备(如 ALB、CDN),确保 Apache 不开启
SSLStrictSNIVHostCheck on或冗余证书校验,避免每个新连接触发完整握手
强制流式转发,杜绝响应体缓存
内存暴涨常源于 Apache 把整个 WebSocket 消息体(尤其是广播消息)缓存在内存或磁盘临时文件中。必须切断这一行为:
- 关闭代理缓冲:ProxyBuffering Off(核心指令,不可省略)
- 启用原生流式代理:ProxySet streaming=on(Apache ≥2.4.37 必配)
- 禁用内核零拷贝干扰:EnableSendfile Off(尤其当后端返回大 payload 或分片消息时)
- 移除所有
ProxyPassReverseCookieDomain类重写逻辑——WebSocket 不走 Cookie 会话,这类配置只会增加字符串处理开销
收紧连接生命周期,主动淘汰无效连接
很多内存堆积来自“已断开但 Apache 还没感知”的僵尸连接,或客户端异常退出后残留的 socket:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 设置严格超时:ProxyTimeout 60(握手+空闲总时长上限,非默认的“无限等待”)
- 限制上游复用:ProxySet keepalive=on keepalive_timeout=5 max=16(避免为每个客户端独占后端连接)
- 前置限频防爬虫:LimitRequestFields 32 + LimitRequestBody 0 + 配合
mod_ratelimit对/ws路径做 IP 级建连限速(如 3 次/分钟) - 关闭访问日志:CustomLog /dev/null common + ErrorLog /dev/null(高频连接下日志拼接是隐性内存杀手)
切换更轻量的 MPM 模型并调优底层资源
prefork 模型在千级 WebSocket 连接下必然崩盘,每个连接一个进程,内存线性爆炸:
- 改用 event MPM:LoadModule mpm_event_module modules/mod_mpm_event.so,并确认
httpd -V | grep MPM输出为event - 精简进程配置:StartServers 2、MinSpareThreads 25、MaxSpareThreads 75、ThreadsPerChild 25、MaxRequestWorkers 400(按 16GB 内存服务器估算)
- 降低单线程内存碎片:ThreadStackSize 2097152(2MB,避免默认 8MB 栈空间浪费)
- 启动时限制核心内存:ulimit -c 2147483648 并配合
CoreDumpDirectory /var/tmp,便于后续用pstack定位卡死线程
Apache 不是为长连接设计的,但它能胜任 WebSocket 代理——前提是彻底放弃“全能网关”幻想,只让它当一根低损耗的水管。关键动作就四条:关缓冲、关日志、关重写、换 event。做完这些,1000 并发连接内存稳定在 300–500MB 是可预期的。

















