Next.js에서 클러스터링 및 부하분산

Next.js는 React 기반의 프레임워크로, 서버 사이드 렌더링을 제공하는 동시에 클라이언트 사이드 렌더링도 지원합니다. 그러나 단일 서버에서 동작하는 경우, 대규모 트래픽을 처리할 수 없을 수도 있습니다. 이를 해결하기 위해 Next.js에서 클러스터링과 부하분산을 구현하는 방법을 알아보겠습니다.

1. 클러스터링이란?

클러스터링은 단일 서버에서 여러 개의 워커 프로세스를 생성하여 부하를 분산시키는 방법입니다. 이를 통해 트래픽 처리 성능을 향상시킬 수 있습니다. Next.js에서는 cluster 모듈을 사용하여 클러스터링을 구현할 수 있습니다.

2. Next.js에서의 클러스터링 구현

Next.js에서 클러스터링을 구현하기 위해서는 server.js 파일에서 작업을 해주어야 합니다.

먼저 다음과 같이 cluster 모듈을 import 합니다.

const cluster = require('cluster');
const os = require('os');

그리고 클러스터링을 구현할 부분을 다음과 같이 수정합니다.

if (cluster.isMaster) {
  const numWorkers = os.cpus().length;

  console.log(`Master cluster setting up ${numWorkers} workers...`);

  for (let i = 0; i < numWorkers; i++) {
    cluster.fork();
  }

  cluster.on('online', (worker) => {
    console.log(`Worker ${worker.process.pid} is online`);
  });

  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died with code ${code}, and signal ${signal}`);
    console.log('Starting a new worker');
    cluster.fork();
  });
} else {
  // 기존의 Next.js 코드 작성
  require('next');
  // ...
}

위의 코드에서 isMaster를 확인하여 마스터 프로세스와 워커 프로세스를 구분합니다. 마스터 프로세스는 서버 인스턴스를 생성하고 워커 프로세스를 생성하여 관리합니다. 각 워커 프로세스는 실제로 Next.js 앱을 실행합니다.

  1. 부하분산을 위한 Nginx 설정

클러스터링을 구현한 Next.js 앱을 부하분산하기 위해서는 Nginx를 사용할 수 있습니다.

Nginx 설정 파일을 열고 다음과 같이 작성합니다.

upstream nextjs_cluster {
    least_conn;
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    server 127.0.0.1:3002;
    // 워커 프로세스의 개수만큼 서버를 추가합니다.
}

위의 설정을 적용하면 Nginx는 이 세 개의 포트에 위치한 Next.js 앱들에 부하를 고르게 분산시킵니다.

마치며

Next.js에서 클러스터링과 부하분산을 구현하는 방법에 대해 알아보았습니다. 클러스터링은 대규모 트래픽을 처리하기 위해 사용되며, Nginx와 함께 사용하면 더욱 효과적으로 부하를 분산시킬 수 있습니다.