文档章节

Nginx代理webSocket经常中断的解决方案, 如何保持长连接

jack__0023
 jack__0023
发布于 2017/08/02 17:48
字数 529
阅读 1271
收藏 61

背景

这天气够热的,要处理的事情也够多的。。。。

想看解决的,直接 ctrl+f搜索关键字‘配置点’##

开始前交代(想看原因的看这个,个人观点,不代表正确)##

解说:今天用nginx反代通讯项目,发现平均1分钟左右,就会出现webSocket连接中断,然后查看了一下,是nginx出现的问题。

原因是:nginx等待你 第一次通讯和第二次通讯的时间差超过了它设定的最大等待时间,简单来说就是,超时,所以就啪的一声断了,开始上解决步骤。

解决方案一

其实只要配置nginx.conf的对应localhost里面的这几个参数就好
  1. proxy_connect_timeout;
  2. proxy_read_timeout;
  3. proxy_send_timeout;

解决方案二

发心跳包,原理就是在有效地再读时间内进行通讯,重新刷新再读时间

备注:配置的位置为localhost,给出简略地址

 http {
	server {
		location / {
		    root   html;
	        index  index.html index.htm;
		    proxy_pass http://webscoket; 
		    proxy_http_version 1.1; 
	      	    proxy_connect_timeout 4s; #配置点1
		    proxy_read_timeout 60s; #配置点2,如果没效,可以考虑这个时间配置长一点
		    proxy_send_timeout 12s; #配置点3
		    proxy_set_header Upgrade $http_upgrade; #这是webSocket的配置,与此篇博客无关
		    proxy_set_header Connection "Upgrade"; #这是webSocket的配置,与此篇博客无关
		}
	}
}

关于配置2的解释

备注:这个是服务器对你等待最大的时间,也就是说,当你webSocket使用nginx转发的时候,用上面的配置2来说,如果60秒内没有通讯,依然是会断开的,所以,你可以按照你的需求来设定

举例: 比如说,我设置了10分钟,那么如果我10分钟内有通讯,或者10分钟内有做心跳的话,是可以保持连接不中断的,详细看个人需求 感谢评论区 @zigzagroad 的指正,希望可以帮到你们,如果有更好的方式,麻烦分享一下,谢谢

关于nginx相关配置的解释,可以看一下这个

地址:http://blog.csdn.net/liujiyong7/article/details/18228915

© 著作权归作者所有

共有 人打赏支持
jack__0023
粉丝 12
博文 15
码字总数 11440
作品 0
深圳
程序员
私信 提问
加载中

评论(9)

justqb
justqb
gfddgs
rocky_star
rocky_star
发心跳包就完了
jack__0023
jack__0023

引用来自“dy810810”的评论

心跳包才是维持websocke通道的解决办法,冒然设长各种timout时间,这种做法不合适。
你可以使用心跳包的,只要觉得合适就行,
归根结底也就是,在他再读的时间内有效的通信过就好
dy810810
dy810810
心跳包才是维持websocke通道的解决办法,冒然设长各种timout时间,这种做法不合适。
zigzagroad
zigzagroad

引用来自“jack-0023”的评论

引用来自“zigzagroad”的评论

引用来自“jack-0023”的评论

引用来自“zigzagroad”的评论

也就是 60秒之内 还要发一个类似于心跳包的东西来保持连接了
1、时间可以设置的,你可以查一下nginx的配置2代表什么意思,
2、你可以设置你觉得一定时间内不做出反应的时间,比如设置成1800s,30分钟,如果webSocket在30分钟内没有一次通讯,是否可以认为帮他踢出去?
3、而且如果在这个时间内有通讯,那还要心跳包做什么?你的假设是要看对应的场景来做的对吧,我这个是webSocket通讯。

我当然知道这个时间是可以设置的,从你的文章内容中很容易发现这一点。
我想表达的意思是 不管设置的是多长时间,在这个时间内(不管是不是心跳)仍然需要与服务器端至少通讯一次,否则还是会被Nginx断掉。
是的,看个人需求吧,可以考虑在一定影响范围内,针对你的需求进行设置。
不好意思,暂时我能想到的只有这个,如果有更好的方式,欢迎分享

机制就是这么设定的,估计应该跳脱不出这个框架,所以必然是要从业务中手动通讯一次了,如果长时间不通讯的话。
jack__0023
jack__0023

引用来自“zigzagroad”的评论

引用来自“jack-0023”的评论

引用来自“zigzagroad”的评论

也就是 60秒之内 还要发一个类似于心跳包的东西来保持连接了
1、时间可以设置的,你可以查一下nginx的配置2代表什么意思,
2、你可以设置你觉得一定时间内不做出反应的时间,比如设置成1800s,30分钟,如果webSocket在30分钟内没有一次通讯,是否可以认为帮他踢出去?
3、而且如果在这个时间内有通讯,那还要心跳包做什么?你的假设是要看对应的场景来做的对吧,我这个是webSocket通讯。

我当然知道这个时间是可以设置的,从你的文章内容中很容易发现这一点。
我想表达的意思是 不管设置的是多长时间,在这个时间内(不管是不是心跳)仍然需要与服务器端至少通讯一次,否则还是会被Nginx断掉。
是的,看个人需求吧,可以考虑在一定影响范围内,针对你的需求进行设置。
不好意思,暂时我能想到的只有这个,如果有更好的方式,欢迎分享
zigzagroad
zigzagroad

引用来自“jack-0023”的评论

引用来自“zigzagroad”的评论

也就是 60秒之内 还要发一个类似于心跳包的东西来保持连接了
1、时间可以设置的,你可以查一下nginx的配置2代表什么意思,
2、你可以设置你觉得一定时间内不做出反应的时间,比如设置成1800s,30分钟,如果webSocket在30分钟内没有一次通讯,是否可以认为帮他踢出去?
3、而且如果在这个时间内有通讯,那还要心跳包做什么?你的假设是要看对应的场景来做的对吧,我这个是webSocket通讯。

我当然知道这个时间是可以设置的,从你的文章内容中很容易发现这一点。
我想表达的意思是 不管设置的是多长时间,在这个时间内(不管是不是心跳)仍然需要与服务器端至少通讯一次,否则还是会被Nginx断掉。
jack__0023
jack__0023

引用来自“zigzagroad”的评论

也就是 60秒之内 还要发一个类似于心跳包的东西来保持连接了
1、时间可以设置的,你可以查一下nginx的配置2代表什么意思,
2、你可以设置你觉得一定时间内不做出反应的时间,比如设置成1800s,30分钟,如果webSocket在30分钟内没有一次通讯,是否可以认为帮他踢出去?
3、而且如果在这个时间内有通讯,那还要心跳包做什么?你的假设是要看对应的场景来做的对吧,我这个是webSocket通讯。
zigzagroad
zigzagroad
也就是 60秒之内 还要发一个类似于心跳包的东西来保持连接了
WebSocket加入心跳包防止自动断开连接

近日,在公司中开发一个使用websocket为前端推送消息的功能时,发现一个问题:就是每隔一段时间如果不传送数据的话,与前段的连接就会自动断开; 刚开始以为是session的原因,因为web sessi...

潘天涯
08/10
0
0
Nginx 作为 WebSockets 代理

WebSocket 协议给我们提供了一个创建可以支持客户端和服务端进行双向实时通信的web应用程序的方法。相比之前使用的方法,WebSocket(作为HTML5的一部分)可以使我们更容易开的发出这种类型的...

oschina
2014/05/17
52.7K
42
实时通信技术之websocket

本文章即从4个方面带大家了解websocket: websocket是什么? 为什么需要 WebSocket ? websocket的优点与缺点? websocket的相关使用(客户端与服务器端)? websocket的相关协议与规范? 一...

一看就喷亏的小猿
11/03
0
0
spring websocket 和socketjs实现单聊群聊,广播的消息推送详解

spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSo...

浅色夏墨
08/17
0
0
Shou.TV 背后基于 Node.js 和 WebSocket 的技术架构

我们使用一个定制的基于WebSocket的协议SLSP来实现广播和直播。所有组件均由Nginx代理,部署于Ubuntu server上。组件间通过HTTP和JSON通讯。 技术 在Shou.TV,我们有如下几条“军规”。我们尽...

oschina
2014/08/15
9.4K
8

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
29分钟前
2
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
1
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
2
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部