首页 > 系统相关 >Nginx 代理webSocket时60s自动断开, 保持长连接

Nginx 代理webSocket时60s自动断开, 保持长连接

时间:2022-12-31 22:35:29浏览次数:43  
标签:function websocket 断开 60s Nginx proxy var webSocket 连接

利用nginx代理websocket的时候,发现客户端和服务器握手成功后,如果在60s时间内没有数据交互,连接就会自动断开,如下图:

Nginx 代理webSocket时60s自动断开, 保持长连接_连接时间

为了保持长连接,可以采取来两种方式.
1.nginx.conf 文件里location 中的proxy_read_timeout 默认60s断开,可以把他设置大一点,你可以设置成自己需要的时间,我这里设置的是十分钟(600s).

nginx配置如下:

server {
listen 80;
server_name carrefourzone.senguo.cc;
#error_page 502 /static/502.html;

location /static/ {
root /home/chenming/Carrefour/carrefour.senguo.cc/source;
expires 7d;
}

location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:9887;
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";
proxy_read_timeout 600s;
}
}
# 重启nginx服务
sudo nginx -s reload

按照上述方法设置好后,我们可以发现,如果在10分钟之内没有数据交互的话,websocket连接就会自动断开,所以这种方式还是有点问题,如果我页面停留时间超过十分钟而且又没有数据交互的话,连接还是会断开的,所以需要同时结合第二种方法.

2.在nginx延长超时时间的基础上,前端在超时时间内发心跳包,刷新再读时间,前端具体实现见如下代码(此处代码包含了前端整个websocket的实现过程,其中红色重点标注了发心跳包的内容):

// websocket连接
var websocket_connected_count = 0;
var onclose_connected_count = 0;
function newWebSocket(){
var websocket = null;
// 判断当前环境是否支持websocket
if(window.WebSocket){
if(!websocket){
var ws_url ="wss://"+domain+"/updatewebsocket";
websocket = new WebSocket(ws_url);
}
}else{
Tip("not support websocket");
}

// 连接成功建立的回调方法
websocket.onopen = function(e){
heartCheck.reset().start(); // 成功建立连接后,重置心跳检测
Tip("connected successfully")
}
// 连接发生错误,连接错误时会继续尝试发起连接(尝试5次)
websocket.onerror = function() {
console.log("onerror连接发生错误")
websocket_connected_count++;
if(websocket_connected_count <= 5){
newWebSocket()
}
}
// 接受到消息的回调方法
websocket.onmessage = function(e){
console.log("接受到消息了")
heartCheck.reset().start(); // 如果获取到消息,说明连接是正常的,重置心跳检测
var message = e.data;
if(message){
//执行接收到消息的操作,一般是刷新UI
}
}

// 接受到服务端关闭连接时的回调方法
websocket.onclose = function(){
Tip("onclose断开连接");
}
// 监听窗口事件,当窗口关闭时,主动断开websocket连接,防止连接没断开就关闭窗口,server端报错
window.onbeforeunload = function(){
websocket.close();
}

// 心跳检测, 每隔一段时间检测连接状态,如果处于连接中,就向server端主动发送消息,来重置server端与客户端的最大连接时间,如果已经断开了,发起重连。
var heartCheck = {
timeout: 55000, // 9分钟发一次心跳,比server端设置的连接时间稍微小一点,在接近断开的情况下以通信的方式去重置连接时间。
serverTimeoutObj: null,
reset: function(){
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
return this;
},
start: function(){
var self = this;
this.serverTimeoutObj = setInterval(function(){
if(websocket.readyState == 1){
console.log("连接状态,发送消息保持连接");
websocket.send("ping");
heartCheck.reset().start(); // 如果获取到消息,说明连接是正常的,重置心跳检测
}else{
console.log("断开状态,尝试重连");
newWebSocket();
}
}, this.timeout)
}
}
}

上述过程就是保持长连接的过程,前端部分也包含了大部分websocket初始化的内容.

 

标签:function,websocket,断开,60s,Nginx,proxy,var,webSocket,连接
From: https://blog.51cto.com/u_14879850/5982428

相关文章

  • Windows 安装以及配置Nginx
    1、windows下安装Nginx1.1从nginx官网下载相应的安装包:​​http://nginx.org/​​ 1.2建议下载 下载稳定版1.3解压到相应的目录,比如我是e盘然后修改目录名字为nginx......
  • Linux 安装Nginx集群测试
    5.1停止Nginx服务的四种方法从容停止服务这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止。nginx-squit立即停止服务这种方法比较强硬,无论进程......
  • websocket 多个nginx转发
    官网http://nginx.org/en/docs/http/websocket.html第一个nginxserver{listen6794;root/mnt/dist;location/analyze/{prox......
  • Nginx 安装 SSL 配置 HTTPS 超详细完整全过程
    在Nginx或Tengine服务器上安装证书说到 ​​Nginx​​​ 服务器,个人认为最大特点就是轻量级和高性能。通过在几台不同的服务器上进行测试,发现它的并发能力特别强,并且相对......
  • Nginx 出现 403 Forbidden 最终解决方法
    Nginx出现403Forbidden最终解决步骤一:检查目录权限。权限不足的就加个权限吧。例子:chmod-R755/var/www步骤二:打开nginx.conf例子:vim/etc/nginx/nginx.conf把user......
  • Docker 安装Nginx并实现挂载
    1、查看镜像来源:dockersearchnginx$dockersearchnginxNAMEDESCRIPTIONSTARSOFFICIALAUTOMATEDn......
  • Nginx 代理websocket连接上限
    一.结论 1.nginx最多只能维持(65535*后端服务器IP个数)条websocket的长连接,如果后端websocket服务器IP只有一个,那么就只能最多支持65535条连接。瓶颈就产生在了nginx上......
  • Docker部署nginx并挂载配置
    1、下载镜像并启动一个容器dockerpullnginx创建容器并运行dockerrun-d--namemynginx-p80:80 2、将nginx配置文件挂载到宿主机在宿主机创建目录: ......
  • nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
    文章目录​​前言​​​​一、对上一篇博文的分析​​​​二、配置文件分析​​​​1.nginx官方网址(很详细)​​​​2、配置文件(全)​​​​3、配置文件(去掉注释)​​​​4、......
  • websocket 多个nginx转发
    第一个nginxserver{listen6794;root/mnt/dist;location/analyze/{proxy_passhttp://ip:port;......