配置
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;
}
}
驗證
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("與客戶端的連接斷開");
});
});
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);
});
閱讀原文:原文鏈接
該文章在 2025/7/1 23:46:32 編輯過