PM2로 노드 프로세스 관리하기

by Dany


Posted on May. 23th 2019



PM2

pm2는 Node.js Process Management Tool로, 상당히 간편하면서도 효율적으로 Node.js 서버 프로세스를 관리하도록 도와줍니다.

pm2는 단순히 프로세스에 올리고 내리고 뿐 아니라, 생각보다 많은 기능들을 갖고 있는데요. 이에 대해 좀더 자세히 정리해보려고 합니다.

  • 설치

pm2는 성격상 글로벌설치를 해야합니다. Node.js 프로젝트 답게, npm으로 쉽게 설치가 가능합니다.

npm install pm2 -g


  • 프로세스 등록

그럼 전 먼저 pm2에 올릴 js파일을 하나 만들겠습니다.

  • app.js
console.log('hello pm2!');

그럼 이 간단한 js파일을 pm2에 올려보도록 하겠습니다.

pm2 start app.js

img

이렇게 프로세스가 등록된 것을 확인할 수 있습니다.

  • 프로세스 확인
pm2 list

img

현재 관리중인 프로세스를 확인할 수 있습니다.

  • 프로세스 종료 & 재시작

관리중인 프로세스의 id 필드를 보면, 프로세스 id를 확인할 수 있습니다. 프로세스를 종료할 때는 id 또는 name을 주면 됩니다.

pm2 stop 0
pm2 stop app

한번 관리 프로세스에 등록된 프로세스는 id 또는 name으로 다시 시작할 수 있습니다.

img

  • 프로세스 삭제
pm2 delete 0

프로세스를 삭제할때에는 반드시 id로 합니다. name은 중복될 수 있기 때문입니다.

img

  • 프로세스 이름을 지정해서 시작
pm2 start app.js --name dany-pm

img

  • 상세 정보 확인
pm2 show dany-pm

img

  • 로그 관리

Node.js 에서는 기본적으로 console.log(err) 같은 형태로 개발단에서는 출력합니다. pm2는 이 코드를 그대로 로그로 남기도록 할수 있을 뿐아니라, Node.js에서 기본적으로 발생하는 에러도 원하는 위치에 기록할 수 있도록 할 수 있습니다.

일단 앞에서 만든 프로세스를 삭제하겠습니다.

pm2 delete dany-pm

로그를 저장하는 옵션을 줘서 다시 프로세스를 추가합니다.

pm2 start app.js --name dany-pm -o ./dany.log -e ./dany.log --merge-logs

img

이제 해당 디렉터리에 .log파일이 생겼을 것이고, 이 안에는 hello pm2!라는 콘솔로그가 찍혀있음을 확인할 수 있습니다.

그리고 app.js를 다음과 라인을 추가해서 일부러 에러를 발생시켜 보겠습니다.

const a = 0.split(','); //split은 문자열 함수이므로 에러가 날겁니다.

그리고 프로세스를 재시작합니다.

pm2 restart 0

그리고 .log파일을 확인해보세요.

hello pm2!
/Users/dany/workspace/private/pm2test/app.js:2
const a = 0.split(',');
          ^^

SyntaxError: Invalid or unexpected token
    at new Script (vm.js:85:7)
    at createScript (vm.js:266:10)
    at Object.runInThisContext (vm.js:314:10)
    at Module._compile (internal/modules/cjs/loader.js:698:28)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:749:10)
    at Module.load (internal/modules/cjs/loader.js:630:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:570:12)
    at Function.Module._load (internal/modules/cjs/loader.js:562:3)
    at Function._load (/Users/dany/.npm-global/lib/node_modules/pm2/node_modules/@pm2/io/build/main/metrics/httpMetrics.js:172:43)
    at Object.<anonymous> (/Users/dany/.npm-global/lib/node_modules/pm2/lib/ProcessContainerFork.js:27:21)
/Users/dany/workspace/private/pm2test/app.js:2

이렇게 로그가 저장되는 것을 확인할 수 있습니다.

  • 클러스터

pm2는 물리적으로 하나의 서버안에 있는 단일 Node.js 인스턴스의 부하를 분산시켜주는, 자체적인 로드밸런싱 기능을 갖고 있습니다. 물론 물리장비 자체의 CPU가 초과하는 경우에는 그 앞단에서 로드밸런싱 장비를 둬야 겠지만, Node.js는 기본적으로 싱글스레드 + 비동기 기반의 서버기때문에, 이런 기능은 그 가치가 상당히 있습니다.

일단 클러스터를 추가하기 위해 다시 기존 프로세스를 삭제하고 클러스터 옵션을 줘서 프로세스를 재등록하겠습니다.

pm2 delete dany-pm
pm2 start app.js --name dany-pm -i 3 -o ./dany.log -e ./dany.log --merge-logs

img

-i 옵션 을 추가하고 뒤에, 클러스터링을 할 인스턴스 개수만 입력해주면 됩니다. 무척 간편하지만, 기능은 강력합니다.

그리고 Request 테스트를 해보면, 실제로 완벽하게 패킷을 나누는것을 확인하실 수 있습니다.

또한, 이렇게 등록한 클러스터는 Scale In / Out 도 가능합니다.

pm2 scale dany-pm 5

img

이렇게 간편하게 scale을 변경할 수 있습니다.

  • 모니터링
pm2 monit

이렇게 한줄로 정말 간편하게 모니터링도 가능합니다.
나올때는 q버튼으로 빠져나오시면 됩니다.

  • AutoStart

예를들어 AWS에서 서버 CPU등에 의한 AutoScaling을 사용하는 경우, 클라우드 서버 인스턴스가 자동으로 증가하고 앞에서 로드밸런서가 트래픽을 분산시켜주는 구조가 될겁니다. 이때 서버가 늘어나는데 pm2가 자동으로 재시작하지 않는다면 AWS인스턴스를 계속 모니터링하고 있다가 늘어나면 재빨리 접속해서 pm2 start를해야하는 상황이 되겠죠. pm2는 linux service등록과 같이 자동으로 시작하도록 저장하는 기능도 있습니다.

이 경우는 원격서버의의 시스템관리에서의 이야기이기 때문에, 그에 맞게 스크립트를 넣도록 하겠습니다. 이때는 관리자 권한을 줘서 실행해야 합니다.

sudo pm2 delete dany-pm
sudo pm2 startup
sudo pm2 start app.js --name dany-pm -i 3 -o ./dany.log -e ./dany.log --merge-logs
sudo pm2 save

이렇게 차례로 입력해주시면 됩니다. 먼저 올라가있는 프로세스를 다시 지워주고, 프로세스를 등록하기 전에 startup을 먼저 해줘야 합니다. 그리고 프로세스를 등록한 후에, save만 해주시면 서버가 리부팅되더라도 pm2가 자동으로 해당 프로세스를 실행합니다.

이렇게, pm2 사용법에 대해 정리해보았습니다. 감사합니다.


Categories