nginx代理WebSocket
|
admin
2025年6月28日 22:21
本文热度 109
|
配置
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 编辑过