Node.js를 배포하는 가장 좋은 방법은 무엇입니까?
나는 Dreamhost VPS (그들이 VM 이라고 부름 )를 가지고 있으며 Node.js를 설치하고 프록시를 설정할 수있었습니다. 노드를 시작한 SSH 연결을 열린 상태로 유지하는 한 효과적입니다.
Node.js를 배포하는 가장 좋은 방법은 무엇입니까?
나는 Dreamhost VPS (그들이 VM 이라고 부름 )를 가지고 있으며 Node.js를 설치하고 프록시를 설정할 수있었습니다. 노드를 시작한 SSH 연결을 열린 상태로 유지하는 한 효과적입니다.
답변:
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 생성 명령이 포함되어 있습니다.
Failed to issue method call: Unit name ... is not valid.
있습니까?
/etc/systemd/system
실행해야 할 수도 있습니다 systemctl daemon-reload
(systemd는 일반적으로 이것이 필요한지 알려줍니다). TBH 이것은 별도의 질문으로하는 것이 가장 좋습니다.
/etc/systemd/system
사용 systemctl enable /full/path/to/myapp.service
하면 심볼릭 링크가 만들어집니다 /etc/systemd/system
.
node
는 /var/www/myapp/app.js
자체적 으로 호출됩니다 . 유닉스에서 파일을 실행 가능하게 만들고 파일로 시작하는 첫 번째 줄은 #!/some/file
해당 바이너리로 해석됩니다. 자세한 내용은 Google '통역사 유닉스'를 참조하십시오.
영원히 사용하십시오 . 별도의 프로세스에서 Node.js 프로그램을 실행하고 죽으면 다시 시작합니다.
용법:
forever start example.js
프로세스를 시작합니다.forever list
영원히 시작된 모든 프로세스 목록을 보려면forever stop example.js
프로세스 forever stop 0
를 중지 하거나 인덱스가 0 인 프로세스를 중지하려면 (로 표시 forever list
)forever stop 0
오류가 발생하여 문제가 발생했습니다. 올바른 솔루션을 찾으면 쉽게 정리할 수 있도록 자체 사용자에게 루트 없이이 작업을 시도했습니다. 내 문제일지도 모른다. 좀 더 살펴 보겠습니다.
여기에 내 배포 방법에 대해 썼습니다 : node.js 앱 배포
한마디로 :
pm2 는 트릭을 수행합니다.
기능은 다음과 같습니다. 모니터링, 핫 코드 재로드, 내장로드 밸런서, 자동 시작 스크립트 및 부활 / 덤프 프로세스.
당신은 사용할 수 있습니다 monit
, forever
, upstart
또는 systemd
서버를 시작합니다.
Nginx 대신 Varnish 또는 HAProxy를 사용할 수 있습니다 (Nginx는 웹 소켓에서 작동하지 않는 것으로 알려져 있음).
신속하고 더러운 솔루션으로서 당신이 사용할 수있는 nohup node your_app.js &
앱이 서버와 함께 종료 방지 할 수 있지만 forever
, monit
다른 제안 된 솔루션은 더 낫다.
현재 내 앱에 사용되는 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
예제 파일과 함께 Node.js 배포에 대한 매우 포괄적 인 가이드를 작성했습니다.
다음은 systemd 로이 문제를 해결하는 데 대한 더 긴 기사입니다. http://savanne.be/articles/deploying-node-js-with-systemd/
명심해야 할 사항 :
이 모든 것은 체계적으로 쉽게 수행됩니다.
루트 액세스 권한이 있으면 백그라운드에서 안전하고 소리가 나도록 데몬을 설정하는 것이 좋습니다. 블로그 게시물 Ubuntu 에서 서비스로 Node.js 실행 에서 Debian 및 Ubuntu 에 대한 작업을 수행하는 방법을 읽을 수 있습니다 .
영원히 트릭을 할 것입니다.
@ 케빈 : 당신은 프로세스를 잘 죽일 수 있어야합니다. 설명서를 약간 다시 확인하겠습니다. 오류를 재현 할 수 있다면 GitHub에 문제로 게시하는 것이 좋습니다.
Capistrano, Upstart 및 Nginx와 함께 Node.js 앱을 배포하기위한 훌륭하고 자세한 가이드
Box9가 말했듯이 Forever 는 프로덕션 코드에 적합합니다. 그러나 SSH 연결이 클라이언트에서 닫혀 있어도 프로세스를 계속 유지할 수 있습니다 .
프로덕션에 반드시 좋은 아이디어는 아니지만 긴 디버그 세션 중에 또는 긴 프로세스의 콘솔 출력을 따르거나 SSH 연결을 끊고 서버에서 터미널을 활성 상태로 유지하는 것이 유용한 경우에는 매우 유용합니다. 나중에 다시 연결합니다 (예 : 집에서 Node.js 애플리케이션을 시작하고 나중에 작업에 콘솔에 다시 연결하여 상황이 어떻게 진행되고 있는지 확인).
서버가 * nix 박스라고 가정하면 클라이언트 SSH가 닫힌 경우에도 쉘에서 screen 명령을 사용 하여 프로세스를 계속 실행할 수 있습니다. 아직 설치하지 않은 경우 웹에서 화면을 다운로드 / 설치할 수 있습니다 (Linux의 경우 배포 용 패키지를 찾거나 OS X의 경우 MacPorts 사용 ).
다음과 같이 작동합니다.
필요한 경우 이와 같이 여러 화면 세션을 동시에 실행할 수 있으며 모든 클라이언트에서 임의의 세션에 연결할 수 있습니다. 모든 옵션에 대한 온라인 설명서를 읽으십시오.
Forever는 앱을 계속 실행하기위한 좋은 옵션입니다 (그리고 npm은 모듈로 설치 가능합니다).
그러나 배포, 재시작, 명령 실행 등의 원격 관리와 같은 더 심각한 '배치'의 경우 노드 확장과 함께 capistrano를 사용합니다.
https://paastor.com 은 VPS 또는 다른 서버에 배포하는 비교적 새로운 서비스입니다. 코드를 푸시하는 CLI가 있습니다. Paastor에는 프리 티어가 있으며 적어도 게시 시점에 수행했습니다.
귀하의 경우에는 upstart 데몬을 사용할 수 있습니다 . 완전한 배포 솔루션을 위해 capistrano를 제안 할 수 있습니다 . 두 가지 유용한 안내서는 Node.js env 설정 방법 과 capistrano + upstart를 통한 배포 방법 입니다.
node-deploy-server를 시도하십시오 . 개인 서버에 응용 프로그램을 배포하기위한 복잡한 도구 세트입니다. Node.js로 작성되었으며 설치에 npm을 사용합니다.