nginx 代理 WebSocket
配置
HTTP/1.1 協議中 Upgrade 機制可以將 http 升級到 WebSocket,實現客戶端與服務端的雙向通訊。
客戶端需要升級協議時在請求頭包含 Upgrade、Connection 字段。
如果服務端同意升級連接,就會返回 101 狀態碼和一個 Upgrade 標頭字段,Upgrade 字段內容爲要切換到的協議。
如果服務器不能升級連接,返回一個常規響應,如 200 ok。
nginx 實現代理 WebSocket,在轉發請求時需要在請求頭中包含 Upgrade、Connection 兩個字段。
Upgrade 表示希望升級到的協議,值從客戶端請求中取。
Connection 值爲 upgrade 時表示希望升級的協議,爲 close 時表示關閉連接。配置案例:
map $http_upgrade $connection_upgrade {
# 客戶端請求頭中存在Upgrade字段時,$connection_upgrade變量值爲upgrade
default upgrade;
# 客戶端請求中沒有Upgrade,變量值爲close
'' close;
}
upstream proxy_websocket {
server 192.168.1.16:6066;
}
server {
listen 6066;
location / {
proxy_pass http://proxy_websocket;
# 只有HTTP/1.1協議提供Upgrade機制,HTTP/2 明確禁止使用此機制
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
驗證
-
安裝依賴包
npm install ws
-
搭建 WebSocket 服務,server.js:
const { Server } = require("ws"); const server = new Server({ port: 6066 }); console.log("WebSocket服務監聽6066端口..."); server.on("connection", (client) => { console.log("建立新連接"); client.on("message", (msg) => { console.log("收到客戶端消息:%s", msg); // 給客戶端發送消息 client.send(Math.random()); }); client.on("close", () => { console.log("與客戶端的連接斷開"); }); });
-
啓動服務
node server.js
-
WebSocket 客戶端,client.js:
const WebSocket = require("ws"); // WebSocket連接nginx代理服務器192.168.1.18 const socket = new WebSocket("ws://192.168.1.18:6066/"); socket.on("open", () => { console.log("與WebSocket服務端連接成功"); socket.send("hello world"); }); socket.on("message", (data) => { console.log("收到消息:" + data.toString()); }); socket.on("close", () => { console.log("WebSocket關閉"); }); socket.on("error", (err) => { console.error("WebSocket錯誤:", err); });
-
啓動客戶端,
node client.js
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/jhPucjWdl0rH6ZOxPltJIQ