클러스터링 개념 이해 (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로 로드 밸런싱을 설정하면, 높은 가용성과 성능을 가진 웹 서비스를 구축할 수 있습니다.