노드의 영구 모듈을 사용하여 노드 서버를 계속 실행 중입니다. 그러나 시스템을 다시 시작하면 영원히 종료됩니다. 시스템이 다시 시작될 때 노드 서버를 자동으로 시작할 수있는 방법이 있습니까?
노드의 영구 모듈을 사용하여 노드 서버를 계속 실행 중입니다. 그러나 시스템을 다시 시작하면 영원히 종료됩니다. 시스템이 다시 시작될 때 노드 서버를 자동으로 시작할 수있는 방법이 있습니까?
답변:
crontab을 사용하는 것이 좋습니다. 사용하기 쉽습니다.
편집을 시작하려면 다음을 실행하여 "testuser"를 노드 프로세스의 원하는 런타임 사용자로 바꾸십시오. 자신 이외의 다른 사용자를 선택하는 경우 sudo를 사용하여이를 실행해야합니다.
$ crontab -u testuser -e
이전에이 작업을 수행 한 적이 없다면 편집 할 편집기를 묻습니다. 나는 vim을 좋아하지만 사용하기 쉽도록 nano를 권장합니다.
편집기에서 다음 행을 추가하십시오.
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
파일을 저장하십시오. cron이 설치되었다는 피드백을 받아야합니다.
cron 설치에 대한 추가 확인을 위해 다음을 실행하여 ( "testuser"를 대상 사용자 이름으로 다시 대체) 현재 설치된 크론을 나열하십시오.
$ crontab -u testuser -l
내 의견으로는 cron에서 바이너리를 실행할 때 항상 전체 경로를 사용해야한다는 점에 유의하십시오. 또한 영원한 스크립트 경로가 올바르지 않으면 which forever
전체 경로를 얻기 위해 실행하십시오 .
해당 forever
호출이 주어지면 다음에 node
대한 전체 경로를 제공 할 수도 있습니다 node
.
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
@reboot
cron이 cron deamon 시작시 실행 된다고 설명합니다 . 덧붙여서 나는 설정된 cron이 @reboot
시스템 부팅시 실행되지 않는다고 제안하는 상황을 결코 보지 못했습니다 . 종료하는 방법은 이와 관련이 없습니다.
/home
이의 경우 코드의 삶을 작동하지 않도록, 아직 설치되지 않았습니다 /home
.
@reboot varname=value ...
이를 위해 영구 서비스를 사용할 수 있습니다.
npm install -g forever-service
forever-service install test
이것은 현재 디렉토리에 app.js를 영원히 통해 서비스로 제공합니다. 시스템을 다시 시작할 때마다 서비스가 자동으로 다시 시작됩니다. 또한 중지되면 정상적으로 중지를 시도합니다. 이 스크립트는 logrotate 스크립트도 제공합니다.
깃 허브 URL : https://github.com/zapty/forever-service
참고 : 나는 영원한 서비스의 저자입니다.
forever-service install test
, @Alex-arva의 설명을 명확히하기 위해 test
, 서비스 의 이름이 될 것이지만 실행할 실제 프로그램 / 노드 .js 파일의 이름은 아닙니다. 기본적으로 프로그램 이름은이라고 가정 app.js
하지만 --script
다음과 같이 플래그로 이를 대체 할 수 있습니다 forever-service install test --script main.js
. (테스트되지 않았으므로 구문 세부 정보가 잘못된 경우 수정하십시오.)
NPM을 사용하여 PM2를 전체적으로 설치
npm install pm2 -g
pm2로 스크립트 시작
pm2 start app.js
활성 시작 스크립트 생성
pm2 startup
참고 : pm2 시작은 시스템이 재부팅 될 때 PM2를 시작하기위한 것입니다. PM2가 시작되면 시스템이 다운되기 전에 관리했던 모든 프로세스를 다시 시작합니다.
자동 시작을 비활성화하려면 pm2 unstartup을 사용하십시오.
다른 사용자가 시작 스크립트를 실행하려면 -u <username>
옵션과--hp <user_home>:
이 경우는 데비안에서 유효합니다.
에 다음을 추가하십시오 /etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
사용자 이름을 바꿉니다. {{app path}}
앱 경로를 대체합니다. 예를 들어/var/www/test/app.js
/etc/rc.local
하지 말아야한다고 생각합니다/etc/init.d/rc.local
/etc/rc.local
나를 위해 속임수를 ( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
이 답변 과이 블로그 게시물에서 영감을 얻은 대체 crontab 방법 .
1. bash 스크립트 파일을 작성하십시오 (bob을 원하는 사용자로 변경하십시오).
vi /home/bob/node_server_init.sh
2. 방금 만든 파일에 복사하여 붙여 넣습니다.
#!/bin/sh
export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
설정에 따라 위의 경로를 편집하십시오!
3. bash 스크립트를 실행할 수 있는지 확인하십시오.
chmod 700 /home/bob/node_server_init.sh
4. bash 스크립트를 테스트하십시오.
sh /home/bob/node_server_init.sh
5. "bob"을 노드의 런타임 사용자로 바꾸십시오.
crontab -u bob -e
6. 복사하여 붙여 넣기 (밥을 원하는 사용자로 변경).
@reboot /bin/sh /home/bob/node_server_init.sh
crontab을 저장하십시오.
당신은 그것을 끝냈습니다, 당신의상은 재부팅 (테스트) :)
첨부 된 질문 에서 답변을 복사했습니다 .
내장 된로드 밸런서가있는 Node.js 애플리케이션의 프로덕션 프로세스 관리자 인 PM2 를 사용할 수 있습니다 .
PM2 설치
$ npm install pm2 -g
응용 프로그램 시작
$ pm2 start app.js
express를 사용하면 다음과 같이 앱을 시작할 수 있습니다
pm2 start ./bin/www --name="app"
실행중인 모든 프로세스 나열 :
$ pm2 list
모든 프로세스를 나열합니다. 그런 다음 다음 명령으로 앱의 ID 또는 이름을 사용하여 서비스를 중지 / 다시 시작할 수 있습니다.
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
로그를 표시하려면
$ pm2 logs ['all'|app_name|app_id]
$pm2 startup
그 후 pm2가 수동으로 명령을 실행하고 복사하여 실행하도록 요청하는 것을 보게됩니다. 그러면 $pm2 save
app.js는 시스템 재부팅
/etc/init.d 폴더에 쉘 스크립트를 작성해야합니다. init.d 스크립트의 웹에는 많은 정보가 있지만 복잡하지 않습니다.
다음은 CoffeeScript 사이트를 영원히 실행하기 위해 만든 스크립트 샘플입니다.
#!/bin/bash
#
# initd-example Node init.d
#
# chkconfig: 345
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#
# Source function library.
. /lib/lsb/init-functions
pidFile=/var/run/forever-initd-hectorcorrea.pid
logFile=/var/run/forever-initd-hectorcorrea.log
sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile
start() {
echo "Starting $scriptId"
# This is found in the library referenced at the top of the script
start_daemon
# Start our CoffeeScript app through forever
# Notice that we change the PATH because on reboot
# the PATH does not include the path to node.
# Launching forever or coffee with a full path
# does not work unless we set the PATH.
cd $sourceDir
PATH=/usr/local/bin:$PATH
NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile
RETVAL=$?
}
restart() {
echo -n "Restarting $scriptId"
/usr/local/bin/forever restart $scriptId
RETVAL=$?
}
stop() {
echo -n "Shutting down $scriptId"
/usr/local/bin/forever stop $scriptId
RETVAL=$?
}
status() {
echo -n "Status $scriptId"
/usr/local/bin/forever list
RETVAL=$?
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
restart
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL
init.d 스크립트가 루트로 실행되었으므로 폴더와 PATH가 루트 사용자에게 명시 적으로 설정되거나 사용 가능한지 확인해야했습니다.
PM2 사용
서버 프로덕션 서버를 실행하는 가장 좋은 옵션은 무엇입니까
이런 식으로 응용 프로그램을 실행하면 어떤 이점이 있습니까?
충돌이 발생하면 PM2가 자동으로 응용 프로그램을 다시 시작합니다.
PM2는 처리되지 않은 예외에 대한 로그 (이 경우 /home/safeuser/.pm2/logs/app-err.log의 파일)를 보관합니다.
PM2는 하나의 명령으로 서버가 재부팅 될 때 관리하는 모든 응용 프로그램이 다시 시작되도록 할 수 있습니다. 기본적으로 노드 응용 프로그램은 서비스로 시작됩니다.
노드 응용 프로그램을 서비스로 실행하도록 만들지 않았습니다. 올바른 접근 방식은 / etc / inittab 항목 (이전 Linux 시스템) 또는 시작 (새로운 Linux 시스템)을 작성하는 것입니다.
다음을 시작으로 설정하는 방법에 대한 문서가 있습니다. https://github.com/cvee/node-upstart
crontab
CentOS x86 6.5에서 작동하지 않습니다. @reboot가 작동하지 않는 것 같습니다.
마지막 으로이 솔루션을 얻었습니다.
편집하다: /etc/rc.local
sudo vi /etc/rc.local
이 줄을 파일 끝에 추가하십시오. 변경 USER_NAME
및 PATH_TO_PROJECT
자신에. NODE_ENV=production
앱이 프로덕션 모드에서 실행됨을 의미합니다. 하나 이상의 node.js 앱을 실행해야하는 경우 더 많은 라인을 추가 할 수 있습니다.
su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"
NODE_ENV
별도의 줄에 설정하지 마십시오. 앱은 계속 개발 모드에서 실행됩니다 NODE_ENV
.
# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
vi 저장 후 종료 ESC : w q return
). 서버를 재부팅 할 수 있습니다. 서버가 재부팅되면 ssh를 통해 원격으로 계정에 로그인하지 않아도 node.js 앱이 자동으로 실행됩니다.
NODE_ENV
쉘에 환경을 설정하는 것이 좋습니다 . NODE_ENV
계정이 USER_NAME
로그인 하면 자동으로 설정됩니다 .
echo export NODE_ENV=production >> ~/.bash_profile
따라서 다시 /PATH_TO_PROJECT/app.js
설정하지 않고 ssh를 통해 영구 중지 / 시작과 같은 명령을 실행할 수 있습니다 NODE_ENV
.
나는 정확하게 이것을하는 스크립트를 썼다 :
https://github.com/chovy/node-startup
나는 영원히 시도하지 않았지만 실행하는 명령을 사용자 정의 할 수 있으므로 간단해야합니다.
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
위의 답변을 많이 시도했습니다. 그들 중 누구도 나를 위해 일하지 않았습니다. 내 앱은 /home
루트가 아닌 사용자로 설치됩니다 . 이것은 위에서 언급 한 시작 스크립트가 실행될 때/home
아직 마운트되지 않았으므로 앱이 시작되지 않았 음을 의미합니다.
그런 다음 Digital Ocean에서 다음 지침을 찾았습니다.
설명 된대로 PM2를 사용하는 것은 매우 간단하고 완벽하게 작동합니다. 내 가상 서버에는 두 번의 물리적 충돌이 있었으므로 중단 시간은 약 1 분이었습니다.
전체 예제 crontab (/ etc / crontab에 있음) ..
#!/bin/bash
# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l
# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
# * * * * * echo "executes once every minute" > /root/deleteme
@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;