태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


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 프로그램을 서버 프로그램으로써 자동으로 실행되도록 하는 방법을 알아봤습니다.





Posted by 날개

댓글을 달아 주세요

  1. 2015.01.29 07:13 Address Modify/Delete Reply

    비밀댓글입니다

  2. Aterilio 2015.06.06 12:05 신고 Address Modify/Delete Reply

    세팅하고 리붓했는데 제대로 적용이 안되는 듯 해요 ㅜㅜ
    aws 세팅 다했다고 엄청 좋아했는데..!!!

    start on filesystem and started networking and started mountall
    stop on shutdown

    script
    exec sudo -u ubuntu /usr/local/bin/pm2 start /var/www/test/test.js -i max >> /var/log/node.log 2>&1
    end script

    pre-start script
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] Pre-Start" >> /var/log/node.log
    end script

    pre-stop script
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] Stop-Start" >> /var/log/node.log
    end script

    어디가 문제일까요..?

    • 날개 2015.06.06 14:40 신고 Address Modify/Delete

      이건 에러 형태 보면서 확인해야 하는거라 스크립트만 봐서는 잡기 어렵죠. 저도 여러차례 수정해서 성공한 케이스를 올려 놓은거거든요.

      일단, pre-start script 부분과, pre-stop script 부분을 몽땅 제외하고 (로그 남기도록 하는 스크립트들임) 테스트 해보시면 좋겠습니다.

      그리고, 스크립트 실행 전에, 터미널상에서,
      sudo -u ubuntu /usr/local/bin/pm2 start /var/www/test/test.js
      타이핑해서 정상적으로 실행되는지부터 확인해 보시고요.

  3. Aterilio 2015.06.07 20:49 신고 Address Modify/Delete Reply

    로그 남기는 부분을 싹 삭제하니 되네요
    (pre-start, pre-stop, 그리고 실행 구분 max 이하 절 모두 삭제)

    로그 남기게 하고 싶은데 어디가 잘못된걸까요?
    로그 남기는 쪽 구문을 아예 몰라서 ㅇㄱㄴ

  4. Jdo 2015.12.01 12:17 신고 Address Modify/Delete Reply

    아마존 오토스케일링에서 시작설정에 스크립트와 함께 실행시키기 기능으로도 가능한가요?

    • 날개 2015.12.01 16:39 신고 Address Modify/Delete

      질문주신 부분은 어떤의미 이신지...^^;

      오토스케일링 자체가 이미지로 새로 머신 생성해서 부팅하는 것이라 필요한 시작 스크립트 포함해서 이미지를 만들어 두시면 될것 같은데요...

티스토리 툴바