운영 서버에서 노드 어플리케이션은 forever 모듈로 관리한다.
forever start app.js
기본적으로는 이러한 명령이지만 NODE_ENV
, PORT
등의 환경 변수를 설정한다거나 forever 명령어에 옵션값을 추가하여 구동하는 경우, 또는 기존의 forever 로그 파일을 지워야 하는 경우 등이 있다면 별도의 쉘스크립트로 관리할수 있을 것이다.
리눅스에서는 데몬 형태로 어플리케이션을 구동할 수 있는데 이를 서비스(Service)라고 한다. 엔진엑스가 대표적이다. service nginx start
명령어로 엔진엑스를 실행하고, service nginx stop
로 중지할 수 있다.
이번 글에서는 리눅스 서비스와 forever 모듈로 노드 어플리케이션을 등록하고 관리하는 방법에 대해서 알아보자.
bin/myapp
서비스 등록에 관련된 파일을 프로젝트의 bin 폴더를 만들어 그곳에 저장하자. 그 중 myapp 파일은 리눅스 서비스에 등록되는 정보를 기록한 파일이다.
#! /bin/sh ### BEGIN INIT INFO # Provides: myapp # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO PROJECT_PATH=/home/ubuntu/myapp FOREVER_PATH=${PROJECT_PATH}/node_modules/forever/bin start() { rm /root/.forever/myapp.log NODE_ENV=production PORT=8500 ${FOREVER_PATH}/forever start --uid myapp ${PROJECT_PATH}/app.js } stop() { ${FOREVER_PATH}/forever stop myapp } case "$1" in start|stop) $1;; restart) stop; start;; *) echo "Run as $0 <start|stop|restart>"; exit 1;; esac
이 파일이 리눅스 서비스로 등록되면 우리는 service myapp start
로 노드 프로그램을 구동할 수 있다. 그렇게 할 수 있는 것은 start()
구문이 있기 때문이다. 자세히 보면 1) myapp.log 라는 기존의 forever 로그를 삭제한다. 그 후 2) 노드 환경변수를 설정하고, 3) myapp이란 이름으로 노드 프로그램을 구동한다. stop()
은 구동했던 노드 프로그램을 종료하는 forever 구문이다.
bin/install.sh
위 파일은 서비스에 등록에 필요한 파일인데, 아래 install.sh 스크립트 실행을 통해 리눅스 서비스로 등록되어진다.
#! /bin/sh cp /home/ubuntu/myapp/bin/myapp /etc/init.d/myapp chmod 755 /etc/init.d/myapp update-rc.d -f myapp remove update-rc.d myapp defaults 99
스크립트 내용을 하나씩 짚어보자. 1) /etc/init.d에 myapp 파일을 복사한다. 2) 그리고 파일 접근권한 설정 후, 3) update-rc.d
명령어를 이용하여 데몬으로 최종 등록한다.
이제 커맨드라인에서 sh install.sh
명령어로 스크립트를 실행하여 myapp을 리눅스 서비스로 등록할 수 있다. 그러면 service myapp start
, service myapp stop
, service myapp stop
명령어를 통해 노드 프로그램을 관리할 수 있게 된다.
bin/uninstall.sh
리눅스 서비스로 등록한 myapp 데몬을 제거하기 위해서는 아래 코드를 작성한다.
#! /bin/sh rm /etc/init.d/myapp update-rc.d -f myapp remove exit 0
샘플코드: https://github.com/jeonghwan-kim/forever-with-service-sample