Node.js 애플리케이션을 자체 프로세스로 실행하려면 어떻게합니까?


195

Node.js를 배포하는 가장 좋은 방법은 무엇입니까?

나는 Dreamhost VPS (그들이 VM 이라고 부름 )를 가지고 있으며 Node.js를 설치하고 프록시를 설정할 수있었습니다. 노드를 시작한 SSH 연결을 열린 상태로 유지하는 한 효과적입니다.


6
흠, Forever를 "deploying node.js"로 사용하는 것이 이상하게 보입니다. 프로세스 모니터링 / 감시 도구가 아닌가? 일반적으로 웹 배포는 웹 응용 프로그램을 사용할 수있게하는 몇 가지 상호 관련된 활동 (이 프로세스 도구가 그 일부 임)을 의미합니다. 어쨌든, 이것은 여전히 ​​모든 사람의 대답에서 배운 StackOverflow의 훌륭한 게시물입니다.
mikong

이것은 Dreamhost에서 가장 간단한 node.js 배포입니다. 목표는 단순히 시작점으로 노드를 안정적으로 실행하는 것입니다.
respectTheCode

포트 노드로 도메인을 전달하는 방법은 무엇입니까?
grm


우리는 지금 Elastic Beanstalk를 사용하고 있으며 꽤 잘 작동하고 있습니다.
respectTheCode

답변:


107

2016 답변 : 거의 모든 Linux 배포판에 systemd가 제공 되므로 영원히, monit, PM2 등이 더 이상 필요하지 않습니다 . OS가 이미 이러한 작업을 처리하고 있습니다.

myapp.service파일을 만드십시오 (명명하게 앱 이름으로 'myapp'로 대체) :

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nobody
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

유닉스를 처음 접한다면 첫 번째 줄에 /var/www/myapp/app.js있어야 #!/usr/bin/env node합니다.

서비스 파일을 /etc/systemd/system폴더에 복사하십시오 .

로 새로운 서비스에 대해 systemd에 알려주십시오 systemctl daemon-reload.

로 시작하십시오 systemctl start myapp.

로 부팅시 실행되도록 설정하십시오 systemctl enable myapp.

로 로그 참조 journalctl -u myapp

이는 Linux, 2018 년 에디션 에서 노드 앱을 배포하는 방법 에서 가져온 것으로 , 여기에는 .service파일을 포함하여 Linux / 노드 서버를 빌드하기위한 AWS / DigitalOcean / Azure CloudConfig 생성 명령이 포함되어 있습니다.


1
처리 방법에 대한 아이디어가 Failed to issue method call: Unit name ... is not valid.있습니까?
Julien Genestoux

1
@JulienGenestoux '단위'이름은 서비스와 동일합니다. 불일치가있는 것 같습니다. 파일을 복사 한 후 /etc/systemd/system실행해야 할 수도 있습니다 systemctl daemon-reload(systemd는 일반적으로 이것이 필요한지 알려줍니다). TBH 이것은 별도의 질문으로하는 것이 가장 좋습니다.
mikemaccana

3
서비스 파일을로 복사하는 대신을 /etc/systemd/system사용 systemctl enable /full/path/to/myapp.service하면 심볼릭 링크가 만들어집니다 /etc/systemd/system.
Arne

1
pm2와 어떻게 비교됩니까? pm2를 대체 할 수 있습니까 아니면 pm2가 더 필요한 기능을 제공합니까?
Sergei Basharov

1
@VinodSrivastav node/var/www/myapp/app.js자체적 으로 호출됩니다 . 유닉스에서 파일을 실행 가능하게 만들고 파일로 시작하는 첫 번째 줄은 #!/some/file해당 바이너리로 해석됩니다. 자세한 내용은 Google '통역사 유닉스'를 참조하십시오.
mikemaccana

101

영원히 사용하십시오 . 별도의 프로세스에서 Node.js 프로그램을 실행하고 죽으면 다시 시작합니다.

용법:

  • forever start example.js 프로세스를 시작합니다.
  • forever list 영원히 시작된 모든 프로세스 목록을 보려면
  • forever stop example.js프로세스 forever stop 0를 중지 하거나 인덱스가 0 인 프로세스를 중지하려면 (로 표시 forever list)

이것은 가깝습니다. 그것은 잘 시작되지만 아무것도 막을 수 없습니다. 로그 아웃했다가 다시 로그인 한 다음 노드 프로세스를 종료 할 수있었습니다. 영원히 다시 시작하지 않았습니다. 그래서 그것이 작동하는 방식이 DH와 호환되지 않는 것에 대해 생각하고 있습니다.
respectTheCode

@Kevin, Forever 자체가 노드에서 실행되기 때문에 노드 프로세스를 죽일 수 없습니다! 프로세스 중지 방법을 포함하여 답변에 사용 지침을 추가했습니다. VPS에서 이것을 사용하고 있으며 매력처럼 작동했습니다.
David Tang

forever stop 0오류가 발생하여 문제가 발생했습니다. 올바른 솔루션을 찾으면 쉽게 정리할 수 있도록 자체 사용자에게 루트 없이이 작업을 시도했습니다. 내 문제일지도 모른다. 좀 더 살펴 보겠습니다.
respectTheCode

npm에 문제가있는 문제가 있습니다. npm과 노드가 올바르게 설치되면 영원히 작동합니다. 내가 끝내었던 것은 재시작시 실행되도록 cronjob 세트에 forever start 명령을 추가하는 것이 었습니다. 나는 이제 영원히 procs를 시작하고 중단시킬 수있는 작은 노드 앱을 개발 중입니다.
respectTheCode

노드의 고유 클러스터 API를 사용하는 Forever의 대안이 있습니다 : github.com/superjoe30/naught
andrewrk

41

여기에 내 배포 방법에 대해 썼습니다 : node.js 앱 배포

한마디로 :

  • git post-receive hook 사용
  • 빌드 도구 용 Jake
  • 노드의 서비스 래퍼로 시작
  • 다운 된 애플리케이션을 모니터링하고 다시 시작하는 Monit
  • nginx 는 요청을 동일한 서버의 다른 응용 프로그램으로 라우팅

2
서버에 항상 단일 노드 사이트가있는 경우 Nginx를 안전하게 버릴 수 있습니까?
Dor

3
링크가 끊어진 것 같습니다
verybadalloc

@Dor이 답변이 늦었다는 것을 알고 있지만 그렇지 않습니다. SSL 종료 및 캐싱과는 별도로 호스트 앞의 nginx 리버스 프록시는 포트 80에서 직접 노드를 실행하는 것보다 더 큰 인프라 유연성을 제공합니다. 또한 루트로 노드를 실행할 필요가 없습니다. nginx 설정에 찬성하여 꽤 무거운 주장.
Chris Browne

16

pm2 는 트릭을 수행합니다.

기능은 다음과 같습니다. 모니터링, 핫 코드 재로드, 내장로드 밸런서, 자동 시작 스크립트 및 부활 / 덤프 프로세스.


Heroku와 같은 서비스와 호환됩니까?
FRD

그것은 Heroku가 작동 같아요 @FRD 나는 확인 이 문서
nickleefly

9

당신은 사용할 수 있습니다 monit, forever, upstart또는 systemd서버를 시작합니다.

Nginx 대신 Varnish 또는 HAProxy를 사용할 수 있습니다 (Nginx는 웹 소켓에서 작동하지 않는 것으로 알려져 있음).

신속하고 더러운 솔루션으로서 당신이 사용할 수있는 nohup node your_app.js &앱이 서버와 함께 종료 방지 할 수 있지만 forever, monit다른 제안 된 솔루션은 더 낫다.


2
"Sergey Yarotskiy"사용자가 Nginx가 이제 WebSockets (버전 1.3부터)를 지원한다고 말하면서 게시물을 편집하려고했습니다. 대신 의견으로 게시해야한다고 생각하여 수정을 거부했습니다. (그렇지 않으면 같은 게시물에 두 개의 상반되는 문장이 혼동 될 수 있습니다.)
Backlin

7

현재 내 앱에 사용되는 Upstart 스크립트를 만들었습니다.

description "YOUR APP NAME"
author "Capy - http://ecapy.com"

env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"

######################################################

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 99 5

pre-start script
    mkdir -p $PID_PATH
    mkdir -p /var/log/node
end script

script
    export NODE_ENV=$SERVER_ENV
    exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script

post-start script
    echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script

######### 전에 모두 사용자 정의하고 /etc/init/your-service.conf에 파일을 작성하여 붙여 넣으십시오.

그럼 당신은 할 수 있습니다 :

start your-service
stop your-service
restart your-service
status your-service

고마워, 내가 필요한 것만
Nilson Morais


5

다음은 systemd 로이 문제를 해결하는 데 대한 더 긴 기사입니다. http://savanne.be/articles/deploying-node-js-with-systemd/

명심해야 할 사항 :

  • 프로세스 모니터링은 누가 시작합니까? 영원히 훌륭한 도구이지만 계속 작동하려면 모니터링 도구가 필요합니다. 그것은 조금 어리석은 일입니다. 왜 init 시스템을 사용하지 않습니까?
  • 공정을 적절히 모니터링 할 수 있습니까?
  • 여러 백엔드를 실행하고 있습니까? 그렇다면 리소스 사용량 측면에서 다른 리소스를 중단하지 않도록하는 조항이 있습니까?
  • 서비스가 항상 필요합니까? 그렇지 않은 경우 소켓 활성화를 고려하십시오 (기사 참조).

이 모든 것은 체계적으로 쉽게 수행됩니다.


5

루트 액세스 권한이 있으면 백그라운드에서 안전하고 소리가 나도록 데몬을 설정하는 것이 좋습니다. 블로그 게시물 Ubuntu 에서 서비스로 Node.js 실행 에서 DebianUbuntu 에 대한 작업을 수행하는 방법을 읽을 수 있습니다 .


루트가 없다고 생각했지만 웹 패널에서 활성화 해야하는 것으로 보입니다. 이 기회를 드리겠습니다.
존중 TheCode

3

영원히 트릭을 할 것입니다.

@ 케빈 : 당신은 프로세스를 잘 죽일 수 있어야합니다. 설명서를 약간 다시 확인하겠습니다. 오류를 재현 할 수 있다면 GitHub에 문제로 게시하는 것이 좋습니다.


케빈은 누구입니까? OP?
Peter Mortensen


2

Box9가 말했듯이 Forever 는 프로덕션 코드에 적합합니다. 그러나 SSH 연결이 클라이언트에서 닫혀 있어도 프로세스를 계속 유지할 수 있습니다 .

프로덕션에 반드시 좋은 아이디어는 아니지만 긴 디버그 세션 중에 또는 긴 프로세스의 콘솔 출력을 따르거나 SSH 연결을 끊고 서버에서 터미널을 활성 상태로 유지하는 것이 유용한 경우에는 매우 유용합니다. 나중에 다시 연결합니다 (예 : 집에서 Node.js 애플리케이션을 시작하고 나중에 작업에 콘솔에 다시 연결하여 상황이 어떻게 진행되고 있는지 확인).

서버가 * nix 박스라고 가정하면 클라이언트 SSH가 닫힌 경우에도 쉘에서 screen 명령을 사용 하여 프로세스를 계속 실행할 수 있습니다. 아직 설치하지 않은 경우 웹에서 화면을 다운로드 / 설치할 수 있습니다 (Linux의 경우 배포 용 패키지를 찾거나 OS X의 경우 MacPorts 사용 ).

다음과 같이 작동합니다.

  1. SSH 연결을 처음 열 때 'screen'을 입력하면 화면 세션이 시작됩니다.
  2. 정상적으로 작업을 시작하십시오 (예 : Node.js 애플리케이션 시작).
  3. 완료되면 터미널을 닫으십시오. 서버 프로세스가 계속 실행됩니다.
  4. 콘솔에 다시 연결하려면 서버로 다시 ssh하고 로그인 한 다음 'screen -r'을 입력하여 다시 연결하십시오. 기존 콘솔 컨텍스트가 다시 사용 가능하도록 다시 팝업됩니다.
  5. 서버에 연결되어있는 동안 화면을 종료하려면 콘솔 프롬프트에서 'exit'을 입력하십시오. 그러면 일반 쉘로 넘어갑니다.

필요한 경우 이와 같이 여러 화면 세션을 동시에 실행할 수 있으며 모든 클라이언트에서 임의의 세션에 연결할 수 있습니다. 모든 옵션에 대한 온라인 설명서를 읽으십시오.


좋은 정보가 있습니다. 프로덕션 환경에서는 작동하지 않지만 원격 서버에서 디버깅 할 때 매우 유용 할 수 있다는 데 동의합니다.
respectTheCode

왜 nohup 노드를 사용하지 않습니까? myapp.js & 2> /var/log/myapp.log 1> / dev / null
markus_p

나는이 유명 유용하다고 youtube.com/watch?v=P4mT5Tbx_KE 설명을 nohup하고forever
비 노드 Srivastav을

1

Forever는 앱을 계속 실행하기위한 좋은 옵션입니다 (그리고 npm은 모듈로 설치 가능합니다).

그러나 배포, 재시작, 명령 실행 등의 원격 관리와 같은 더 심각한 '배치'의 경우 노드 확장과 함께 capistrano를 사용합니다.

https://github.com/loopj/capistrano-node-deploy


1

https://paastor.com 은 VPS 또는 다른 서버에 배포하는 비교적 새로운 서비스입니다. 코드를 푸시하는 CLI가 있습니다. Paastor에는 프리 티어가 있으며 적어도 게시 시점에 수행했습니다.



1

node-deploy-server를 시도하십시오 . 개인 서버에 응용 프로그램을 배포하기위한 복잡한 도구 세트입니다. Node.js로 작성되었으며 설치에 npm을 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.