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; }}
按照上述方法设置好后,我们可以发现,如果在10分钟之内没有数据交互的话,websocket连接就会自动断开,所以这种方式还是有点问题,如果我页面停留时间超过十分钟而且又没有数据交互的话,连接还是会断开的,所以需要同时结合第二种方法.
上面nginx配置的时候还出了一个小插曲,微改了nginx配置之后,没有重启nginx服务,导致设置的过期时间一直没有生效,所以需要用 sudo nginx -s reload 重启nginx服务
2.在nginx延长超时时间的基础上,前端在超时时间内发心跳包,刷新再读时间,前端具体实现见如下代码(此处代码包含了前端整个websocket的实现过程,其中红色重点标注了发心跳包的内容):
<script>$(document).ready(function () {window.websocket = {};var userId = 'zqh';var api = 'localhost:8080';var msg = 'hello websocket';var app = {/***初始化socket,判断是否支持webSocket*/initSocket: function () {if ('WebSocket' in window) {websocket = new WebSocket("ws://" + api + "/webscoket/ID=" + userId);} else if ('MozWebSocket' in window) {websocket = new MozWebSocket("ws://" + api + "/webscoket/ID=" + userId);} else {websocket = new SockJS("http://" + api + "/sockjs/webscoket/ID=" + userId);}app.state();},/*** 状态*/state: function () {// 打开连接时websocket.onopen = function (evnt) {heartCheck.reset().start();console.log("websocket已启用");document.getElementById("WebSocketStatus").innerText = "websocket已启用";};// 收到消息时websocket.onmessage = function (event) {heartCheck.reset().start();document.getElementById("receivemsg").innerText = event.data;};//出错时websocket.onerror = function (evnt) {console.log("与后台握手出现问题!");};//关闭时websocket.onclose = function (evnt) {console.log("正在关闭 webSocket ");};}};app.initSocket();});// 心跳检测,每隔一段时间检测连接状态,如果处于连接中,就像Server主动发送消息,来重置Server段与客户端的最大连接时间,如果已经断开,发起重连var heartCheck = {// 9分钟发起一次心跳,比Server端设置的连接时间稍微小一点,在接近断开的情况下以通信的方式去重置连接时间timeout: 550000,serverTimeoutObj: null,reset: function () {clearTimeout(this.serverTimeoutObj);return this;},start: function () {this.serverTimeoutObj = setInterval(function () {if (websocket.readyState == 1) {console.log("连接状态,发送消息保持连接");websocket.send("ping");// 如果获取到消息,说明连接正常,重置心跳检测heartCheck.reset().start();} else {console.log("断开连接,尝试重连");app.initSocket();;}}, this.timeout)}};function send() {var msg = document.getElementById("sendmsg").value;heartCheck.reset().start();//发送消息websocket.send(msg);}</script>
上述过程就是保持长连接的过程。
参考文章:https://blog.csdn.net/cm786526/article/details/79939687
Nginx代理webSocket时60s自动断开, 怎么保持长连接相关推荐
- Nginx代理webSocket经常中断的解决方案, 如何保持长连接
为什么80%的码农都做不了架构师?>>> 背景 这天气够热的,要处理的事情也够多的.... 想看解决的,直接 ctrl+f搜索关键字'配置点'## 开始前交代(想看原因的看这个 ...
- Nginx代理WebSocket方法
微信公众号:运维开发故事,作者:姜总 大家好,我是小姜. 前一篇文章讲了一下什么是WebSocket协议,这里在回顾一下,并且聊一聊如何用nginx来代理WebSocket. WebSocket是HT ...
- Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接<2021SC@SDUSC>
2021SC@SDUSC Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接 实例要求: Http 协议是无状态的, 浏览器和服务器间的请求响应一次,下一次会重新创建连接. 要求 ...
- nginx代理WebSocket配置
代理WebSocket的示例配置 # /etc/nginx/conf.d/proxy-http.conf server {listen 8080;server_name api.mydomain.co ...
- 庖丁解牛:Xshell连接虚拟机中的Linux时经常自动断开,断开之后还很难连接上
文章目录 问题重现: 原因分析: 解决方案 解决方案一: 解决方案二 问题重现: xshell连接虚拟机,一段时间后自动断开,有时候一分钟就短开了. 原因分析: 极大可能是因为IP地址冲突,在IP不冲 ...
- mysql没多久自动断开服务_mysql 长时间没连接了 就会自动断开服务
这是因为mysql 长时间没连接了 就会自动断开服务. 解决办法 1.首先,下载必须的jar包 dbcp 包,目前版本是1.2.1:http://jakarta.apache.org/commons/ ...
- 客户端连接mysql 自动断开_MySql连接空闲8小时自动断开的原因及连接池配置方法...
数据库连接超时时间查询 非交互式超时时间,如 JDBC 程序 show global variables like 'wait_timeout'; 交互式超时时间,如数据库工具 show global ...
- Nginx代理websocket
nginx.conf配置 server {listen 8090; server_name localhost;add_header Access-Control-Allow-Origin *;add ...
- Nginx 代理 WebSocket
2019独角兽企业重金招聘Python工程师标准>>> WebSocket连接异常:Error during WebSocket handshake: Unexpected resp ...
最新文章
- form表单提交前进行ajax或js验证,校验不通过不提交
- 百度成为“数字中国”建设核心推动力
- 修改帝国cms验证码 每个都不一样
- 机器学习8-集成学习
- Android 轻松实现语音朗读
- 一首歌是怎么诞生的?
- 官宣,PyTorch 1.0 稳定版本现已推出
- Fiddler使用教程
- 怎么理解java面向对象
- 《工业设计史》第九章:职业工业设计师的出现
- gjt常用命令---chalee
- 给小白分享几个学习Android的网站
- 使用微软官方工具制作Windows10的U盘启动盘
- Hibernate常见问题 No row with the given identifier exists问题的原因及解决
- 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)...
- Java基础-GUI入门-AWT详解
- 在OpenCV里用drawContours画轮廓
- 研究生英语读写译教程下课文译文及课后答案3
- Spring——IOC(Inversion of Control)容器(2)
- 阿里邮箱/网易邮箱个人版设置POP3使用
热门文章
- IDEA 导入maven项目后导(下载)包失败的问题
- 5G NR帧结构与物理资源
- 财务视角下的BI价值——把握客户需求,助推业财融合
- 【正点原子FPGA连载】 第一章 MPSoC简介 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
- OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大
- 腾讯云:聚焦“双十一”背后 不容忽视的电商风控与安全
- gif在html里为何会自动停止,CSS或JS实现gif动态图片的停止与播放
- 1万条数据大概占多大空间_10月漫画数据月报丨多平台收藏数,评论数较上月稳定提升,狐妖小红娘播放量再创新高...
- 消防人员实操训练模拟培训虚拟仿真实训系统软件
- 天大青医堂第十期报告会之一