PM2는 간단하게 말해 Node 프로젝트를 다중으로 실행하고 관리하기 위한 관리 툴입니다.
이 툴을 이용하면 쉽게 Node를 관리할 수 있죠.
그래서 아래의 간단한 명령어를 통해 Node를 실행할 수 있습니다.
npm install pm2 -g // 설치
npm start app.js // pm2 시작
간단한 설치와 시작 방법을 알았습니다. 우리가 PM2를 활용하여 할 수 있는 것을 알아보죠.
기능 목록
PM2는 다양한 기능을 제공합니다.
대표적으로 Node.JS 프로젝트를 다중으로 관리할 수 있도록 지원하죠.
하나씩 나열하면 엄청나게 많습니다. 이 중에서 가장 많이 쓰일 내용을 모아서 보겠습니다.
- 동작 구성
- 소스 맵 지원
- 컨테이너 통합
- 로그 관리
- 모니터링
- 클러스터 모드
- Hot Reload 지원
- 개발 워크플로 지원
- 시작 스크립트 지원
이렇게 다양한 기능을 지원하고 있습니다. 제가 AWS에서 Forever를 버리고 PM2를 선택한 가장 큰 이유는 바로 시작 스크립트 지원 때문이었습니다. AWS에서 EC2가 갑자기 종료되어 새롭게 올라오면 Forever는 자동으로 실행하는 기능이 없었습니다. 리눅스에서 등록하는 방법이 있었는데 이게 제대로 먹히지 않더군요. 아마 root 계정 이슈이지 않았을까 생각했습니다.
하지만 그 당시에는 급한 나머지 forever로 해결을 하지 못했었고, PM2에서 ec2가 새로 생성될 때 자동으로 Node를 올려준다는 이야기를 듣고 바로 선택해서 설치를 했습니다. 그리고 시작 스크립트 지원 기능을 사용했죠.
pm2 startup ubuntu (원하는 계정으로 설정)
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup ubuntu -u ubuntu --hp /home/ubuntu
cd service
pm2 start app.js --name=servicename
pm2 save
위와 같은 방식으로 pm2 환경을 저장하고, 이미지를 추출했었죠. 이걸 시작 템플릿에 넣고 재실행을 했더니 원하던 AWS 재부팅 시 자동 실행이 완성되었습니다. 이다음 작업은 Github 동기화인데 요건은 따로 진행하려고 합니다.
이와 같은 사례로 pm2를 사용하고 있습니다.
제가 사용한 기능은 수많은 기능 중 일부입니다. 모니터링과 클러스터 모드 기능만 하더라도 매우 활용성이 좋습니다.
이런 기능들이 제가 이 툴을 선택한 이유죠. 활용하기에 따라 프로젝트를 관리하는데 많은 도움을 받을 수 있습니다.
직접 실행하고 활용해 보기
npm install pm2 -g // pm2 설치
pm2 -version // pm2 version 체크
pm2 start app.js // nodejs 실행
위 명령어는 간단하게 pm2를 사용할 수 있는 명령어입니다. 쉽게 실행할 수 있고, 추가적인 옵션 설정으로 추가 기능을 활용할 수 있습니다.
pm2 start app.js --watch
watch 옵션은 소스 수정 시 자동으로 서비스가 재시작하면서 내용을 갱신합니다.
배포를 진행하면 코드가 수정되는데 이걸 수동으로 재시작 하는 것은 번거롭죠. 그래서 이런 옵션은 매우 중요합니다.
프로세스 제어와 관련된 명령어를 살펴보죠.
pm2 list // 실행 중인 리스트 확인
pm2 stop app.js // 프로세스 중지
pm2 restart app.js // 프로세스 재시작
pm2 delete app.js // 프로세스 삭제
pm2 logs // 현재 실행 중인 프로세스 로그 확인
pm2 show app.js // 현재 프로세스 상태 확인
가장 기본적인 명령어를 소개했습니다.
실행 중인 리스트를 볼 수 있는 명령어는 아래와 같이 나옵니다.
실행 시간부터 현재 상태, 메모리 용량 등이 나옵니다.
나머지 명령어 중 프로세스 로그 확인 같은 경우 위치는 보통 아래와 같습니다.
/root/.pm2/pm2.log
과거 로그를 확인할 때 체크하시면 되겠습니다.
Nodejs는 단일 스레드로 동작하는 애플리케이션입니다. 그러다 보니 서버 사양이 8코어, 16코어라면 해당 코어만큼 사용할 수 있습니다. 하지만 하나만 실행하면 남은 코어가 의미가 없죠. 그렇기 때문에 nodejs는 클러스터 모듈을 지원하게 됩니다. 즉 멀티 프로세스를 사용할 수 있도록 하죠. 지원만 한다고 되는 것은 아닙니다. 프로세스를 늘리면 이걸 관리를 해줘야 하는데 그 기능까지는 Nodejs에서 전부 해주진 않고 있습니다. 프로세스가 죽었을 때 재실행부터 말이죠. 그래서 pm2가 그런 역할을 전부 맡아서 해줄 수 있습니다. forever도 그런 의미에서 좋은 툴이죠.
그렇다면 CPU 수만큼 클러스터를 늘려서 서버 자원을 제대로 이용하기 위해 어떤 설정을 해야 할까요?
먼저 실행 모드를 cluster로 설정해야 합니다.
// pm2.config.js
module.exports = {
app: [{
name: 'app',
script: './app.js',
instances: 0,
exec_mode: 'cluster'
}]
}
pm2 start pm2.config.js
이런 식으로 실행하게 되면 mode가 cluster로 변환되면서 여러 프로세스를 실행할 수 있게 됩니다.
그다음 아래와 같은 명령어로 프로세스를 늘리고 줄일 수 있죠.
pm2 scale app +2 // 프로세스 2개 늘리기
pm2 scale app 3 // 프로세스 3개 줄이기
이렇게 늘린 프로세스를 전부 재시작 하려니 머리가 아프네요. 그렇다면 어떻게 한꺼번에 재시작 할 수 있을까요?
pm2 reload app
이렇게 하시면 되겠습니다.
마무리
pm2에 대해서 다뤄봤습니다. 저 같은 경우 AWS에서 활용하기 위해 찾다 보니 사용하게 되었습니다. 하지만 찾으면서 기능들을 살펴보고, 어떻게 활용하면 될지 고민하다 보니 제가 제대로 활용하지 못한 부분도 보입니다. nodejs를 클러스트 모드로 변환하여 맥시멈 프로세스로 돌린다면 더 많은 트래픽을 처리할 수 있지 않을까 생각합니다. 한 번에 많은 처리를 하나의 코어로만 처리한다면 큰 낭비겠죠. Node를 제대로 사용하지 못하고 있다고 생각할 수 있겠네요.
여기까지가 제가 pm2를 활용했던 내용이었습니다. 많은 도움이 되시길 바랍니다.
감사합니다.