개요

PM2의 역할과 사용법을 간단하게 알아보자.

  • 목차
    • PM2란?
    • pm2 설치
    • pm2 명령어

 

PM2란?

공식 홈페이지에 나온 설명을 보면

PM2 is a daemon process manager that will help you manage and keep your application online. 요약하면 PM2는 어플리케이션의 관리와 온라인상태를 유지하도록 돕는 역할을 하는 데몬 프로세스 관리자 라고 한다.

PM2 장점

  • 어플리케이션의 예상치 못한 종료시 자동 재시작
  • 배포시에도 무중단 서비스
  • 클러스터 모드
  • 모니터링

 

PM2 설치

$ npm install pm2@latest -g

또는

$ yarn global add pm2

위 명령어로 최신버젼을 설치할 수 있다.

 

PM2 명령어

이 명령어로 간단한 pm2의 사용예를 볼 수 있다.

pm2 examples

 

서버 시작

app.js 라는 소스가 있다는 가정하에

$ pm2 start app.js

이 명령어 한 줄로 쉽게 서버를 데몬화 하고 모니터링 할 수 있다.

 

프로세스 관리

$ pm2 restart app_name
$ pm2 reload app_name
$ pm2 stop app_name
$ pm2 delete app_name

app_name 대신에 all 이나 id 를 사용할 수 있다.

  • all : 모든 프로세스를 실행한다.
  • id : 특정 프로세스 id만 실행한다.

 

목록 보기

$ pm2 [list|ls|status]

 

로그 보기

$ pm2 logs // 기본 15줄의 로그가 보인다.

$ pm2 logs --lines 200 // 여러줄을 보고 싶을 경우 --lines 옵션을 사용한다.

실시간 로그도 간단한 명령어 하나로 확인 가능하다.

 

모니터링

$ pm2 monit

이 명령어로 대쉬보드 형태로 모니터링도 가능하다.

클러스터 모드

pm2를 클러스터 모드로 실행하지 않으면 fork 모드로 실행이 되는데 fork모드는 싱글스레드로만 동작한다.
pm2의 장점인 멀티 스레드를 활용하기 위해 클러스터 모드로 실행해보자.

  • 클러스터 옵션
    --watch : PM2가 어플리케이션 변경사항을 자동으로 감지하여 서버를 재시작함
    -i (코어수) : 클러스터 모드로 실행할 시 사용할 코어수. max 로 적을시 cpu 코어 수 만큼 할당됨
    --name : 어플리케이션 이름
    --log (경로) : 로그 파일 경로
    -- arg1 arg2 arg3 : 스크립트에 전달 될 파라미터
    --restart-delay (딜레이 시간) : 재시작시 딜레이 시간 지정 (ms)
    --no-autorestart : 재시작 불가능하도록 설정함
    

클러스터를 더욱 편하게 관리하기 위해 전용 설정파일을 이용할 수도 있다.

$ pm2 ecosystem
File C:\ecosystem.config.js generated

위 명령어는 자동으로 ecosystem.config.js 파일을 생성한다.
이 파일에서 클러스터 옵션들을 설정하여 사용할 수 있다.

// ecosystem.config.js 설정 예
module.exports = {
  apps : [{
    name   : "app1",
    script : "./app.js",
    env_production: {
       NODE_ENV: "production"
    },
    env_development: {
       NODE_ENV: "development"
    }
  }]
}

ecosystem.config.js 을 실행하는 것으로 해당 옵션이 실행된다.

하단에는 간단히 적은 옵션들.

  • General
    • name : “my_app” // 어플리케이션 명칭
    • script : “./api/app.js” \/\/ pm2 시작 스크립트 경로
    • cwd : “/var/www/” // 앱이 실행될 디렉토리
    • args : “-a 13 -b 12” // CLI에서 실행하는 모든 아규먼트
    • interpreter : “/usr/bin/python” // 인터프리터 경로 (기본값은 node)
    • interpreter_args : “–harmony” // 인터프리터 파라미터 옵션
    • node_args : // interpreter_args 의 별칭
  • Advanced features
    • instances : 0 // 인스턴스 수. 0이면 CPU 코어수만큼.
    • exec_mode : “cluster” // cluster 또는 fork 모드 선택. 기본은 fork 모드
    • watch : true // 폴더 혹은 하위 폴더를 감시하여 변경시 어플리케이션 reload
    • ignore_watch : [”[\/\]./”, “node_modules”] // watch 제외경로
    • max_memory_restart : “150M” // 설정한 메모리를 초과하면 자동으로 어플리케이션 재시작
    • source_map_support : true // 소스 맵 파일의 활성화/비활성화 설정. 기본값은 true
  • Log files
    • log_date_format : “YYYY-MM-DD HH:mm Z” // 로그 날짜 포멧
    • error_file : // 에러로그 파일 경로 (기본 경로는 $HOME/.pm2/logs/-error-.log)
    • out_file : // 로그 파일 출력 경로 (기본 경로는 $HOME/.pm2/logs/-out-.log)
    • log_file : // error_file, out_file 두 파일의 경로. 기본은 비활성화
    • pid_file : // pid 파일경로 (기본 경로는 $HOME/.pm2/pids/-.pid)
  • Control flow
    • min_uptime : // 어플리케이션이 시작되었다고 생각하는 최소 시간
    • listen_timeout : 8000 // 강제 reload가 일어나기 전 대기시간(ms)
    • kill_timeout : 1600 // 최종 SIGKILL 을 보내기 전 대기시간(ms)
    • shutdown_with_message : false // 어플리케이션 종료 수행 시 process.kill(pid, SIGINT) 명령어 대신 process.send(‘shutdown’)로 수행
    • wait_ready : false // Reload 대기 이벤트 대신 어플리케이션의 process.send(‘ready’) 를 기다린다
  • Deployment
    • key : SSH key path. Default $HOME/.ssh
    • user : SSH user
    • host : SSH host
    • ssh_options : SSH options with no command-line flag, see ‘man ssh’
    • ref : GIT remote/branch
    • repo : GIT remote
    • path : path in the server
    • pre-setup : Pre-setup command or path to a script on your local machine
    • post-setup : Post-setup commands or path to a script on the host machine
    • pre-deploy-local : pre-deploy action
    • post-deploy : post-deploy action

그 외 옵션 링크

+ Recent posts