programing

시스템 재시작 시 영원히(노드) 자동 시작

codeshow 2023. 9. 19. 21:32
반응형

시스템 재시작 시 영원히(노드) 자동 시작

노드의 포에버 모듈을 사용하여 노드 서버를 계속 실행하고 있습니다.그러나 시스템을 다시 시작하면 영원히 종료됩니다.시스템을 다시 시작할 때 노드 서버를 (영원히) 자동으로 시작할 수 있는 방법이 있습니까?

저는 크론탭을 사용하는 것을 제안합니다.사용하기 쉽습니다.

방법

  1. 편집을 시작하려면 다음을 실행하여 노드 프로세스에 대해 원하는 런타임 사용자로 "testuser"를 바꿉니다.본인이 아닌 다른 사용자를 선택하면 sudo와 함께 이를 실행해야 합니다.

    $ crontab -u testuser -e
    
  2. 이전에 이 작업을 수행한 적이 없는 경우 편집할 편집기를 묻는 메시지가 표시됩니다.저는 vim을 좋아하지만 사용의 편리성을 위해 nano를 추천할 것입니다.

  3. 편집기에서 다음 행을 추가합니다.

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
    
  4. 파일을 저장합니다.크론이 설치되었다는 피드백을 받아야 합니다.

  5. cron 설치를 추가로 확인하려면 다음을 실행하여 현재 설치된 cron을 나열합니다("testuser"를 대상 사용자 이름으로 다시 바꿉니다).

    $ crontab -u testuser -l 
    

제 생각에 cron에서 이진을 실행할 때는 항상 전체 경로를 사용해야 합니다.영원한 를 실행합니다.which forever완전한 길을 가기 위해서 입니다.

그런 걸 감안하면forevernode, 당신은 또한 당신에게 전체 경로를 제공하기를 원할 수도 있습니다.node:

@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js

더보기

당신은 이 일을 하는데 영원한 서비스를 사용할 수 있습니다.

npm install -g forever-service
forever-service install test

이렇게 하면 app.js를 서비스로 현재 디렉토리에 영원히 via로 프로비저닝합니다.시스템을 다시 시작할 때마다 서비스가 자동으로 다시 시작됩니다.또한 정지하면 우아한 정지를 시도합니다.이 스크립트는 로그 로테 스크립트도 제공합니다.

Github URL: https://github.com/zapty/forever-service

참고: 저는 영원한 봉사의 저자입니다.

  1. NPM을 사용하여 PM2를 전역적으로 설치

    npm install pm2 -g

  2. pm2로 스크립트 시작

    pm2 start app.js

  3. 활성 시작 스크립트 생성

    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

답변과 이 블로그 게시물에서 영감을 얻은 대안적인 크론탭 방법.

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. 복사하여 붙여넣기(bob을 원하는 사용자로 변경).

@reboot /bin/sh /home/bob/node_server_init.sh

크론탭을 저장합니다.

끝까지 성공하셨습니다. 상품은 리부트(테스트)입니다. :)

첨부된 질문에서 답변을 복사하였습니다.

로드 밸런서가 내장된 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]

이를 위해 /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 스크립트가 root으로 실행되기 때문에 폴더와 PATH가 명시적으로 설정되어 있거나 root 사용자가 사용할 수 있는지 확인해야 했습니다.

PM2 사용

서버 프로덕션 서버를 실행하는 데 가장 적합한 옵션은 무엇입니까?

이런 방식으로 애플리케이션을 실행하면 어떤 이점이 있습니까?

  • PM2는 응용프로그램이 충돌할 경우 자동으로 재시작됩니다.

  • PM2는 처리되지 않은 예외의 로그를 /home/safeuser/.pm2/logs/app-err.log의 파일에 보관합니다.

  • 하나의 명령으로 PM2는 서버가 재부팅될 때 자신이 관리하는 모든 응용프로그램이 다시 시작되도록 할 수 있습니다.기본적으로 노드 응용 프로그램은 서비스로 시작됩니다.

ref: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

노드 응용프로그램을 서비스로 실행하기 위해 Forever가 만들어지지 않았습니다.올바른 접근 방식은 /etc/inittab 항목(이전 리눅스 시스템) 또는 업스타트(새로운 리눅스 시스템)를 생성하는 것입니다.

다음은 스타트업으로 설정하는 방법에 대한 몇 가지 설명서입니다. https://github.com/cvee/node-upstart

crontabCentOS x86 6.5에서 작동하지 않습니다. @reboot가 작동하지 않는 것 같습니다.

결국 다음과 같은 해결책을 얻었습니다.

편집: /etc/rc.local

sudo vi /etc/rc.local

이 행을 파일 끝에 추가합니다.eUSER_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

forever stop/start 와 할 수 ./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

rc.local의 문제는 명령이 사용자로 로그인하고 sudo를 사용하는 것과는 다른 root으로 액세스된다는 것입니다.

제가 원하는 startup commands etc/profile.d로 .sh 스크립트를 추가하여 이 문제를 해결하였습니다.profile.d에 있는 모든 .sh 파일이 자동으로 로드되고 모든 명령은 일반 sudo를 사용한 것처럼 처리됩니다.

이에 대한 유일한 단점은 지정된 사용자가 로그인을 해야 시작할 수 있다는 것입니다. 제 상황은 항상 그러했습니다.

저는 위의 답변들을 많이 시도했습니다.그들 중 아무도 내게 통하지 않았습니다.제 다에 되어 있습니다./home루트가 아닌 사용자로서.된 시작 될 때,때,/home아직 마운트되지 않았으므로 앱이 시작되지 않았습니다.

그리고 Digital Ocean에서 다음과 같은 지침을 찾았습니다.

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

설명한 대로 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;

저는 다음과 같이 serve & npm을 사용하여 저만의 해결책을 찾았습니다.

  • 서비스 패키지 설치:npm install -g serve
  • 그럼 지휘권을 가지세요.serve -s /var/www/sitename다시 부팅할 수 있습니다.

이것이 제 VPS에 적합한 것입니다.

셸에서 다음 명령을 사용하여 노드를 영원히 시작할 수 있습니다.

forever app.js //my node script

앱이 실행 중인 서버는 항상 켜져 있어야 한다는 것을 명심해야 합니다.

언급URL : https://stackoverflow.com/questions/13385029/automatically-start-forever-node-on-system-restart

반응형