Cloudflare 支持代理的 WebSocket 连接,无需额外配置。
WebSockets 是客户端与源站服务器之间维持的开放连接。在 WebSockets 连接中,客户端和源站可以来回传递数据,而无需重新建立会话。这使得在 WebSockets 连接内交换数据非常快速。WebSockets 常用于实时应用,例如即时聊天和游戏。
要在仪表板中启用发往源站服务器的 WebSockets 连接:
-
在 Cloudflare 仪表板中,前往 **Network(网络)**页面。
Go to Network ↗ -
找到 WebSockets(WebSocket),将开关切换至 On(开启)。
要使用 API 启用发往源站服务器的 WebSockets 连接,请发送 PATCH 请求,在 URI 路径中将设置名称指定为 websockets,并将 value 参数设置为 "on"。
| 产品 | 兼容 | 说明 |
|---|---|---|
| Argo | 否 | Argo 与 WebSockets 不兼容。 |
| SSL | 是 | |
| WAF | 是* | 初始 HTTP 101 请求与其他任何 WebSockets 连接一样,受到 WAF 托管规则、自定义规则、速率限制规则以及其他 WAF 功能的约束。但是,连接一旦建立,WAF 不会执行任何进一步检查。 |
| Workers | 是 | 您还可以使用 Durable Objects 作为 WebSocket 会话的端点,从而完全控制往返于客户端的消息。 |
所有 Cloudflare 计划都支持 WebSockets。
鉴于 WebSocket 连接的性质,您可能会注意到它们在请求和带宽使用方面与典型的 HTTP 流量有所不同。如果您是 Enterprise 客户,考虑 Cloudflare 如何衡量请求和带宽以准确估算您的使用情况至关重要。
Cloudflare 按以下方式衡量单个 WebSocket 连接:
-
请求:Cloudflare 仅将每个 WebSocket 连接的初始升级 (upgrade) 请求识别为 HTTP 请求。即使您可以通过建立的 WebSocket 连接发送双向消息流,它仍将被计为单个长连接 HTTP 请求。
-
带宽:Cloudflare 衡量从 Cloudflare 发送到客户端的数据传输。这通常意味着从 Cloudflare 后方的 WebSocket 服务器发送到 WebSocket 客户端的消息会计入带宽使用。
一旦 WebSocket 连接关闭,您可以通过 Traffic Analytics(流量分析)、GraphQL Analytics API 以及 HTTP 请求日志查看聚合的 WebSocket 使用情况。
当 Cloudflare 向其全球网络发布新代码时,我们可能会重启服务器,这将终止 WebSockets 连接。
- 实现 心跳检测 (keepalive) ↗。
- 审查并移除或延长源站和/或客户端的超时设置。
使用类似 wscat ↗ 的客户端工具可以帮助调查 WebSocket 问题。 能够使用最简化的工具在单个 URL 上重现问题有助于缩小问题范围。
HTTP 请求日志中的 EdgeStartTimestamp 和 EdgeStopTimestamp 字段代表 WebSocket 连接的持续时间(它们不代表初始 HTTP 连接的持续时间)。
当在一段时间内没有任何方向的数据传输时,Cloudflare 将关闭 WebSocket 连接。Enterprise 客户可以联系其账户团队来配置自定义的空闲超时。为了在不活动期间保持长连接处于活动状态,请实现客户端心跳(ping/pong)机制。
如果您的 WebSocket 源站位于 Cloudflare 负载均衡器 (Load Balancer) 后方,请开启 Session affinity(会话亲和性),以确保来自同一客户端的所有请求都路由到相同的源站服务器。如果没有会话亲和性,WebSocket 重连可能会落到不包含该会话状态的其他源站上。