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 앱을 실행합니다.
- 부하분산을 위한 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와 함께 사용하면 더욱 효과적으로 부하를 분산시킬 수 있습니다.