Node.js 응용프로그램을 실행하는 방법은 일반적으로 node <filename> 혹은 npm <command> 명령어입니다.
이 때 별개의 터미널을 이용해 실행하거나, OS의 스케쥴러를 이용하죠.
하지만 웹 서비스와 같이 항상 실행되어야 하는 App도 있습니다.
이런 경우 별도의 터미널로 실행되어 있을 때 실수로 터미널을 종료하기라도 하면 치명적일 수 있습니다.
PM2는 Node.js App을 백그라운드에서 실행해줘서 이런 상황을 방지해 줄 수 있습니다.
PM2
KeyMetrics에서 제공하는 PM2의 PM은 Process Manager라고 합니다. 이름에서 볼 수 있듯이 Node.js 프로세스를 관리해주는 프로그램이죠. PM2의 홈페이지에서는 IBM, MS, PayPal 등의 업체가 PM2를 이용하고 있다고 합니다.
PM2를 이용하면 프로세스를 백그라운드에서 실행하거나, 실행 중인 App의 로그를 볼 수 있습니다. 또한 오류로 인해 종료된 프로세스를 즉시 다시 실행하기도 하죠. 이외에도 실행 중인 App을 모니터링하거나, 클러스터링을 지원하기도 합니다.
설치
아래 명령어로 간단하게 설치할 수 있습니다.
npm i --g pm2
global로 설치하는 경우 OS에 따라 권한 상승이 필요합니다.
예제
global로 설치했기 때문에 pm2 명령을 바로 호출할 수 있습니다.
- 실행: start
pm2 start <filename>
pm2 start <filename> --name=<app name>
start 시 파일명으로 App name이 지정됩니다.
만약 별도로 지정하고 싶다면 2행의 명령처럼 원하는 App name을 지정해주면 됩니다.
- 목록: list
pm2 list
현재 실행 중인 App의 목록을 조회할 수 있습니다.
각 항목의 의미는 아래와 같습니다.
App name: 실행 중인 App의 이름. 이 이름을 이용해 프로세스를 제어할 수 있습니다. 이후로 <name>이라고 표현합니다.
id: 실행 중인 App의 ID. ID를 이용해서도 프로세스를 제어할 수 있습니다. 이후로 <id>라고 표현합니다.
mode: 프로세스 실행 방식입니다. 일반적으로 fork가 표시되고 클러스터링인 경우 cluster가 표시됩니다.
pid: OS에서 지정된 Process ID입니다.
status: 현재 상태입니다. 정상 실행인 경우 online으로 표시됩니다. 상태에 따라 error, stopped 등이 표시됩니다.
restart: 재시작 횟수입니다. restart 명령어로 재시작하거나, 오류로 인해 자동으로 재시작 된 경우 횟수가 올라갑니다.
uptime: 시작된 이후로부터 실행 시간입니다. restart 된 경우 0초부터 다시 시작됩니다.
cpu: CPU 사용량입니다.
mem: 메모리 사용량입니다.
watching: watch 여부가 표시됩니다.
- App 상태: show
pm2 show <id>
pm2 show <name>
실행 중인 App의 간략한 정보를 볼 수 있습니다.
list에서 표시되는 정보와, 로그 파일 경로, git 정보 등을 조회할 수 있습니다.
- App Log 보기: log
pm2 log
pm2 log <id>
pm2 log <name>
pm2로 실행된 App의 로그를 볼 수 있습니다.
1행과 같이 실행한 경우 모든 App의 로그를, 2~3행과 같이 실행한 경우 특정 App의 로그를 볼 수 있습니다.
별도 옵션이 없는 경우 최근 10개를 보여준 후 실시간 로그를 보여줍니다.
- 다시 실행: restart
pm2 restart <id>
pm2 restart <name>
코드를 수정하거나 한 경우 특정 App을 중지한 뒤 다시 실행합니다.
출력되는 화면은 start와 동일합니다.
- 중지: stop
pm2 stop <id>
pm2 stop <name>
특정 App을 중지합니다.
이후 start 명령을 통해 다시 실행할 수 있습니다.
- 삭제: delete
pm2 delete <id>
pm2 delete <name>
목록에서 특정 App을 삭제합니다.
이후에 다시 추가하려면 start 명령을 이용합니다.
결론
pm2를 이용하면 각종 서비스의 오류로 인한 중단을 방지할 수 있고, 유지보수 할 때 downtime을 최소화 할 수 있습니다.
또한 pm2 명령어가 담긴 배치 스크립트를 이용해 더 수월하게 App을 중지, 재시작 할 수 있습니다.
배치 스크립트에 대해서는 빠른 시일에 공유하도록 하겠습니다.