文档章节

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

jack__0023
 jack__0023
发布于 2017/08/02 17:48
字数 529
阅读 1195
收藏 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
粉丝 10
博文 11
码字总数 6000
作品 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
spring websocket 和socketjs实现单聊群聊,广播的消息推送详解

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

浅色夏墨
08/17
0
0
WebSocket 是什么原理?为什么可以实现持久连接?

作者:腾讯云技术社区 众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现。这种机制对于信息变化不是...

xiaogong1688
06/29
0
0
Spring消息之WebSocket

一、WebSocket简介 WebSocket 的定义?WebSocket是HTML5下一种全双工通信协议。在建立连接后,WebSocket服务器端和客户端都能主动的向对方发送和接收数据,就像Socket一样。 WebSocket 的由来...

jmcui
05/06
0
0
从HTML5 WebSocket到Socket.io

HTML5 WebSocket 作为新一代的web标准,HTML5为我们提供了很多有用的东西,比如canvas,本地存储(已经分离出去了),多媒体编程接口,当然还有我们的WebSocket。WebSocket是HTML5开始提供的...

Srtian
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里面试题

https://yq.aliyun.com/articles/6656 https://yq.aliyun.com/articles/7468

jason_kiss
28分钟前
3
0
阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统

背景 秒杀活动是绝大部分电商选择的低价促销,推广品牌的方式。不仅可以给平台带来用户量,还可以提高平台知名度。一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验...

别打我会飞
34分钟前
2
0
188. jsp提出公共的资源

平时我们会在一个地方 写一些重复的东西,为了便于管理我们需要将它提炼出来 1. 问题现象 2. 解决方式 (1) 提炼出该内容 <script type="text/javascript"> var net ={url: "${pageContext....

Lucky_Me
41分钟前
1
0
集合

集合 集合 集合介绍 前面的学习,我们知道数据多了,使用数组存放。而且数组中存放的都是基本类型的数据,并且数组是定长的。当在程序中创建的对象比较多的时候,需要对这些对象进行统一的管...

码农屌丝
48分钟前
1
0
jsp页面手写翻页小记

<s:if test="totalPage > 1"> <tr align="center"> <td colspan="4" align="center" style="height: 25px; text-align: center;">......

JackChenzp
48分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部