1. Nginx 配置 WebSocket

具体步骤如下:

  1. 创建 Nginx 配置文件 8004.conf
  2. 刷新 Nginx 配置文件

1.1. 实现步骤

  1. 创建 Nginx 配置文件 8004.conf

    • Nginx 配置文件路径:/etc/nginx/conf.d
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # 将 $http_upgrade 变量映射到 $connection_upgrade 变量
    # $http_upgrade 变量通常用于表示客户端请求是否支持 WebSocket。
    # 如果客户端请求支持 WebSocket,则 $http_upgrade 变量的值为 "websocket";否则,它的值为空字符串。
    map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
    }

    # 虚拟主机server块
    server{

    # do something ...

    # 监听 /message 路径的请求
    location ^~ /message {
    proxy_pass http://server:port;
    # 表示使用 HTTP/1.1 协议
    proxy_http_version 1.1;
    # 表示将 Upgrade 头设置为 $http_upgrade。在http请求头中加入了 Upgrade: websocket
    proxy_set_header Upgrade $http_upgrade;
    # 表示将 Connection 头设置为 "upgrade"。在http请求头中加入了 Connection: Upgrade
    proxy_set_header Connection $connection_upgrade;
    }

    }
  2. 刷新 Nginx 配置文件

    1
    2
    3
    4
    5
    [root@VM-0-9-centos conf.d]# /usr/sbin/nginx -t 
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@VM-0-9-centos conf.d]# /usr/sbin/nginx -s reload
    [root@VM-0-9-centos conf.d]#

2. WebSocket 长时间不进行推送

  1. 方案一:通过 proxy_read_timeout 超时连接时长解决
1
2
3
4
5
6
7
8
9
10
11
12
# 监听 /message 路径的请求
location ^~ /message {
proxy_pass http://server:port;
# 解决连接超时问题,60分钟,默认是60s。
proxy_read_timeout 3600s;
# 表示使用 HTTP/1.1 协议
proxy_http_version 1.1;
# 表示将 Upgrade 头设置为 $http_upgrade。在http请求头中加入了 Upgrade: websocket
proxy_set_header Upgrade $http_upgrade;
# 表示将 Connection 头设置为 "upgrade"。在http请求头中加入了 Connection: Upgrade
proxy_set_header Connection $connection_upgrade;
}
  1. 方案二:通过前端设置定时器,进行 WebSocket 进行心跳请求
1
2
3
4
5
6
7
timer=setInterval(function() {
if (websocket.readyState == 1) {
websocket.send("心跳包检测");
} else {
//IM连接已断开
}
}, 50 * 1000);