Nginx代理webSocket经常中断的解决方案, 如何保持长连接
Nginx代理webSocket经常中断的解决方案, 如何保持长连接
jack-0023 发表于4个月前
Nginx代理webSocket经常中断的解决方案, 如何保持长连接
  • 发表于 4个月前
  • 阅读 887
  • 收藏 59
  • 点赞 0
  • 评论 9

腾讯云 技术升级10大核心产品年终让利>>>   

背景

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

想看解决的,直接 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

标签: nginx WebSocket JAVA
共有 人打赏支持
粉丝 8
博文 7
码字总数 3220
评论 (9)
zigzagroad
也就是 60秒之内 还要发一个类似于心跳包的东西来保持连接了
jack-0023

引用来自“zigzagroad”的评论

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

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

引用来自“zigzagroad”的评论

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

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

引用来自“zigzagroad”的评论

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

引用来自“zigzagroad”的评论

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

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

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

引用来自“zigzagroad”的评论

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

引用来自“zigzagroad”的评论

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

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

机制就是这么设定的,估计应该跳脱不出这个框架,所以必然是要从业务中手动通讯一次了,如果长时间不通讯的话。
dy810810
心跳包才是维持websocke通道的解决办法,冒然设长各种timout时间,这种做法不合适。
jack-0023

引用来自“dy810810”的评论

心跳包才是维持websocke通道的解决办法,冒然设长各种timout时间,这种做法不合适。
你可以使用心跳包的,只要觉得合适就行,
归根结底也就是,在他再读的时间内有效的通信过就好
rocky_star
发心跳包就完了
justqb
gfddgs
×
jack-0023
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: