Node.js Clustering and load Balancing


클러스터링 개념 이해 (Understanding Clustering)

Node.js는 단일 스레드 이벤트 루프 기반으로 동작하기 때문에, 하나의 CPU 코어만을 사용할 수 있습니다. 하지만, cluster 모듈을 사용하면 여러 개의 프로세스를 생성하여 여러 CPU 코어를 활용할 수 있습니다.

클러스터링 예제

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // 워커 프로세스 생성
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died`);
  });
} else {
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello, world!\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}

이 코드는 CPU 코어 수만큼 워커 프로세스를 생성하여 HTTP 서버를 클러스터링하는 예제입니다.

PM2를 사용한 프로세스 관리 (Process Management with PM2)

PM2는 Node.js 애플리케이션을 프로덕션 환경에서 관리하기 위한 프로세스 관리자입니다. 클러스터링, 로드 밸런싱, 모니터링 등의 기능을 제공합니다.

PM2 설치 및 설정

npm install pm2 -g
애플리케이션 시작
pm2 start app.js -i max

-i max 옵션은 CPU 코어 수에 따라 최대한의 인스턴스를 생성합니다.

애플리케이션 모니터링
pm2 list
pm2 show <app_name>
애플리케이션 로그 보기
pm2 logs
애플리케이션 재시작
pm2 restart <app_name>
애플리케이션 종료
pm2 stop <app_name>

NGINX를 활용한 로드 밸런싱 설정 (Load Balancing with NGINX)

NGINX는 고성능 HTTP 서버로, 로드 밸런서로도 많이 사용됩니다. NGINX를 사용하여 여러 Node.js 인스턴스로의 요청을 분배할 수 있습니다.

NGINX 설치

Ubuntu를 기준으로 NGINX를 설치하는 명령어입니다.

sudo apt update
sudo apt install nginx

NGINX 설정 파일

# /etc/nginx/sites-available/default

server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

upstream nodejs_backend {
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
    server 127.0.0.1:8004;
}

위 설정은 NGINX가 example.com 도메인으로 들어오는 요청을 Node.js 백엔드 서버로 분배하도록 설정합니다.

NGINX 설정 반영

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

예제: Node.js와 PM2, NGINX를 사용한 클러스터링 및 로드 밸런싱

Step 1: Node.js 애플리케이션 작성

// app.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send(`Hello from process ${process.pid}`);
});

app.listen(8000, () => {
  console.log(`Server started by process ${process.pid}`);
});

Step 2: PM2로 애플리케이션 실행

pm2 start app.js -i max

Step 3: NGINX 설정 파일 작성 및 적용

# /etc/nginx/sites-available/default

server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://nodejs_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

upstream nodejs_backend {
    server 127.0.0.1:8000;
}
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

이렇게 설정하면 클러스터링된 Node.js 애플리케이션을 NGINX를 통해 로드 밸런싱할 수 있습니다. PM2를 사용하여 애플리케이션을 관리하고 NGINX로 로드 밸런싱을 설정하면, 높은 가용성과 성능을 가진 웹 서비스를 구축할 수 있습니다.


Leave a Reply

Your email address will not be published. Required fields are marked *