NestJS 혹은 Express에서 간헐적으로 502 응답이 오는 경우

이호영·2022년 8월 14일
2

NodeJS로 백엔드를 구성하고 ALB를 달아놓은 경우에 간혹가다 502응답이 오는 경우가 있습니다. 간혹가다 발생하고 서버에서 502 응답을 준 것은 아니기 때문에 문제를 찾기 어렵습니다.

원인

원인은 ALB와 NodeJS의 keep-alive 시간이 다르기 때문입니다. 로드밸런서는 대상 그룹과 연결을 유지하고 있습니다. ALB의 연결 유지 시간은 기본적으로 60초 입니다. 하지만 NodeJS는 따로 설정하지 않으면 기본값으로 5초로 설정되어 있습니다. Express나 NestS같은 프레임워크를 사용하는 경우에도 기본적으로 5초로 설정되어 있습니다.

참고: https://nodejs.org/api/http.html#serverkeepalivetimeout

해결방법

해결할 방법은 keep-alive 시간을 ALB보다 길게 설정해주면 됩니다. AWS 문서에서도 어플리케이션의 keep-alive 시간을 ALB에 설정된 것보다 길게 하라고 명시하고 있습니다.

참고: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#connection-idle-timeout

Express

const express = require('express');
const app = express();
const server = app.listen(3000);

server.keepAliveTimeout = 61 * 1000;
server.headersTimeout = 65 * 1000;

NestJS

import { Module, NestModule, OnApplicationBootstrap } from '@nestjs/common';
import { HttpAdapterHost } from '@nestjs/core';
import { Server } from 'node:http';

@Module({})
export class AppModule implements NestModule, OnApplicationBootstrap {
  constructor(private readonly refHost: HttpAdapterHost<any>) {}

  onApplicationBootstrap() {
    const server: Server = this.refHost.httpAdapter.getHttpServer();
    server.keepAliveTimeout = 61 * 1000;
    server.headersTimeout = 65 * 1000;
  }
}

참고

profile
안녕하세요!

1개의 댓글

comment-user-thumbnail
2023년 8월 11일

안녕하세요, node 깃허브 이슈에 보니 관련한 이슈는 이미 12버전이후로 해결됐다고 하는데 그럼에도 불구하고 keep-alive설정이 문제가 되나요?

답글 달기