WebSocket 协议不支持 proxy_cache,因其基于 TCP 全双工长连接、无请求-响应边界且帧流不可缓存,启用会导致握手失败、帧丢弃或静默中断;必须显式配置 proxy_cache off 并同步禁用缓冲、启用 HTTP/1.1 及 Upgrade 头透传。

WebSocket 协议不支持代理缓存,proxy_cache 必须显式禁用,否则会导致握手失败、连接中断或静默错误。
为什么 WebSocket 不能用 proxy_cache
WebSocket 是基于 TCP 的全双工长连接,数据以帧(frame)形式持续双向流动,没有传统 HTTP 的“请求-响应”边界。Nginx 的 proxy_cache 设计目标是缓存完整、可复用的 HTTP 响应体,它依赖状态码、ETag、Cache-Control 等语义——而 WebSocket 握手后只有 101 状态和后续二进制/文本帧,既无缓存标识,也不具备可缓存性。一旦启用 proxy_cache,Nginx 会在内部尝试对帧流做缓存判定,结果通常是:
- 握手阶段直接拒绝(返回 500 或 400),因无法处理 Upgrade 流程中的缓存逻辑
- 连接建立后,帧被截断、延迟或丢弃,前端收不到消息甚至触发重连
- 日志中可能无明确报错,仅表现为“连接闪断”或“心跳超时”
必须关闭 proxy_cache 的配置方式
在 WebSocket 对应的 location 块内,添加以下指令即可彻底禁用缓存:
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
-
proxy_cache off;—— 显式关闭缓存功能(推荐,语义清晰) -
proxy_cache "";—— 将缓存区设为空字符串(等效,但可读性稍差) - 切勿遗漏:同时确保未在该 location 中配置
proxy_cache_valid、proxy_cache_bypass等任何相关指令
配套要点:禁用缓存只是基础,不是全部
单关 proxy_cache 不足以让 WebSocket 正常工作,还需同步落实以下关键项:
-
proxy_buffering off;—— 关闭响应缓冲,避免帧堆积延迟 -
proxy_http_version 1.1;—— 强制使用 HTTP/1.1,支撑 Upgrade 机制 -
proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade";—— 透传协议升级头 -
proxy_read_timeout 86400;和proxy_send_timeout 86400;—— 防止空闲连接被默认 60 秒超时切断
常见误区提醒
有些配置试图“绕过缓存”,比如设置 proxy_cache_bypass $http_upgrade;,这是无效的——Nginx 不允许在 WebSocket 场景下启用缓存逻辑,无论是否 bypass。只要 proxy_cache 指令存在且指向一个有效缓存区,就可能触发校验失败。最稳妥的做法就是彻底移除或显式关掉它。

















