본문 바로가기

script&css&html&ajax

PM2의 주요 기능과 일반적으로 사용하는 기능

 

1. PM2란 무엇인가요?

  • PM2(Process Manager 2)*는 Node.js 애플리케이션의 프로세스를 관리하고 모니터링하는 프로덕션 프로세스 매니저입니다. PM2를 사용하면 다음과 같은 이점을 얻을 수 있습니다:
  • 애플리케이션의 가용성 향상: 자동 재시작, 로드 밸런싱, 클러스터링 등을 통해 애플리케이션의 가용성을 높입니다.
  • 프로세스 관리 간소화: 애플리케이션의 시작, 중지, 재시작 등을 간단한 명령어로 수행할 수 있습니다.
  • 모니터링 및 로깅: 실시간으로 애플리케이션의 상태와 로그를 확인할 수 있습니다.
  • 자동화된 배포: 설정 파일을 통해 애플리케이션의 배포 및 관리를 자동화할 수 있습니다.

2. PM2의 주요 기능

2.1 프로세스 관리

  • 시작, 중지, 재시작, 삭제: 애플리케이션 프로세스를 쉽게 관리할 수 있습니다.
  • 클러스터링 지원: 여러 프로세스를 생성하여 멀티코어 CPU를 활용할 수 있습니다.
  • 프로세스 제어: 특정 프로세스의 상태 확인, 로그 조회 등이 가능합니다.

2.2 자동 재시작

  • 애플리케이션이 예기치 않게 종료되면 자동으로 재시작합니다.
  • -watch 옵션을 사용하면 파일 변경 시 자동으로 재시작할 수 있습니다.

2.3 로드 밸런싱

  • 클러스터 모드를 통해 요청을 여러 프로세스에 분산시켜 처리량을 향상시킵니다.

2.4 로깅 및 로그 관리

  • 표준 출력(stdout)과 에러 출력(stderr)을 자동으로 캡처하여 로그 파일로 저장합니다.
  • pm2-logrotate 모듈을 통해 로그 파일의 크기 관리 및 로테이션을 지원합니다.

2.5 모니터링 및 디버깅

  • pm2 monit 명령어로 애플리케이션의 CPU, 메모리 사용량 등을 실시간으로 모니터링할 수 있습니다.
  • 애플리케이션의 상태를 실시간으로 확인하고, 이슈 발생 시 빠르게 대응할 수 있습니다.

2.6 환경 변수 및 설정 관리

  • 환경 변수를 설정하여 애플리케이션의 동작을 제어할 수 있습니다.
  • 설정 파일(ecosystem.config.js)*을 통해 애플리케이션의 구성 및 배포를 자동화할 수 있습니다.

2.7 서버 재부팅 시 자동 시작

  • pm2 startup 명령어를 통해 서버 재부팅 시 PM2가 자동으로 시작되도록 설정할 수 있습니다.
  • pm2 save 명령어로 현재 프로세스 상태를 저장하여 재부팅 후 자동으로 복원합니다.

3. PM2의 일반적인 사용법

3.1 PM2 설치

npm install pm2 -g
  • PM2를 전역으로 설치합니다.

3.2 애플리케이션 시작

pm2 start app.js
  • app.js 파일을 실행하여 애플리케이션을 시작합니다.

3.3 프로세스 관리 명령어

  • 프로세스 목록 확인
  • pm2 list
  • 프로세스 상태 확인
  • pm2 status
  • 프로세스 재시작
  • pm2 restart [프로세스 이름 또는 ID]
  • 프로세스 중지
  • pm2 stop [프로세스 이름 또는 ID]
  • 프로세스 삭제
  • pm2 delete [프로세스 이름 또는 ID]

3.4 로그 관리

  • 실시간 로그 확인
  • pm2 logs [프로세스 이름 또는 ID]
  • 특정 라인 수만큼 로그 확인
  • pm2 logs [프로세스 이름 또는 ID] --lines [라인 수]

3.5 프로세스 설정 변경

  • 환경 변수 설정
  • pm2 start app.js --name my-app --env production
  • 인스턴스 수 설정
    • i max는 가능한 모든 CPU 코어를 사용합니다.
  • pm2 start app.js -i max

3.6 프로세스 재로드

  • Zero Downtime Reload
    • 애플리케이션을 중단 없이 재시작합니다.
  • pm2 reload [프로세스 이름 또는 ID]

4. PM2 설정 파일: ecosystem.config.js

4.1 설정 파일의 역할

  • 애플리케이션의 프로세스 설정을 코드로 관리할 수 있습니다.
  • 여러 애플리케이션을 한꺼번에 관리하고, 복잡한 설정을 쉽게 적용할 수 있습니다.

4.2 기본 구조

module.exports = {
  apps: [
    {
      name: 'my-app',
      script: 'app.js',
      instances: 1,
      exec_mode: 'fork',
      env: {
        NODE_ENV: 'development',
      },
      env_production: {
        NODE_ENV: 'production',
      },
    },
  ],
};

4.3 주요 옵션

  • name: 애플리케이션의 이름입니다.
  • script: 실행할 스크립트 파일입니다.
  • instances: 실행할 인스턴스 수입니다. 숫자 또는 'max'로 설정할 수 있습니다.
  • exec_mode: 실행 모드입니다. 'fork' 또는 'cluster'로 설정할 수 있습니다.
  • env: 기본 환경 변수입니다.
  • env_production: 프로덕션 환경에서 사용할 환경 변수입니다.

4.4 설정 파일로 애플리케이션 시작

pm2 start ecosystem.config.js --env production
  • -env 옵션으로 사용할 환경을 지정합니다.

5. PM2를 사용한 애플리케이션 관리 예제

5.1 단일 인스턴스 애플리케이션 실행

pm2 start app.js --name my-app

5.2 멀티 인스턴스 애플리케이션 실행 (클러스터 모드)

pm2 start app.js -i max --name my-app --exec_mode cluster
  • 주의: 애플리케이션이 클러스터 모드에서 동작하도록 설계되었는지 확인해야 합니다.

5.3 파일 변경 시 자동 재시작

pm2 start app.js --watch
  • -watch 옵션은 파일 시스템의 변경을 감시하고, 변경 시 자동으로 애플리케이션을 재시작합니다.

5.4 환경 변수 설정

pm2 start app.js --name my-app --env production
  • 또는 ecosystem.config.js에서 env 옵션을 사용합니다.

5.5 시작 스크립트에 인자 전달

pm2 start app.js --name my-app -- arg1 arg2
  • - 이후의 인자는 process.argv를 통해 애플리케이션에서 접근할 수 있습니다.

6. PM2와 로그 관리

6.1 로그 파일 위치

  • 기본적으로 PM2는 로그 파일을 ~/.pm2/logs/ 디렉토리에 저장합니다.
  • 로그 파일 이름은 [프로세스 이름]-out.log (표준 출력)와 [프로세스 이름]-error.log (에러 출력)입니다.

6.2 로그 파일 설정

  • ecosystem.config.js에서 로그 파일 경로를 지정할 수 있습니다.
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: 'app.js',
      output: '/var/log/my-app/out.log',
      error: '/var/log/my-app/error.log',
      log_file: '/var/log/my-app/combined.log',
      merge_logs: true,
    },
  ],
};
  • output: 표준 출력 로그 파일 경로
  • error: 에러 출력 로그 파일 경로
  • log_file: 표준 출력과 에러 출력을 결합한 로그 파일 경로
  • merge_logs: 여러 인스턴스의 로그를 하나의 파일로 병합할지 여부

6.3 로그 로테이션

  • pm2-logrotate 모듈을 사용하여 로그 파일의 크기나 기간에 따라 로그를 회전시킬 수 있습니다.

pm2-logrotate 설치

pm2 install pm2-logrotate

설정 변경

# 로그 파일 최대 크기를 10MB로 설정
pm2 set pm2-logrotate:max_size 10M

# 로그 파일을 매일 자정에 회전
pm2 set pm2-logrotate:rotate_cron '0 0 * * *'

# 로그 파일을 14일간 보관
pm2 set pm2-logrotate:retain 14

# 압축된 로그를 사용하도록 설정
pm2 set pm2-logrotate:compress true

설정 적용 확인 및 재시작

pm2 restart pm2-logrotate
pm2 conf pm2-logrotate

7. PM2의 모니터링 및 디버깅 기능

7.1 실시간 모니터링

pm2 monit
  • CPU, 메모리 사용량, 프로세스 상태 등을 실시간으로 모니터링할 수 있습니다.

7.2 프로세스 정보 조회

pm2 show [프로세스 이름 또는 ID]
  • 해당 프로세스의 상세 정보를 확인할 수 있습니다.

7.3 로그 스트림

pm2 logs [프로세스 이름 또는 ID]
  • 실시간으로 로그를 스트리밍하여 디버깅에 활용할 수 있습니다.

7.4 프로파일링 및 성능 분석

  • PM2와 함께 Keymetrics.io와 같은 서비스나 pm2-web을 사용하여 애플리케이션의 성능을 모니터링할 수 있습니다.

8. PM2의 고급 기능

8.1 애플리케이션 재시작 정책

  • max_restarts: 애플리케이션이 예기치 않게 종료되었을 때 최대 재시작 횟수를 설정합니다.
  • restart_delay: 재시작 사이의 지연 시간을 설정합니다.
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: 'app.js',
      max_restarts: 10,
      restart_delay: 5000, // 5초
    },
  ],
};

8.2 서버 재부팅 시 자동 시작

pm2 startup
  • 출력된 명령어를 복사하여 실행하면 시스템 부팅 시 PM2가 자동으로 시작됩니다.
pm2 save
  • 현재 실행 중인 프로세스 목록을 저장하여 재부팅 후 자동으로 복원합니다.

8.3 배포 워크플로우

  • PM2는 배포 시스템을 내장하고 있어, 애플리케이션의 배포를 자동화할 수 있습니다.

배포 설정 파일 생성

pm2 deploy ecosystem.config.js production setup

배포 설정 예시

module.exports = {
  apps: [
    {
      name: 'my-app',
      script: 'app.js',
    },
  ],
  deploy: {
    production: {
      user: 'node',
      host: 'my-server.com',
      ref: 'origin/main',
      repo: 'git@github.com:username/my-app.git',
      path: '/var/www/my-app',
      'pre-deploy': 'git reset --hard',
      'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production',
    },
  },
};

8.4 PM2 모듈 사용

  • PM2는 다양한 기능을 확장하기 위한 모듈 시스템을 지원합니다.

모듈 설치

pm2 install pm2-logrotate

모듈 목록 확인

pm2 module:list

9. 결론

PM2는 Node.js 애플리케이션의 운영 및 관리를 위한 강력한 도구입니다. PM2를 활용하면 애플리케이션의 가용성, 안정성, 확장성을 높일 수 있으며, 프로세스 관리, 로그 관리, 모니터링 등의 작업을 간소화할 수 있습니다.

주요 기능 요약:

  • 프로세스 관리: 시작, 중지, 재시작, 삭제
  • 자동 재시작 및 재부팅 시 자동 시작
  • 클러스터 모드 지원: 멀티코어 활용
  • 환경 변수 및 설정 관리
  • 로그 관리 및 로그 로테이션
  • 실시간 모니터링 및 디버깅
  • 배포 자동화 및 모듈 시스템

PM2를 효과적으로 사용하기 위해서는 설정 파일(ecosystem.config.js)을 잘 활용하고, 로그 및 모니터링 도구를 적극적으로 사용하여 애플리케이션의 상태를 지속적으로 파악하는 것이 중요합니다.