[Node.JS] 프로세스 관리도구 PM2 사용법

[Node.JS] 프로세스 관리도구 PM2 사용법

필자가 운영하던 Node 프로세스는 forever라는 npm 모듈을 활용하여 운영했었다. 하지만, forever이긴하나 가끔 프로세스가 kill 되는 현상이 있어 좀더 알아보던 차에 PM2라는 것을 알게 되었다.

PM2 는 Process Manager 의 약자로 이미 단어에서 모든게 설명 되는데 노드 프로세스를 관리해주는 역할을 한다. 아래에서 간단한 노드 프로그램을 기반으로 PM2 를 차근차근 이해하도록 하자.

보통 서버에 데몬 형태의 application 을 개발하게 되면 여러가지 것들을 신경써야 했다. 이를테면 application 에서 남기는 로그에 대한 처리( filesystem 을 이용해서 남기는 방법, 날짜 포함, rotate, etc ), 프로세스가 죽었을 때에 대한 처리( restart ), 부하 분산에 따른 동적인 확장 가능성, 부팅시에 자동 실행 등 무수히 많은 것들이 있다.


PM2 링크

1. 설치

$ npm install pm2 -g

뒤에 -g 옵션을 붙이는 이유는 사용자가 pm2 명령어를 어떤 디렉터리에서건 사용할 수 있게 하기위함이다. 글로벌 세팅이라고 보면 된다. npm 이야기에서 만들어뒀던 API 서버 프로그램을 pm2 로 돌려보자.

2. 명령어

  • 시작
$ pm2 start app.js

실행하고자 하는 Node.js 어플리케이션 실행 파일이 app.js 라면 위와같이 실행을 하면 됩니다.

PM2 초기설정

  • 리스트
$ pm2 list

PM2 LIST

  • 종료
$ pm2 stop 0

프로세스를 종료할 때는 pm2 list 에서 확인한 앱의 이름이나 애플리케이션의 ID (list 에서 확인 가능)를 stop 의 인자로 넘겨주면 된다.

PM2 STOP

  • 삭제
$ pm2 delete 0

기존에 등록되어 있던 server.js 를 우선 pm2 에서 delete 옵션을 통해 삭제하도록 하자.

PM2 DELETE

  • 아이디 지정
$ pm2 start server.js --name "API"

PM2 ID

  • 상세보기
$ pm2 show API

PM2 SHOW

  • 로그 지정

기본 로그

$ pm2 logs 

이 명령어도 지난 15줄의 기록 밖에 확인할 수 없기 때문에, 서버 로그 파일을 확인하면 된다. 파일의 위치는 ~/.pm2/logs 에 있다.

stdout 처리

$ pm2 delete API && pm2 start server.js --name "API" -o ./api.log

out log path (console.log 가 출력되는 위치) 가 기본적으로 .pm2 밑에 저장되고 있는 것을 볼 수 있는데 이 위치를 우리가 원하는 곳으로 옮겨보자. 앞선 설명처럼 API 를 delete 하고 옵션을 추가하도록 한다.

stderr 처리

$ pm2 delete API && pm2 start server.js --name "API" -o ./api.log -e ./api.log --merge-logs

하지만 아직 아쉬운 것이 있다. 위에서 언급한 것 처럼 -o 옵션은 stdout 을 처리하기 때문에 프로세스에서 발생하는 표준에러( stderr ) 에 대해서는 처리하지 못한다. 이를 처리하기 위한 옵션도 있으니 걱정하지마시라. 우선 API 를 삭제하고 -e 옵션으로 stderr 에 대한 처리도 추가해보자.

  • 부하 분산
$ pm2 delete API && pm2 start server.js --name "API" -i 3 -o ./test.log

트래픽을 받아서 async 하게 처리한다고 해도 내부로직이 복잡해지면 어느순간 치솟는 CPU 를 어찌하지 못하는 상황이 온다. 이때 필요한 것이 클러스터이다. PM2 의 클러스터는 분산컴퓨팅의 그 용어와 비슷한 역할을 하는데 server.js 한 개 노드파일을 지정한 개수만큼 PM2 에 등록하고 Load Balancing (LB) 를 통해 부하를 분산시켜준다. PM2 의 LB 는 round robin (RR) 방식으로 동작하며 모든것은 옵션 하나면 충분하다.

PM2 LB

  • 스케일 조정
$ pm2 scale API 5

PM2 SCALE

  • 서비스 중단
$ pm2 stop all

혹시 API 를 급하게 중단해야한다? all 을 인자로 넘겨서 아래와 같이 관리되고 있는 전체를 중단하거나 재시작할 수 있다.

PM2 STOP ALL

  • 모니터링
$ pm2 monit

아래와 같이 PM2 로 관리되는 프로세스별 상태를 볼 수 있고 실시간 로그까지 확인 가능하다. 빠져나올때는 키보드의 q 를 눌러주면 되겠다.

원하는 서비스에서 Enter를 눌러주면 됩니다.

PM2 MONITORING

워니즈 블로그
워니즈 깃헙

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다