nginx代理websocket需在location块中配置三行核心指令:proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade、proxy_set_header connection "upgrade",并设proxy_read_timeout和proxy_send_timeout为86400、proxy_buffering off、tcp_nodelay on,禁用proxy_cache。

Linux 下用 Nginx 反向代理 WebSocket,不是加个 proxy_pass 就能通的。核心在于让 WebSocket 握手成功、连接不被静默中断——这需要同时满足协议升级透传、连接保持、超时适配三个条件,缺一不可。
必须写在 location 块里的三行关键配置
这些指令只在 location 块内生效,放在 server 或 http 块顶层无效:
-
proxy_http_version 1.1;:WebSocket 握手基于 HTTP/1.1,Nginx 默认可能用 1.0 转发,必须显式声明 -
proxy_set_header Upgrade $http_upgrade;:把客户端发来的Upgrade头(如websocket或h2c)原样传给后端;注意变量名是$http_upgrade,大小写敏感,不能写成$upgrade -
proxy_set_header Connection "upgrade";:固定设为英文双引号包裹的"upgrade"字符串;不能用$http_connection(它常是keep-alive),否则后端收不到升级意图
防止空闲断连:调大超时时间
WebSocket 是长连接,没有请求-响应节奏。Nginx 默认 proxy_read_timeout 60,意味着后端 60 秒没发数据,Nginx 就主动关 TCP 连接——前端表现为“突然掉线”“反复重连”。
- 设
proxy_read_timeout 86400;(24 小时)最稳妥;若后端有心跳机制,至少设为心跳间隔 × 3 - 同步设
proxy_send_timeout 86400;,避免后端推送大消息或延迟响应时被中断 - 不要设为
0:部分 Nginx 版本行为未定义,可能导致异常断连 -
keepalive_timeout对 WebSocket 无效,改它没用
关闭干扰实时性的默认行为
WebSocket 是全双工流协议,Nginx 默认的缓冲和 TCP 策略会引入延迟或粘包:
-
proxy_buffering off;:禁用响应缓冲,防止多个 TEXT/BINARY 帧被攒在一起发送 -
tcp_nodelay on;:绕过 Nagle 算法,小帧(如光标移动、按键事件)立即送达 - 禁用所有
proxy_cache_*指令:WebSocket 消息不可缓存,启用会导致连接失败
HTTPS 场景下别漏掉 SSL 配置
浏览器访问 wss://your.com/ws,但 Nginx 没监听 443 或证书配置错误,连接根本到不了握手阶段:
-
server块中必须含listen 443 ssl;,不能只有listen 80 ssl; -
ssl_certificate和ssl_certificate_key路径要正确,且证书域名需匹配请求 Host - 补上
proxy_set_header Host $host;和proxy_set_header X-Forwarded-Proto $scheme;,避免后端因协议误判生成 http 链接或重定向循环











