Vue 中使用 WebSocket代理 + Nginx 配置笔记
最近进行项目开发,遇到需要代理 WebSocket视频流 的需求,记录一下配置过程。
1. Vue 开发环境配置代理
在 vue.config.js 的 devServer.proxy 中增加 WebSocket 的代理配置:
1 | '/video': { |
2. 前端 WebSocket 连接写法
在 Vue 中初始化 WebSocket 连接时,URI 必须这样写:
1 | const socket = new WebSocket('ws://' + location.host + '/video/websocket/' + id); |
注意事项
必须加上
ws://前缀
WebSocket 协议需要明确写ws://(或者wss://用于 HTTPS)。前缀必须是
location.host表示 WebSocket 访问的当前前端项目地址。
不能直接写代理 key 值
/video或后端端口。
location.host后面跟代理 key 值- 与代理配置中的
/video保持一致。
- 与代理配置中的
剩余部分拼接后端 API 的具体路径
- 例如
/video/websocket/{id}。
- 例如
3. Nginx 配置 WebSocket 反向代理
在 Nginx 中,WebSocket 的代理配置与普通 HTTP 不同:
proxy_pass必须写http://,而不是ws://。需要手动加上 WebSocket 升级头。
配置示例
1 | location ^~ /video/ { |
关键点说明
proxy_pass http://127.0.0.1:8889/;不需要
ws://,因为 WebSocket 是基于 HTTP 协议升级的。正确写法就是
http://。
proxy_http_version 1.1- 默认 HTTP/1.0,不支持协议升级,必须显式声明 HTTP/1.1。
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";- 这两行是 WebSocket 握手的关键,缺少就会导致连接失败。
总结
Vue 开发环境中,需要在代理配置里启用
ws: true。前端 WebSocket 连接必须写完整:
ws:// + location.host + /代理key + /后端路径。Nginx 转发 WebSocket 时,
proxy_pass写http://,并加上 Upgrade 头。
这样配置后,前端通过 代理 访问 WebSocket,就能正常握手并通信。
