一、基础概念

WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。它提供了一种在客户端和服务器之间进行实时数据传输的方式,特别适用于 Web 应用程序中的实时更新和交互。

与传统的 HTTP 请求-响应模型不同,WebSocket 允许服务器主动向客户端推送数据,而不需要客户端首先发送请求。这使得 WebSocket 更加高效,因为它可以避免在每次通信时都要建立新的连接。

WebSocket 协议通过在 HTTP 握手阶段使用特殊的 HTTP 头部(如 Upgrade 和 Connection)来启动连接,然后切换到持久连接模式,允许双方之间的数据交换。它是基于事件驱动的,可以通过 JavaScript 在 Web 浏览器中使用,并且在许多现代浏览器中得到了良好的支持。

WebSocket 提供了一种更加高效和实时的双向通信方式,使得 Web 应用程序能够实现更加动态和交互性的功能。

二、使用Nginx进行websockt的反响代理

Nginx 可以作为 WebSocket 的反向代理。通过 Nginx 配置,可以将 WebSocket 请求从客户端转发到后端的 WebSocket 服务器,并将响应从后端服务器返回给客户端,从而实现 WebSocket 的反向代理功能。

要在 Nginx 中配置 WebSocket 反向代理,要确保 Nginx 的版本支持 WebSocket,通常是在 1.3 以上的版本。然后,在 Nginx 配置文件中,添加类似以下的配置:

server {
    listen 80;
    server_name example.com;

    location /websocket {
        proxy_pass http://backend_websocket_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

/websocket 是客户端 WebSocket 连接的端点,http://backend_websocket_server 是后端 WebSocket 服务器的地址。通过设置 proxy_http_version 和 proxy_set_header 来确保 Nginx 传递 WebSocket 连接所需的头部信息。

配置完成后,Nginx 将会代理 WebSocket 请求,并将其转发到后端服务器,实现 WebSocket 的反向代理功能。

三、设置map映射(非必需)

根据请求头中的 Upgrade 字段来设置 Connection 字段的值。

逻辑:
如果请求中的 Upgrade 字段不为空(即存在 Upgrade 请求头),则将 Connection 设置为 "upgrade",表示要升级连接到 WebSocket 协议。
如果请求中的 Upgrade 字段为空(即不存在 Upgrade 请求头),则将 Connection 设置为 "close",表示连接要关闭。
这个映射关系的作用是确保当客户端发送 WebSocket 握手请求时,Nginx 能够正确地处理请求头,将其转发给后端服务器,并设置正确的 Connection 头部,以便后端服务器能够正确地处理 WebSocket 连接。

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen 80;
    server_name example.com;

    location /websocket {
        proxy_pass http://backend_websocket_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

map 配置的作用是确保在进行 WebSocket 协议升级时,Nginx 能够正确地设置 Connection 头部,以便后端服务器能够正确地处理 WebSocket 连接。

如果 WebSocket 服务器要求在进行协议升级时设置 Connection 头部为 "upgrade",那么这段配置就是必须的。否则,后端服务器可能无法正确地识别 WebSocket 连接,并且连接可能会被关闭或被错误地处理。

在某些情况下,可能存在其他的方式来确保 Connection 头部被正确设置,例如通过后端服务器自身的配置或者其他中间件。但使用这个配置可以确保 Nginx 在反向代理 WebSocket 连接时能够正确地处理请求头,使得配置更加清晰和直观。

四、测试连接

WebSocket连接使用如下格式:

ws://192.168.0.1/
wss://192.168.0.1/

ws的默认端口是80
wss的默认端口是443

可用工具:Postman
Postman中选择新建,然后选择WebSocket类型(而非常规的HTTP)。

标签: none

添加新评论