Nginx代理 问题
使用Nginx做服务器代理时遇到的问题
一、基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | server { listen 443 ssl; server_name www.jobs-interviews.cn; //代理域名,与证书域名相同 keepalive_timeout 10m; //上传时文档大小限制 ssl_certificate C:/nginx-1.19.2/conf/cert/7164979_jobs-interviews.cn.pem; ssl_certificate_key C:/nginx-1.19.2/conf/cert/7164979_jobs-interviews.cn.key; //证书与密钥 ssl_session_timeout 24h; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { proxy_pass https: //127.0.0.1:8443; //代理地址,重定向本地8443端口 proxy_redirect off; proxy_read_timeout 6000; //设置WebSocket超市时间 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade" ; } } |
二、上传时文件大小限制
在server下面添加 keepalive_timeout 10m; 限制上传大小为10M,默认为1M;
三、WebSocket连接不上
在server配置下location里面,新增proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
四、WebSocket时间长了断开
1、server配置 proxy_read_timeout 6000; 延长时间;
2、在Nginx延时基础上,前端在超时时间内做心跳检测
var socket; // 心跳检测,每隔一段时间检测连接状态,如果处于连接中,就像Server主动发送消息,来重置Server段与客户端的最大连接时间,如果已经断开,发起重连 var heartCheck = { // 9分钟发起一次心跳,比Server端设置的连接时间稍微小一点,在接近断开的情况下以通信的方式去重置连接时间 timeout: 550000, serverTimeoutObj: null, reset: function () { clearTimeout(this.serverTimeoutObj); return this; }, start: function () { this.serverTimeoutObj = setInterval(function () { if (socket.readyState == 1) { console.log("连接状态,发送消息保持连接"); socket.send("ping"); // 如果获取到消息,说明连接正常,重置心跳检测 heartCheck.reset().start(); } else { console.log("断开连接,尝试重连"); connect(); } }, this.timeout) } };
完整代码
// websocket连接 var websocket_connected_count = 0; var onclose_connected_count = 0; function newWebSocket(){ var websocket = null; // 判断当前环境是否支持websocket if(window.WebSocket){ if(!websocket){ var ws_url ="wss://"+Url+"/websocket"; websocket = new WebSocket(ws_url); } }else{ Tip("not support websocket"); } // 连接成功建立的回调方法 websocket.onopen = function(e){ heartCheck.reset().start(); // 成功建立连接后,重置心跳检测 Tip("connected successfully") } // 连接发生错误,连接错误时会继续尝试发起连接(尝试5次) websocket.onerror = function() { console.log("onerror连接发生错误") websocket_connected_count++; if(websocket_connected_count <= 5){ newWebSocket() } } // 接受到消息的回调方法 websocket.onmessage = function(e){ console.log("接受到消息了") heartCheck.reset().start(); // 如果获取到消息,说明连接是正常的,重置心跳检测 var message = e.data; if(message){ //执行接收到消息的操作,一般是刷新UI } } // 接受到服务端关闭连接时的回调方法 websocket.onclose = function(){ Tip("onclose断开连接"); } // 监听窗口事件,当窗口关闭时,主动断开websocket连接,防止连接没断开就关闭窗口,server端报错 window.onbeforeunload = function(){ websocket.close(); } // 心跳检测, 每隔一段时间检测连接状态,如果处于连接中,就向server端主动发送消息,来重置server端与客户端的最大连接时间,如果已经断开了,发起重连。 var heartCheck = { timeout: 55000, // 9分钟发一次心跳,比server端设置的连接时间稍微小一点,在接近断开的情况下以通信的方式去重置连接时间。 serverTimeoutObj: null, reset: function(){ clearTimeout(this.timeoutObj); clearTimeout(this.serverTimeoutObj); return this; }, start: function(){ var self = this; this.serverTimeoutObj = setInterval(function(){ if(websocket.readyState == 1){ console.log("连接状态,发送消息保持连接"); websocket.send("ping"); heartCheck.reset().start(); // 如果获取到消息,说明连接是正常的,重置心跳检测 }else{ console.log("断开状态,尝试重连"); newWebSocket(); } }, this.timeout) } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探