, 이름 = PM2
, 로고 =
, 장르 = 프로세스 관리자, 로드 밸런서
, 개발 = Unitech
, 발표 = 2013년
, 최신 버전 = 5.3.0
, 언어 = JavaScript, Node.js
, 플랫폼 = 크로스 플랫폼
, 라이선스 = AGPL 3.0
, 사이트 = 공식 홈페이지
)]
1. 개요
PM2(Process Manager 2)는 Node.js 애플리케이션을 위한 프로덕션(Production) 레벨의 프로세스 관리자이다.Node.js는 기본적으로 싱글 스레드(Single Thread)로 동작하며, 에러가 발생하면 프로세스가 종료되는 특성이 있다. 서버 운영 시 이러한 예기치 못한 종료를 방지하고, 서버가 재부팅되더라도 애플리케이션을 자동으로 실행해주며, 멀티 코어 시스템의 자원을 최대한 활용할 수 있도록 돕는 도구이다.
전 세계적으로 Node.js 백엔드 배포 환경에서 표준처럼 사용되고 있다.
2. 주요 특징
- 무중단 서비스 (Keep Alive)
- 클러스터 모드 (Cluster Mode)
- 무중단 배포 (Zero-downtime Reload)
- 모니터링
애플리케이션이 크래시(Crash)되거나 예기치 않게 종료되면, PM2가 이를 감지하여 즉시 자동으로 재시작시킨다.
Node.js의 단점인 싱글 스레드 한계를 극복하게 해준다. 서버의 CPU 코어 개수만큼 인스턴스를 복제하여 실행할 수 있으며, 들어오는 트래픽을 각 인스턴스에 자동으로 분산(Load Balancing)시켜 처리량을 극대화한다.
소스 코드를 업데이트하고 배포할 때, 서비스 전체를 껐다 켜는 것이 아니라 인스턴스를 하나씩 순차적으로 재시작하는 `reload` 기능을 제공하여 서비스 다운타임 없이 배포가 가능하다.
터미널 기반의 대시보드(`pm2 monit`)를 통해 현재 실행 중인 프로세스의 CPU, 메모리 점유율을 실시간으로 확인할 수 있다.
3. 사용법
npm이나 yarn을 통해 전역(Global)으로 설치하여 사용하는 것이 일반적이다.#!syntax bash
$ npm install pm2 -g
3.1. 기본 명령어
- `pm2 start app.js`: 애플리케이션 실행
- `pm2 start app.js -i max`: 클러스터 모드로 실행 (사용 가능한 모든 CPU 코어 사용)
- `pm2 list`: 현재 실행 중인 프로세스 목록 확인
- `pm2 monit`: 실시간 모니터링 대시보드 실행
- `pm2 logs`: 로그 확인
- `pm2 stop <id|name>`: 특정 프로세스 중지
- `pm2 delete <id|name>`: 특정 프로세스 제거
3.2. 설정 파일 (Ecosystem File)
실무에서는 명령어를 일일이 치기보다 `ecosystem.config.js`라는 설정 파일을 만들어 관리한다. 이 파일에 환경 변수, 인스턴스 개수, 로그 경로 등을 정의해두면 `pm2 start ecosystem.config.js` 명령어 하나로 복잡한 설정을 한 번에 실행할 수 있다.#!syntax javascript
module.exports = {
apps : [{
name : "my-app",
script : "./app.js",
instances : "max",
exec_mode : "cluster",
env: {
NODE_ENV: "development"
},
env_production: {
NODE_ENV: "production"
}
}]
}
4. 여담
- 개발 환경에서는 파일 변경을 감지해 재시작해주는 nodemon을 주로 쓰고, 배포(운영) 환경에서는 안정성을 위해 PM2를 쓰는 것이 국룰로 통한다.
- Docker 컨테이너 환경에서도 사용되지만, 도커 자체가 프로세스 관리를 해주거나 쿠버네티스(k8s)가 오케스트레이션 역할을 하기 때문에, 도커 환경에서는 `node app.js`로 직접 실행하는 것을 권장하는 의견도 있다. 하지만 도커 컨테이너 내부에서도 로그 관리나 멀티 코어 활용(클러스터 모드)을 위해 PM2를 사용하는 경우도 여전히 많다.