Pm2#
PM2는 Node.js 애플리케이션을 위한 고급 프로덕션 프로세스 관리자.
이는 내장된 로드 밸런서를 포함하고 있으며, 애플리케이션을 항상 실행 상태로 유지하고, 시스템 재부팅 시에도 자동으로 재시작할 수 있게 해주는 도구.
프로세스 관리의 중요성:
- 서버 애플리케이션을 운영할 때는 단순히 애플리케이션을 실행하는 것 이상의 관리가 필요하다.
예기치 않은 충돌이 발생할 수 있고, 서버가 재시작될 수 있으며, 성능 모니터링이 필요할 수 있다.
PM2는 이러한 운영 관련 문제들을 효과적으로 해결해주는 도구.
주요 기능#
프로세스 관리:
- 애플리케이션 시작, 중지, 재시작
- 시스템 재부팅 시 자동 재시작
- 클러스터 모드를 통한 로드 밸런싱
- 무중단 리로드 지원
모니터링:
- CPU 사용량과 메모리 사용량 모니터링
- HTTP/HTTPS 트래픽 모니터링
- 에러 로그와 커스텀 메트릭스 추적
- 웹 기반 대시보드 제공
로깅:
배포 관리:
- 여러 환경(개발, 스테이징, 프로덕션)에 대한 설정을 쉽게 관리할 수 있다.
설치 및 기본 사용법#
1
2
| # 전역 설치
npm install -g pm2
|
명령어#
- pm2 start: 애플리케이션 시작
- pm2 stop: 애플리케이션 중지
- pm2 restart: 애플리케이션 재시작
- pm2 delete: 프로세스 삭제
- pm2 list: 실행 중인 프로세스 목록 확인
- pm2 monit: 프로세스 모니터링
- pm2 logs: 로그 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| # 애플리케이션 시작
pm2 start app.js
# 클러스터 모드로 시작 (CPU 코어 수만큼 프로세스 생성)
pm2 start app.js -i max
# 특정 개수의 인스턴스로 시작
pm2 start app.js -i 4
# 프로세스 목록 확인
pm2 list
# 모니터링
pm2 monit
# 로그 확인
pm2 logs
# 프로세스 중지
pm2 stop app
# 프로세스 재시작
pm2 restart app
# 프로세스 삭제
pm2 delete app
|
설정 파일을 통한 고급 설정#
PM2는 ecosystem.config.js 파일을 통해 더 상세한 설정이 가능하다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| module.exports = {
apps: [{
name: "my-app",
script: "./app.js",
instances: 4,
exec_mode: "cluster",
watch: true,
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
},
error_file: "logs/err.log",
out_file: "logs/out.log",
log_date_format: "YYYY-MM-DD HH:mm Z",
merge_logs: true,
autorestart: true,
max_memory_restart: "1G",
cron_restart: "0 0 * * *"
}]
}
|
이 설정 파일은 다음과 같은 고급 기능들을 제공한다:
- 여러 환경(개발/운영)에 대한 설정
- 자동 재시작 조건 설정
- 로그 관리 설정
- 크론 작업을 통한 정기적인 재시작
- 메모리 제한 설정
실제 운영 환경 예시#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| // 운영 환경 설정 예시
module.exports = {
apps: [{
name: 'api-server',
script: './api/app.js',
instances: 'max',
exec_mode: 'cluster',
watch: false,
max_memory_restart: '1G',
env_production: {
NODE_ENV: 'production',
PORT: 3000,
},
error_file: '/var/log/api-server/err.log',
out_file: '/var/log/api-server/out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
merge_logs: true,
autorestart: true,
}, {
name: 'worker',
script: './worker/index.js',
instances: 2,
watch: false,
env_production: {
NODE_ENV: 'production',
},
}]
}
// 실행 명령어
// pm2 start ecosystem.config.js --env production
|
모니터링과 로그 관리#
클러스터 모드와 로드 밸런싱#
PM2의 클러스터 모드는 Node.js의 cluster 모듈을 활용하여 여러 프로세스를 생성하고 요청을 분산시킨다.
이를 통해 CPU 코어를 최대한 활용하고 애플리케이션의 성능을 향상시킬 수 있다.
1
2
3
4
5
6
7
8
| # CPU 코어 수만큼 프로세스 생성
pm2 start app.js -i max
# 특정 개수의 프로세스 생성
pm2 start app.js -i 4
# 런타임에 프로세스 수 조정
pm2 scale app +3
|
실무에서 PM2를 사용할 때의 모범 사례#
- 항상 ecosystem.config.js 파일을 사용하여 설정을 관리한다.
- 프로덕션 환경에서는 watch 모드를 비활성화한다.
- 적절한 메모리 제한을 설정한다.
- 로그 로테이션을 설정하여 디스크 공간을 관리한다.
- 모니터링을 통해 성능 문제를 사전에 감지한다.
참고 및 출처#