서버/NGINX & node.js

[node.js] 나의 node.js 코드 pm2로 실행 및 부팅시 자동실행 (우분투)

날개 2014. 7. 31. 00:05

node.js로 프로그램을 만들면, 한가지 단점이 코드에 문제가 있거나 예외가 발생할 경우, 예외를 잡아 주지 않으면 프로그램이 죽어버린다는 점입니다.


그래서 많은 분들이 forever를 사용하여 node.js용 프로그램을 실행하고 있을 것입니다. (forever는 Keep Alive라는 특성을 지원해서 node.js 프로그램이 죽으면 다시 재실행시켜 주는 기능이 있습니다.)


그러나, 웹 검색을 해보니 forever를 대체할 수 있을 만한 프로그램으로 pm2라는 것이 있더군요. forever와 비교해서 지원하는 기능도 많고 텍스트 UI도 깔끔하여(비교 포스팅으로 http://devo.ps/blog/goodbye-node-forever-hello-pm2/ 참조), 이 포스팅에서는 pm2를 사용해 보도록 하겠습니다.


참고로, 실행환경은 우분투 14.04LTS 버전입니다. (AWS EC2 인스턴스에서 테스트하였습니다.)



1. PM2 설치 및 사용



먼저, pm2의 공식 소스코드와 문서는 https://github.com/Unitech/pm2 에서 확인 할 수 있습니다. 사용법도 예시도 잘 나와 있습니다.


그럼 pm2를 설치해 보겠습니다.


pm2는 npm 을 통해 설치 할 수 있습니다.


아래와 같은 명령으로 설치 합니다. (당연히 node.js는 설치되어 있어야 합니다.)


$ sudo npm install -g pm2

간단하죠? 이렇게 전역으로 설치하고, 만들어 놓은 node.js 프로그램을 실행해 봅시다. 실행은 다음과 같이 합니다. (예제에서는 test.js라는 프로그램을 만들었다고 가정합니다.)


$ pm2 start test.js -i max

위 화면과 같이 실행하면, test라는 어플리케이션이 0번 id로 실행되고 있는것을 볼 수 있습니다. (참고로 '-i max' 옵션은 CPU의 최대 갯수에 맞춰 실행하라는 의미입니다.)


사용법이 forever와 비슷하죠?


이번에는 pm2가 실행하고 있는 node.js 프로그램을 모니터링 해 보겠습니다.


$ pm2 monit


아래 화면 상단과 같이 사용하고 있는 메모리나 사용량등이 나타납니다. 모니터링은 [Ctrl+C]를 눌러 빠져나올 수 있습니다.

위 화면과 같이, 실행중인 프로그램의 리스트를 볼 수도 있습니다.


$ pm2 list


실행중인 프로그램을 종료하려면, delete [프로세스번호]를 입력하면 됩니다.


예를 들어 종료하고 싶은 프로그램의 아이디가(PID가 아니라 id입니다) 0번 이라면 아래와 같이 종료합니다.


$ pm2 delete 0


이런식으로 간단하게 pm2를 사용할 수 있습니다.


앞에서도 소개된 Keep Alive (살아있게 유지) 기능을 지원하므로 node.js 프로그램을 실행할때는 이런 프로그램들을 이용하는게 좋겠죠.



2. node.js 프로그램을 부팅후 자동실행하기



만약에, AWS와 같은 클라우드를 통해 오토 스케일링을 사용하게 된다면, 서버가 실행된 이후에 수동으로 프로그램을 실행한다는 것은 어려울 것입니다. 


따라서 서버 서비스로 사용할 프로그램은 운영체제의 부팅 직후 바로 실행되도록 자동화 할 필요가 있습니다.


우분투에서는 Upstart라는 것을 지원합니다. Upstart를 통해 자동 실행되도록 하기 위해서는 스크립트를 만들어야 합니다.


우분투는 해당 스크립트를 '/etc/init/' 디렉터리에 '파일이름.conf' 형태의 파일을 두어서 자동 실행되게 할 수 있습니다.


예를 들어 'pm2'로 'test.js' 라는 프로그램을 부팅 후 자동 실행하는 'njs_test.conf'라는 스크립트 파일을 만든다고 가정해 봅시다.


아래의 내용으로 'njs_test.conf' 파일을 만들어, '/etc/init/'디렉터리에 넣어 둡니다.



description "node.js app : test.js server"

author      "Chris Park"


start on filesystem and started networking and started mountall

stop on shutdown


script

exec sudo -u ubuntu /usr/local/bin/pm2 start /home/ubuntu/test.js -i max >> /var/log/njs_test.log 2>&1

end script


pre-start script

    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] Pre-Start" >> /var/log/njs_test.log

end script


pre-stop script

    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] Stop-Start" >> /var/log/njs_test.log

end script



위 스크립트에서 본인이 실행을 원하는 프로그램으로 적절히 수정하면 됩니다.


이제 제대로 작동하는지 확인하기 위하여, 시스템을 재부팅 해보겠습니다.


저는 이 테스트를 AWS의 EC2 인스턴스에서 했으므로, 아래와 같이 재부팅 하겠습니다. (각자 자신의 환경에 맞춰 재부팅 하면 됩니다.)


<출처: http://aws.amazon.com의 EC2 관리콘솔>


재부팅 후 아무 작업 없이 test.js 의 실행 인스턴스에 접속해 봅시다.

위와 같이 잘 작동하는 것을 볼 수 있습니다.



이렇게 해서 자신의 node.js 프로그램을 서버 프로그램으로써 자동으로 실행되도록 하는 방법을 알아봤습니다.