nginx 프 록 시 웹 소켓 시 자동 으로 연결 끊 기

3352 단어 전단
얼마 전에 작은 편집 자 는 웹 소켓 프로젝트 를 만 들 었 기 때문에 실시 간 채 팅 을 실현 할 수 있 었 습 니 다. 그러나 최근 이틀 동안 작은 편집 자 는 갑자기 문 제 를 발 견 했 습 니 다. 제 프로젝트 가 nginx 에 역방향 대 리 를 했 기 때문에 웹 소켓 프로 토 콜 이 연 결 된 후에 자동 으로 연결 이 끊 깁 니 다 (nginx 는 지난 1 분 동안 자동 으로 빨리 열 리 고 로 컬 은 외부 네트워크 로 natapp 을 관통 하여 5 분 동안 자동 으로 끊 깁 니 다).처음에 편집장 님 은 이런 일이 있 었 는 지 몰 랐 는데 여러 가지 인터넷 검색 을 통 해 알 게 되 었 습 니 다. 다음 에 해결 방법 두 가 지 를 써 드 리 겠 습 니 다 ~
1. nginx 가 역방향 대 리 를 설정 할 때 proxy 가 있 습 니 다.read_timeout 항목, 연결 성공 후백 엔 드 서버 응답 대기 시간사실 백 엔 드 줄 에 들 어가 서 처 리 를 기다 리 고 있 습 니 다 (백 엔 드 서버 처리 요청 시간 이 라 고도 할 수 있 습 니 다). 기본 60 초 입 니 다. socket 프로 토 콜 연결 시간 만 고려 하고 싶다 면 이 설정 의 시간 을 길 게 조절 할 수 있 습 니 다 ~
그리고 두 개의 설정 항목 이 있 습 니 다:
proxy_connect_timeout :백 엔 드 서버 연결 시간 초과악 수 를 하 며 응답 시간 초과 기다 리 기;
proxy_send_timeout :백 엔 드 서버 데이터 전송 시간정 해진 시간 안에 백 엔 드 서버 가 모든 데 이 터 를 전송 해 야 한 다 는 것 이다.
프로 토 콜 연결 기간 에 다른 오류 가 발생 하지 않도록 문자 그대로 길 게 조절 할 수 있 습 니 다!
2. 상기 항목 을 설정 한 후 설정 한 시간 범위 내 에서 자동 으로 끊 기 는 오류 가 발생 하지 않 습 니 다. 그러나 이 시간 대 에 어떠한 통신 도 하지 않 으 면 설정 한 시간 범위 에 도달 한 후에 자동 으로 연결 을 끊 습 니 다. 해결 방법 은 설정 시간 범위 가 도착 하기 전에 심장 박동 가방 을 새로 고침 하고 다시 읽 는 시간 입 니 다.(이 방법 으로 프로 토 콜 연결 상황 을 다시 연결 하고 끊 으 면 다시 연결 하 는 것 입 니 다) 코드
이 프로젝트 는 백 스테이지 SpringMVC + 프런트 amazeUI 프레임 워 크 를 사용 하여 이 루어 졌 으 니 참고 할 때 변 함 이 없습니다 ~ ~ ~
var lockReconnect = false;
var ws = null;
var url = "ws://"+location.host+"/chatServer/${userid}";
createWebSocket(url);

function createWebSocket(url){
    try{
        if("WebSocket" in window){
            ws = new WebSocket(url);
	}else if("MozWebSocket" in window){
            ws = new MozWebSocket(url);
	}else{
	    layer.msg("        websocket  ,        、      ,    IE10     ,360          ,        !", { offset: 0});
	}
	initEventHandle();
    }catch(e){
	reconnect(url);
	console.log(e);
    }
}

function initEventHandle(){
    ws.onopen = function (evt) {
        heartCheck.reset().start();
	layer.msg("      ", { offset: 0});
    };
    ws.onmessage = function (evt) {
	heartCheck.reset().start();
	analysisMessage(evt.data);  //         ,     ,               
    };
    ws.onerror = function (evt) {
	reconnect(url);
	layer.msg("    ", { offset: 0});
    };
    ws.onclose = function (evt) {
	reconnect(url);
	layer.msg("      ," + evt.reason, { offset: 0});    
    };
}

//         ,      ,     websocket  ,             ,server     。
window.onbeforeunload = function() {
    ws.close();
}

function reconnect(url) { 
    if(lockReconnect) return; 
    lockReconnect = true; 
    setTimeout(function () { 
        //         ,           
	createWebSocket(url); 
	lockReconnect = false; 
    }, 2000); 
}

//   
var heartCheck = {
    timeout: 240000,   //               ,proxy_read_timeout                                 
    timeoutObj: null,
    serverTimeoutObj: null,
    reset: function(){
        clearTimeout(this.timeoutObj);
	clearTimeout(this.serverTimeoutObj);
	return this;
    },
    start: function(){
	var self = this;
	this.serverTimeoutObj = setTimeout(function(){
	    ws.send("ping"); 
            self.serverTimeoutObj = setTimeout(function(){
	        ws.close();  
	    }, self.timeout)
        }, this.timeout)
    }
}

중간 에 구체 적 인 업무 논리 에 당신들 의 것 을 쓰 면 됩 니 다!
테스트 를 통 해 이 방법 은 가능 합 니 다. 로 컬 에서 네트워크 를 통 해 natapp 과 nginx 를 관통 하면 자동 으로 연결 이 끊 기지 않 습 니 다 ~

좋은 웹페이지 즐겨찾기