利用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自动断开, 怎么保持长连接相关推荐

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

    为什么80%的码农都做不了架构师?>>>    背景 这天气够热的,要处理的事情也够多的.... 想看解决的,直接 ctrl+f搜索关键字'配置点'## 开始前交代(想看原因的看这个 ...

  2. Nginx代理WebSocket方法

    微信公众号:运维开发故事,作者:姜总 大家好,我是小姜. 前一篇文章讲了一下什么是WebSocket协议,这里在回顾一下,并且聊一聊如何用nginx来代理WebSocket. WebSocket是HT ...

  3. Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接<2021SC@SDUSC>

    2021SC@SDUSC Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接 实例要求: Http 协议是无状态的, 浏览器和服务器间的请求响应一次,下一次会重新创建连接. 要求 ...

  4. nginx代理WebSocket配置

    代理WebSocket的示例配置 # /etc/nginx/conf.d/proxy-http.conf server {listen 8080;server_name api.mydomain.co ...

  5. 庖丁解牛:Xshell连接虚拟机中的Linux时经常自动断开,断开之后还很难连接上

    文章目录 问题重现: 原因分析: 解决方案 解决方案一: 解决方案二 问题重现: xshell连接虚拟机,一段时间后自动断开,有时候一分钟就短开了. 原因分析: 极大可能是因为IP地址冲突,在IP不冲 ...

  6. mysql没多久自动断开服务_mysql 长时间没连接了 就会自动断开服务

    这是因为mysql 长时间没连接了 就会自动断开服务. 解决办法 1.首先,下载必须的jar包 dbcp 包,目前版本是1.2.1:http://jakarta.apache.org/commons/ ...

  7. 客户端连接mysql 自动断开_MySql连接空闲8小时自动断开的原因及连接池配置方法...

    数据库连接超时时间查询 非交互式超时时间,如 JDBC 程序 show global variables like 'wait_timeout'; 交互式超时时间,如数据库工具 show global ...

  8. Nginx代理websocket

    nginx.conf配置 server {listen 8090; server_name localhost;add_header Access-Control-Allow-Origin *;add ...

  9. Nginx 代理 WebSocket

    2019独角兽企业重金招聘Python工程师标准>>> WebSocket连接异常:Error during WebSocket handshake: Unexpected resp ...

最新文章

  1. form表单提交前进行ajax或js验证,校验不通过不提交
  2. 百度成为“数字中国”建设核心推动力
  3. 修改帝国cms验证码 每个都不一样
  4. 机器学习8-集成学习
  5. Android 轻松实现语音朗读
  6. 一首歌是怎么诞生的?
  7. 官宣,PyTorch 1.0 稳定版本现已推出
  8. Fiddler使用教程
  9. 怎么理解java面向对象
  10. 《工业设计史》第九章:职业工业设计师的出现
  11. gjt常用命令---chalee
  12. 给小白分享几个学习Android的网站
  13. 使用微软官方工具制作Windows10的U盘启动盘
  14. Hibernate常见问题 No row with the given identifier exists问题的原因及解决
  15. 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)...
  16. Java基础-GUI入门-AWT详解
  17. 在OpenCV里用drawContours画轮廓
  18. 研究生英语读写译教程下课文译文及课后答案3
  19. Spring——IOC(Inversion of Control)容器(2)
  20. 阿里邮箱/网易邮箱个人版设置POP3使用

热门文章

  1. IDEA 导入maven项目后导(下载)包失败的问题
  2. 5G NR帧结构与物理资源
  3. 财务视角下的BI价值——把握客户需求,助推业财融合
  4. 【正点原子FPGA连载】 第一章 MPSoC简介 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
  5. OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大
  6. 腾讯云:聚焦“双十一”背后 不容忽视的电商风控与安全
  7. gif在html里为何会自动停止,CSS或JS实现gif动态图片的停止与播放
  8. 1万条数据大概占多大空间_10月漫画数据月报丨多平台收藏数,评论数较上月稳定提升,狐妖小红娘播放量再创新高...
  9. 消防人员实操训练模拟培训虚拟仿真实训系统软件
  10. 天大青医堂第十期报告会之一