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를 눌러주면 됩니다.
워니즈 블로그
워니즈 깃헙
함께 보면 좋은 글
- [Javascript] Promise 사용법
- [Linux] top을 통해 살펴보는 프로세스 정보들
- [DevOps] Nginx Lua module 사용법
- [Docker] Compose 구성과 사용법
새 글이 올라오면 Threads @wonizz.ai 에도 올립니다. 팔로우해 두면 피드에서 바로 볼 수 있습니다.