node.js 로 개발할 때 편리한 모듈이 node-supervisor 입니다. 소스가 수정되거나 오류가 발생할 때 재시작하는 기능을 제공하는 놈이죠. 처음엔 별 생각없이 사용하고 있었는데... 프로세스를 관리하는 supervisor 란 놈이 따로 있다는 것을 알게되었습니다.
아무래도 개발이 끝나고 홈페이지를 배포 및 운영할 때 node-supervisor 만으로는 부족함을 느끼고 있던 차, supervisor 의 기능 등을 살펴보니 꽤 쓸만해 보였습니다. 하여 supervisor 를 직접 설치하여 사용해보기로 마음먹었습니다.(이하 모든 과정은 루트 계정에서 실행한 것입니다.)
우선, CentOS 5.x 버전의 서버를 사용하고 있는 관계로 일단 yum 으로 해당 패키지가 있는지 찾아보았습니다. 존재하더군요. 바로 yum 으로 설치해보았습니다.
yum install supervisor
하지만... 제가 바랬던 supervisord, supervisorctl 등은 함께 설치되지 않더군요. 별 수 없이 직접 설치하는 방식을 해보았습니다. 파이썬의 easy_install 을 사용하는 방식인데... 이 녀석은 python-setuptools 패키지에 포함되어 있습니다.
yum install python-setuptools
python-setuptools 를 설치한 후에 easy_install 로 supervisor 를 설치해보았습니다.
easy_install supervisor
헌데, 설치 도중 에러 메시지가 나타나며 중단되더군요. 내용인즉, python 2.5 이상이 필요하다는 것인데... CentOS 5.x 의 경우 기본 python 이 2.4 입니다.(python26 으로 2.6 버전을 별도 설치할 수 있습니다.) setuptools 를 yum 으로 설치할 수 없는 상황이라 별도 다운로드한 후 설치하였습니다.
wget https://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg --no-check-certificate
sh setuptools-0.6c11-py2.6.egg
그리고 예전에 설치한 python 2.6 을 사용하여 easy_install 을 실행하였습니다.
python26 -m easy_install supervisor
이번엔 제대로 설치되었습니다.^^ 이하는 설정 관련 내용입니다.
supervisord 의 기본 설정 파일을 생성합니다.
echo_supervisord_conf > /etc/supervisord.conf
로그 파일 등을 관리하기 위하여 디렉토리를 생성합니다.
mkdir /var/log/supervisor
supervisord.conf 의 내용을 수정 및 추가합니다. 아래는 node.js 로 실행할 두 개의 홈페이지입니다. 이때 node 의 경로를 절대경로로 지정하여야 동작하더군요. PATH 설정 등을 하면 될 거 같긴한데 귀찮아서... ^^(forever 로 실행하는 것도 괜찮을 거 같습니다.)
vi /etc/supervisord.conf
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
[program:ghost]
command = /usr/local/bin/node /home/artg/html/ghost/index.js
directory = /home/artg/html/ghost
user = artg
autostart = true
autorestart = true
stdout_logfile = /var/log/supervisor/ghost.log
stderr_logfile = /var/log/supervisor/ghost_err.log
environment = NODE_ENV="production"
[program:artg]
command = /usr/local/bin/node /home/artg/html/artg1/app.js
directory = /home/artg/html/artg1
user = artg
autostart = true
autorestart = true
stdout_logfile = /var/log/supervisor/artg.log
stderr_logfile = /var/log/supervisor/artg_err.log
environment = NODE_ENV="production"
설정 파일을 생성한 후, 재부팅시 자동실행 될 수 있도록 서비스에 추가합니다.
vi /etc/init.d/supervisord
#!/bin/bash
#
# /etc/rc.d/init.d/supervisord
# supervisord This shell script takes care of starting and stopping
# supervisord. Tested on Fedora 11.
#
# Author: Brian Bouterse bmbouter@gmail.com
#
# chkconfig: 345 80 80
# description: supervisord is a client/server process control system. \
# processname: supervisord
# pidfile: /var/run/supervisord.pid
# Source function library.
. /etc/init.d/functions
DAEMON=/usr/bin/supervisord
PIDFILE=/var/run/supervisord.pid
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
start() {
echo -n "Starting supervisord: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo supervisord already running: $PID
exit 2;
else
daemon $DAEMON --pidfile=$PIDFILE
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord
return $RETVAL
fi
}
stop() {
echo -n "Shutting down supervisord: "
echo
killproc -p $PIDFILE supervisord
echo
rm -f /var/lock/subsys/supervisord
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status supervisord
;;
restart)
stop
start
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $?
생성한 스크립트를 등록합니다.
chmod +x /etc/init.d/supervisord
chkconfig --level 345 supervisord on
만약, 삭제할 경우라면 아래의 명령어를 사용하면 됩니다.
chkconfig supervisord off
서비스 중인 홈페이지를 재시작/시작/중지할 경우 아래와 같이 프로그램명을 지정하여 supervisorctl 을 호출하면 됩니다.
supervisorctl restart artg
supervisorctl start artg
supervisorctl stop artg
만약, 개발 중이라면... node-supervisor 를 할성화하여 사용하다~ 최종 배포시 supervisorctl 을 사용하여 start 하면 되겠습니다.
supervisorctl stop artg
supervisor index.js
node 의 경우, development 모드와 production 모드 두 가지가 있습니다. 그리고 각 모드에 따라 다른 화면이 나올 수 있습니다. 다음은 모드를 지정하여 실행할 경우입니다.
NODE_ENV=production supervisor index.js
CentOS 7 에서는 vi /usr/lib/systemd/system/supervisord.service 를 생성합니다. 이때 supervisord.conf 파일의 위치를 확인하여 알맞게 적용합니다.
[Unit]
Description=supervisord - Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target
[Service]
Type=forking
ExecStart=/bin/supervisord -c /etc/supervisord.conf
ExecReload=/bin/supervisorctl reload
ExecStop=/bin/supervisorctl shutdown
User=root
[Install]
WantedBy=multi-user.target
'서버 > 리눅스' 카테고리의 다른 글
nginx + php-fpm 설치하기 - CentOS 6.x (0) | 2014.08.13 |
---|---|
CentOS mongodb 2.6.1 업데이트하기 (0) | 2014.05.08 |
CentOS, node.js - Ghost 설치하기 (0) | 2014.05.01 |
CentOS GitEye 설치하기 (0) | 2014.03.20 |
CentOS 패키지 강제 설치하기 (0) | 2014.03.19 |
댓글