확장 가능한 Node.js 애플리케이션을 구축하는 것은 오늘날 개발자의 중요한 관심사이다. Node.js 프로세스를 관리하는 데 가장 많이 사용되는 도구로 PM2를 들 수 있다. 이 글에서는 PM2의 개요, 주요 기능, 확장 가능한 애플리케이션을 빌드하는 데 사용하는 모범 사례를 소개한다.
PM2 개요
PM2는 Node.js 애플리케이션을 위한 프로세스 관리자이다. 이 도구는 Node.js 애플리케이션을 시작, 중지, 관리하고 로그를 모니터링하고 프로세스 장애를 관리할 수 있다. PM2는 안정성과 확장성이 주요 관심사인 프로덕션 환경에서 애플리케이션을 관리하는 데 그 진가를 발휘한다.
클러스터링 모드
PM2의 가장 강력한 기능이라고 생각하는 것은 클러스터링 모드이다. 클러스터링 모드를 사용하면 동일한 포트에서 수신 대기하고 로드 밸런싱을 사용하여 들어오는 요청을 분산하는 여러 작업자 프로세스를 생성하여 Node.js 애플리케이션을 수평적으로 확장할 수 있다.
다음과 같이 클러스터링 모드에서 애플리케이션을 시작할 수 있다.
pm2 start app.js -i max
PM2가 클러스터링 모드에서 애플리케이션을 시작하고 호스트 컴퓨터에서 사용 가능한 CPU 코어 수만큼의 작업자 프로세스를 자동으로 생성하도록 한다. -i 옵션을 사용하여 생성할 작업자 프로세스 수를 지정할 수도 있다.
NODE_APP_INSTANCE의 사용
PM2는 각 작업자 프로세스를 고유하게 식별하는 데 사용할 수 있는 NODE_APP_INSTANCE라는 환경 변수를 제공한다. 이는 로깅, 디버깅, 로드 밸런싱에 특히 유용하다.
예를 들어 애플리케이션 코드에서 NODE_APP_INSTANCE를 사용하여 각 워커 프로세스의 메시지를 로깅할 수 있다.
const pm2WorkerId = process.env.NODE_APP_INSTANCE;
console.log(`Worker ${pm2WorkerId} is processing the request`);
다음에서 PM2 클러스터 모드에서 실행 중인 Node.js 애플리케이션에서 로드 밸런싱을 위해 NODE_APP_INSTANCE를 사용할 수 있는 가능성을 볼 수 있다.
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
console.log(`Worker ${process.pid} started`);
// Start server
http.createServer((req, res) => {
const workerId = parseInt(process.env.NODE_APP_INSTANCE || 0);
console.log(`Request handled by worker ${workerId}`);
// Load balancing logic based on worker ID
if (workerId === 0) {
res.writeHead(200);
res.end('Hello from worker 0\n');
} else if (workerId === 1) {
res.writeHead(200);
res.end('Hello from worker 1\n');
} else {
res.writeHead(200);
res.end('Hello from other workers\n');
}
}).listen(8000);
console.log(`Worker ${process.pid} listening on port 8000`);
}
작업자 프로세스 간에 들어오는 요청을 로드 밸런싱하기 위해 NODE_APP_INSTANCE 환경 변수를 사용할 수 있다. 작업자 프로세스가 요청을 처리할 때 process.env 객체에서 NODE_APP_INSTANCE 값을 추출하여 요청에 응답할 방법을 결정하는 데 사용하면 된다.
물론 실제 시나리오에서는 각 워커 프로세스의 워크로드 및 기타 요인을 고려한 보다 정교한 부하 분산 알고리즘을 사용해야 할 것이다.
모범 사례
PM2를 사용할 때는 애플리케이션 상태와 로그를 정기적으로 모니터링하여 잠재적인 문제를 파악하는 것이 중요하다. PM2는 모니터링 도구가 내장되어 있을 뿐만 아니라 외부 모니터링 솔루션과의 통합도 지원한다.
PM2 사용의 다른 모범 사례도 있다.
- 실패한 워커 프로세스를 자동으로 다시 시작하도록 PM2 구성하기.
- PM2의 기본 제공 로깅 기능을 사용하여 애플리케이션 로그 모니터링.
- PM2의 구성 설정을 미세 조정하여 애플리케이션의 성능 최적화.
마무리
PM2는 Node.js 프로세스를 관리하기 위한 강력한 도구이며, 클러스터링 모드는 들어오는 요청을 처리할 수 있는 확장 가능한 방법을 제공한다. NODE_APP_INSTANCE를 사용하면 애플리케이션의 성능과 확장성을 더욱 최적화할 수 있다. PM2 사용 모범 사례를 따르면 Node.js 애플리케이션이 안정적으로 실행되도록 보장할 수 있다.