WebSocket代理不支持传统每秒请求数限速,但可通过limit_req限制握手请求频率、limit_conn控制并发连接数,并需配置proxy_read_timeout等超时参数及关键代理头以保障连接稳定。

WebSocket 代理本身不支持传统意义上的“每秒请求数”限速(如 limit_req 对 HTTP 短连接那样),因为 WebSocket 是长连接,建立后持续复用单个 TCP 连接传输多帧数据。但你仍可从连接建立阶段和流量层面进行有效限速控制。
限制 WebSocket 握手请求频率
客户端发起 WebSocket 连接时,首先会发送一个带 Upgrade: websocket 的 HTTP GET 请求(即握手请求)。这部分属于标准 HTTP 请求,可直接用 limit_req 限流:
- 在
http块中定义限流区域,按 IP 或其他键(如 token、User-Agent)限速:
- 在对应
location中启用限流,防止高频重连或恶意握手:
limit_req zone=ws_handshake burst=3 nodelay;
proxy_pass http://backend;
# 必须包含 WebSocket 代理头(见下文)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
限制并发 WebSocket 连接数
使用 limit_conn 模块控制同一客户端可建立的长连接总数,适用于防资源耗尽攻击:
- 定义连接限制区域(注意:需配合
limit_conn_log_level和limit_conn_status便于排查):
- 在 location 中应用,例如最多允许每个 IP 同时建立 10 个 WebSocket 连接:
limit_conn ws_conn 10;
# 其他 proxy 配置...
}
配合超时与缓冲设置保障稳定性
WebSocket 长连接对代理层超时敏感,若不调整,60 秒默认超时会导致连接被 Nginx 主动断开:
- 必须设置足够长的读写超时(单位:秒),推荐 300–3600,视业务心跳周期而定:
proxy_read_timeout 3600;
proxy_send_timeout 3600;
# 其他配置...
}
- 可选:关闭缓冲以降低延迟(尤其对实时性要求高的场景):
proxy_buffer_size 4k;
proxy_buffers 8 4k;
补充:避免 403 错误的关键代理头
若未正确透传协议升级头,Nginx 会拒绝握手并返回 403。以下三行不可省略:
-
proxy_http_version 1.1:WebSocket 升级要求 HTTP/1.1 -
proxy_set_header Upgrade $http_upgrade:透传 Upgrade 头 -
proxy_set_header Connection "upgrade":强制将 Connection 设为 upgrade(不能写成$http_connection,因可能被中间设备篡改)


















