카테고리 없음

nodejs 서버가 종료되지 않는 경우

lovian 2023. 3. 14. 10:53

배경

  • koa framework를 이용하여 서버를 개발 중
  • 기동, 종료 스크립트도 만들어서 잘 사용하고 있음 (signal handling)
  • websocket이 필요해서 koa-websocket을 적용
  • 가끔 종료 스크립트에서 무한대기가 발생(hang)

 

추적

문제 발생 조건 확인

  • 서버 기동 후 바로 종료를 했는데, 문제가 없음을 확인
  • 서버가 받을 수 있는 모든 입력을 전달 했음 -> 문제 발생을 확인
  • 입력을 하나씩 줄여가면서 범위를 좁혔음 -> websocket 접속이 하나 생기면 문제가 생기는 것을 확인
  • websocket을 클라이언트 측에서 끊으면 문제가 없음을 확인

websocket을 더 추적

  • 서버가 종료 시그널을 받으면, 모든 websocket을 닫는 작업을 추가 -> 문제 미해결
  • 하는김에 http request에 있는 socket도 닫는 작업을 추가 -> 문제 미해결
  • netserver가 생성하는 모든 연결을 닫는 작업을 추가 -> 해결
반영 방법
- NetServer 인스턴스에서 'connection' 이벤트가 발생할때마다 전달되는 net.Socket 객체를 map에 저장
- 종료 시그널을 받으면 map에 있는 모든 net.Socket을 꺼내서 close 호출

 

websocket만의 문제 처럼 보였지만, NetServer의 net.Socket과 websocket이 엮여서 발생한 문제로 판단됨
net.Socket만 종료해줘도, websocket은 종료되었음.

원인

nodejs 문서를 참고하면, Server는 기존의 모든 연결이 종료되기 전까지 close 함수를 실행하지 않는다고 한다.

모종의 이유로 Socket이 닫히지 않았기 때문에 서버가 계속 기다린 상황이다.

 

※ 모종의 이유는 귀찮아서 더 분석하지 않았다.

Event: 'close'#
Added in: v0.5.0
Emitted when the server closes. If connections exist, this event is not emitted until all connections are ended.

https://nodejs.org/api/net.html#class-netserver

 

Net | Node.js v19.7.0 Documentation

Net# Source Code: lib/net.js The node:net module provides an asynchronous network API for creating stream-based TCP or IPC servers (net.createServer()) and clients (net.createConnection()). It can be accessed using: const net = require('node:net'); IPC sup

nodejs.org