Node.js네트워크와 HTTP

HTTP timeout, keep-alive, graceful shutdown

HTTP 서버가 단순히 요청을 받는 것을 넘어, timeout과 keep-alive를 어떻게 다루고 종료 시 어떤 순서로 정리해야 하는지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

javascript
server.requestTimeout = 30_000;
server.keepAliveTimeout = 5_000;

process.on("SIGTERM", () => {
  server.close(() => {
    process.exit(0);
  });
});

설명

  • Node.js HTTP 서버는 단순히 listen()만 하면 끝나지 않습니다. 실제 운영에서는 느린 클라이언트, 반쯤 열린 연결, 종료 중인 서버가 남겨 둔 요청 같은 문제를 함께 다뤄야 합니다.
  • requestTimeout, headersTimeout, keepAliveTimeout 같은 설정은 "얼마나 오래 기다릴 것인가"를 정합니다. 이 값들은 성능 옵션이라기보다 서버 보호 정책에 가깝습니다.
  • keep-alive는 연결 재사용으로 성능을 높이지만, 종료 시점에는 기존 연결을 어떻게 정리할지도 함께 생각해야 합니다. 그렇지 않으면 배포 중 요청이 끊기거나 프로세스가 오래 남아 있을 수 있습니다.
  • graceful shutdown은 보통 새 요청을 더 받지 않게 하고, 진행 중인 요청이 마무리될 시간을 준 뒤, 마지막에 자원을 정리하는 흐름입니다. SIGTERM 처리와 server.close()는 그 출발점입니다.
  • 결국 HTTP 운영은 요청 처리 코드뿐 아니라 "서버가 언제까지 기다리고, 언제 어떻게 내려갈 것인가"를 계약처럼 정하는 작업입니다. 이 감각이 있어야 개발 서버와 운영 서버의 차이를 제대로 읽게 됩니다.

빠른 정리

항목의미
requestTimeout요청 전체 대기 시간 제한
headersTimeout헤더 수신 제한
keepAliveTimeout유휴 연결 재사용 대기 시간
server.close()새 연결 중단 후 기존 연결 정리
SIGTERM종료 시그널 처리 출발점

주의할 점

graceful shutdown 없이 프로세스를 바로 내리면 진행 중 요청이 중간에 끊길 수 있습니다. 반대로 종료 로직이 없으면 keep-alive 연결 때문에 프로세스가 생각보다 오래 살아남을 수도 있습니다.

참고 링크

2 sources