PM2를 사용한 Node.js 무중단 배포 실무 가이드

서비스 중단 없이 배포하기: PM2 클러스터와 무중단 배포
운영 중인 백엔드 서비스를 배포할 때 가장 신경 쓰이는 부분은 역시 **서비스 중단 시간(Downtime)**입니다. 사용자가 서비스를 이용하는 도중에 서버가 꺼지고 새로 켜지는 몇 초 혹은 몇 분 동안 서비스는 먹통이 되며, 이는 비즈니스 신뢰도에 치명적인 영향을 줍니다. Node.js 생태계에서 서비스 중단 없이 안전하게 궤도를 돌리는 가장 쉽고 확실한 방법, 바로 PM2를 활용한 무중단 배포입니다.
1. PM2 개요 및 전역 설치
PM2는 Node.js 애플리케이션의 프로세스를 감시하고, 서버가 죽었을 때 자동으로 살려주며, 부하를 분산해주는 프로세스 매니저(Process Manager)입니다. 터미널의 세션이 끊어져도 백그라운드에서 백엔드가 계속 공전할 수 있도록 방아쇠를 당겨줍니다.
안정적인 관리를 위해 글로벌 옵션으로 설치합니다.
# 글로벌 권한으로 PM2를 설치합니다
npm install -g pm22. Cluster 모드와 ecosystem.config.js 설정
PM2에서 무중단 배포의 핵심은 클러스터(Cluster) 모드입니다. Node.js는 기본적으로 싱글 스레드로 동작하므로 멀티 코어 CPU를 100% 활용하지 못합니다. PM2 클러스터 모드는 서버의 코어 수만큼 인스턴스를 띄워 트래픽을 분산시킵니다.
설정을 관리하기 위해 프로젝트 루트에 ecosystem.config.js 파일을 생성하는 것이 좋습니다.
// ecosystem.config.js
module.exports = {
apps: [{
name: "node-app",
script: "./dist/app.js", // 실행 파일 경로
instances: "max", // 코어 수만큼 프로세스 생성
exec_mode: "cluster", // 클러스터 모드 활성화
env: {
NODE_ENV: "production"
}
}]
}3. 프로세스 등록 및 무중단 릴로드(Reload)
설정 파일이 준비되었다면 아래 명령어로 서버를 구동합니다.
# 설정 파일을 로드하여 클러스터 시작
pm2 start ecosystem.config.js현재 실행 중인 노드 서비스 목록과 리소스 사용량은 다음 명령어로 상시 조회할 수 있습니다.
# 현재 구동 중인 프로세스 리스트 확인
pm2 list
이제 소스코드가 변경되었을 때, 무중단 배포를 실행할 차례입니다.
핵심은 pm2 restart가 아닌 pm2 reload를 사용하는 것입니다.
restart: 모든 프로세스를 동시에 껐다 켭니다. 이 순간 짧은 다운타임이 발생합니다.reload: 인스턴스를 하나씩 순차적으로 재시작(Rolling Restart)합니다. 0번 인스턴스가 켜져서 트래픽을 수용할 때까지 1번 인스턴스는 대기하여, 사용자 요청이 유실되지 않습니다.
# 빌드를 완료한 후
npm run build
# 서비스를 순차적으로 재시작하여 다운타임 제로 달성
pm2 reload all0초 배포의 방아쇠를 당기며
배포는 개발 프로세스의 마지막 단계이자, 사용자와 코드가 만나는 가장 긴장되는 접점입니다.
PM2의 클러스터 분산과 reload 전략을 적절히 조합하면, 인프라의 가용성을 100% 보장하는 무중단 배포 시스템을 완성할 수 있습니다.
작은 설정의 변화 하나가 서비스 안정성이라는 거대한 결과의 방아쇠를 당깁니다. 여러분의 노드 애플리케이션도 다운타임 없이 안정적인 궤도 위에서 상시 작동하도록 방아쇠를 당겨보세요.