본문 바로가기
프로토콜

[WebSocket] 웹소켓 연결이 금방 끊어질 때 확인할 사항 (Websocket Closed)

by 책 읽는 개발자_테드 2020. 11. 19.
반응형

웹소켓 연결이 금방 끊어질 때 확인할 사항 (Websocket Closed)

 

회사 서비스에서 예약이 들어오면 웹소켓을 통해 메세지를 전달받고 있다. 그런데 IE를 제외한 브라우저에서 메세지 전달이 어느 순간 끊어지는 현상이 발생했다.

 

좀 더 살펴보니 브라우저에서는 1분이 지나면 websocket.onclose 함수가 호출되고 있었다. 즉, 1분 마다 웹소켓이 끊어지고 있었다. 

 

삽질

혹시나 하는 마음에 웹서버 설정 파일을 열었는데 클라이언트와 연결 시간을 관리하는 keepalive_timeout이 아래 사진 처럼 65초였다.

이거다! 하는 생각으로 시간을 변경해 봤지만 소용없었다.

 

해결

위에 설명한 현상에 대한 구글링을 하던 중 다음과 같은 글을 발견했다.

https://stackoverflow.com/questions/29579208/why-does-my-websocket-close-after-a-few-minutes/29580228

 

요약하면, 주기적으로 통신하지 않는 클라이언트의 소켓을 끊어버리는 호스팅 서버들이 있다고 한다. 그래서 사용 중인 AWS 서비스를 확인해보니 ELB(로드밸런스)에서 유휴 제한 시간이 기본 60초였다. 60초 이상 통신하지 않는 클라이언트의 소켓은 끊어버리는 것이었다.  

 

현재 관리하는 서비스의 웹서버 사용량은 여유로웠으므로, 유휴 제한 시간을 늘려주었다.

 

그리고 웹소켓이 끊어질때, 다시 연결하는 코드를 추가적으로 삽입했다.

var ws = new WebSocket("");
ws.onopen = function() {  
};  
		
ws.onmessage = function() {  
};  
        
ws.onclose = function() {  
	   setTimeout(socketInit, 300); // 웹소켓을 재연결하는 코드 삽입
};  

ws.onerror = function() {  
};  

 

결론

1. 호스팅 서버 설정을 확인하라.

2. 웹소켓 연결 코드를 수정하라.

반응형

댓글