Nginx 反向代理 WebSocket 必须加的那三行配置

举报
yd_241226763 发表于 2026/11/05 06:23:08 2026/11/05
【摘要】 一、问题现象用 Nginx 给后端服务做反向代理时,HTTP 接口一切正常,但前端 WebSocket 一直连不上:浏览器控制台报 WebSocket connection failed,或者连接建立后立刻断开,状态码是 200 而不是 101。这类问题十有八九不是后端代码的锅,而是 Nginx 默认不会转发 WebSocket 的升级请求。二、原因WebSocket 建立连接时,浏览器先发...

一、问题现象


用 Nginx 给后端服务做反向代理时,HTTP 接口一切正常,但前端 WebSocket 一直连不上:浏览器控制台报 WebSocket connection failed,或者连接建立后立刻断开,状态码是 200 而不是 101。这类问题十有八九不是后端代码的锅,而是 Nginx 默认不会转发 WebSocket 的升级请求。


二、原因


WebSocket 建立连接时,浏览器先发一个 HTTP 请求,带上两个特殊头部:Connection: Upgrade 和 Upgrade: websocket。Nginx 默认按普通 HTTP 请求处理,既不会把这两个头部原样传给后端,也不会保持长连接,握手必然失败。


三、三行关键配置


在对应的 location 块里加上:


location /ws/ {

    proxy_pass http://backend;

    proxy_http_version 1.1;

    proxy_set_header Upgrade $http_upgrade;

    proxy_set_header Connection "upgrade";

}


严格说是三件事:proxy_http_version 1.1、Upgrade 头、Connection 头。HTTP/1.1 是前提,因为 Upgrade 机制只在 1.1 里定义;后两行把客户端的升级意图透传给后端。


四、进阶写法


如果同一个 location 既想兼容普通请求又想兼容 WebSocket,可以用 map 变量:


map $http_upgrade $connection_upgrade {

    default upgrade;

    '' close;

}


然后 proxy_set_header Connection $connection_upgrade。这样没有 Upgrade 头的普通请求不会被强加 upgrade。


五、其他注意事项


1. wss 需要在 Nginx 层终止 TLS,证书配在 server 块的 listen 443 ssl 上;

2. 长连接空闲超时默认 60 秒,必要时调大 proxy_read_timeout;

3. 改完记得 nginx -t 校验后再 reload。


总结:WebSocket 反代连不上,先检查这三行配置,多数情况下加上就通了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。