websocket代理中请求缓冲区的关键作用是避免消息丢失、粘包或连接中断;需在location块中显式配置proxy_buffer_size(建议16k)、proxy_buffers(如8 16k)和proxy_busy_buffers_size(32k~64k),并同步关闭proxy_buffering、透传upgrade/connection头、设超时为86400。

WebSocket 代理中请求缓冲区的关键作用
WebSocket 是长连接、全双工通信,Nginx 默认的缓冲策略(如小缓冲区、自动缓存响应)会截断或延迟帧数据,导致消息丢失、粘包或连接被静默中断。尤其在高频推送(如行情、聊天)场景下,缓冲区配置不当是“连接闪断”“消息延迟”的常见根源。
必须调整的三个核心缓冲参数
这些参数需在 location 块内显式设置,不能依赖全局默认值:
- proxy_buffer_size:用于缓存响应首行和响应头,默认 4k。WebSocket 握手响应头较短,但为兼容后续扩展(如自定义 header),建议设为 16k
-
proxy_buffers:主响应体缓冲区,格式为 “数量 大小”,默认
8 4k(共 32k)。高频消息流易填满,推荐调至 8 16k 或更高(如16 32k) -
proxy_busy_buffers_size:Nginx 允许同时发送中的缓冲区上限,默认为
proxy_buffers总量的一半(即 16k)。若设得过小,会强制触发写入并清空缓冲,破坏流式传输;应设为 32k~64k,且确保 ≤ 总缓冲容量的一半
配置示例与位置说明
缓冲区配置有两种生效方式,按优先级推荐:
-
方式一:在 location 块中直接写(最推荐)——精准控制 WebSocket 路径,避免影响其他接口:
location /ws {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffer_size 32k;
proxy_buffers 16 32k;
proxy_busy_buffers_size 64k;
proxy_read_timeout 86400;
} -
方式二:在 http 块中全局设置(谨慎使用)——仅适用于所有代理均需高吞吐 WebSocket 的环境,否则可能浪费内存:
http {
proxy_buffer_size 16k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
# 其他通用配置...
}
配套要点:缓冲区之外不能忽略的设置
单改缓冲区无法解决问题,必须同步确认以下配置已就位:
-
禁用响应缓冲:添加
proxy_buffering off;—— WebSocket 不需要 Nginx 缓存整条响应,开启反而造成延迟 -
升级头必须透传:
proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade";缺一不可,否则握手失败 -
超时值匹配长连接特性:
proxy_read_timeout和proxy_send_timeout建议设为 86400(24 小时),避免空闲心跳被误杀











