Pm2

PM2는 Node.js 애플리케이션을 위한 고급 프로덕션 프로세스 관리자.
이는 내장된 로드 밸런서를 포함하고 있으며, 애플리케이션을 항상 실행 상태로 유지하고, 시스템 재부팅 시에도 자동으로 재시작할 수 있게 해주는 도구.

프로세스 관리의 중요성:

  • 서버 애플리케이션을 운영할 때는 단순히 애플리케이션을 실행하는 것 이상의 관리가 필요하다.
    예기치 않은 충돌이 발생할 수 있고, 서버가 재시작될 수 있으며, 성능 모니터링이 필요할 수 있다.
    PM2는 이러한 운영 관련 문제들을 효과적으로 해결해주는 도구.

주요 기능

  1. 프로세스 관리:

    • 애플리케이션 시작, 중지, 재시작
    • 시스템 재부팅 시 자동 재시작
    • 클러스터 모드를 통한 로드 밸런싱
    • 무중단 리로드 지원
  2. 모니터링:

    • CPU 사용량과 메모리 사용량 모니터링
    • HTTP/HTTPS 트래픽 모니터링
    • 에러 로그와 커스텀 메트릭스 추적
    • 웹 기반 대시보드 제공
  3. 로깅:

    • 실시간 로그 확인
    • 로그 로테이션
    • 로그 파일 관리
  4. 배포 관리:

    • 여러 환경(개발, 스테이징, 프로덕션)에 대한 설정을 쉽게 관리할 수 있다.

설치 및 기본 사용법

설치

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는 강력한 모니터링 기능을 제공한다.
    pm2 monit 명령어를 통해 실시간으로 프로세스의 상태를 확인할 수 있으며, 웹 기반 대시보드인 PM2 Plus를 통해 더 상세한 모니터링이 가능하다.

  • 로그 관리도 가능하다:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    # 실시간 로그 확인
    pm2 logs
    
    # 특정 애플리케이션의 로그만 확인
    pm2 logs app-name
    
    # 에러 로그만 확인
    pm2 logs --err
    
    # 로그 파일 위치 확인
    pm2 desc app-name
    

클러스터 모드와 로드 밸런싱

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를 사용할 때의 모범 사례

  1. 항상 ecosystem.config.js 파일을 사용하여 설정을 관리한다.
  2. 프로덕션 환경에서는 watch 모드를 비활성화한다.
  3. 적절한 메모리 제한을 설정한다.
  4. 로그 로테이션을 설정하여 디스크 공간을 관리한다.
  5. 모니터링을 통해 성능 문제를 사전에 감지한다.

참고 및 출처