[Node.JS] 프로세스 관리도구 PM2 사용법
[Node.JS] 프로세스 관리도구 PM2 사용법
필자가 운영하던 Node 프로세스는 forever라는 npm 모듈을 활용하여 운영했었다. 하지만, forever이긴하나 가끔 프로세스가 kill 되는 현상이 있어 좀더 알아보던 차에 PM2라는 것을 알게 되었다.
PM2 는 Process Manager 의 약자로 이미 단어에서 모든게 설명 되는데 노드 프로세스를 관리해주는 역할을 한다. 아래에서 간단한 노드 프로그램을 기반으로 PM2 를 차근차근 이해하도록 하자.
보통 서버에 데몬 형태의 application 을 개발하게 되면 여러가지 것들을 신경써야 했다. 이를테면 application 에서 남기는 로그에 대한 처리( filesystem 을 이용해서 남기는 방법, 날짜 포함, rotate, etc ), 프로세스가 죽었을 때에 대한 처리( restart ), 부하 분산에 따른 동적인 확장 가능성, 부팅시에 자동 실행 등 무수히 많은 것들이 있다.
1. 설치
$ npm install pm2 -g
뒤에 -g 옵션을 붙이는 이유는 사용자가 pm2 명령어를 어떤 디렉터리에서건 사용할 수 있게 하기위함이다. 글로벌 세팅이라고 보면 된다. npm 이야기에서 만들어뒀던 API 서버 프로그램을 pm2 로 돌려보자.
2. 명령어
- 시작
$ pm2 start app.js
실행하고자 하는 Node.js 어플리케이션 실행 파일이 app.js 라면 위와같이 실행을 하면 됩니다.
- 리스트
$ pm2 list
- 종료
$ pm2 stop 0
프로세스를 종료할 때는 pm2 list 에서 확인한 앱의 이름이나 애플리케이션의 ID (list 에서 확인 가능)를 stop 의 인자로 넘겨주면 된다.
- 삭제
$ pm2 delete 0
기존에 등록되어 있던 server.js 를 우선 pm2 에서 delete 옵션을 통해 삭제하도록 하자.
- 아이디 지정
$ pm2 start server.js --name "API"
- 상세보기
$ pm2 show API
- 로그 지정
기본 로그
$ 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 scale API 5
- 서비스 중단
$ pm2 stop all
혹시 API 를 급하게 중단해야한다? all 을 인자로 넘겨서 아래와 같이 관리되고 있는 전체를 중단하거나 재시작할 수 있다.
- 모니터링
$ pm2 monit
아래와 같이 PM2 로 관리되는 프로세스별 상태를 볼 수 있고 실시간 로그까지 확인 가능하다. 빠져나올때는 키보드의 q 를 눌러주면 되겠다.
원하는 서비스에서 Enter를 눌러주면 됩니다.