部署Node.js的最佳方法是什么?
我有一个Dreamhost VPS(这就是他们所说的VM),并且我已经能够安装Node.js并设置代理。只要我保持打开节点时启动的SSH连接就可以了。
部署Node.js的最佳方法是什么?
我有一个Dreamhost VPS(这就是他们所说的VM),并且我已经能够安装Node.js并设置代理。只要我保持打开节点时启动的SSH连接就可以了。
Answers:
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
请注意,如果您不熟悉Unix: /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
这取自我们在2018版Linux上部署节点应用程序的方式,其中还包括用于生成AWS / DigitalOcean / Azure CloudConfig来构建Linux /节点服务器(包括.service
文件)的命令。
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
。在Unix中,如果#!/some/file
将文件设为可执行文件,并且文件的第一行将使用该二进制文件进行解释。Google的“解释器Unix”了解更多。
永远使用。它在单独的进程中运行Node.js程序,如果有死机,则重新启动它们。
用法:
forever start example.js
开始一个过程。forever list
查看永远启动的所有进程的列表forever stop example.js
以停止该进程,或forever stop 0
以索引0停止该进程(如所示forever list
)。forever stop 0
发生错误,事情就从那儿崩溃了。我一直试图在没有root用户权限的情况下执行此操作,以便一旦找到正确的解决方案就可以轻松清理。那可能是我的问题。我会进一步研究。
我在这里已经介绍了我的部署方法:部署node.js应用
简而言之:
我制作了当前用于我的应用程序的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
这是有关使用systemd解决此问题的较长文章:http : //savanne.be/articles/deploying-node-js-with-systemd/
注意事项:
所有这些事情都可以通过systemd轻松完成。
如果您具有root用户访问权限,则最好设置一个守护程序,使其在后台安全无虞地运行。您可以在博客文章“在Ubuntu上将Node.js作为服务运行”中了解如何针对Debian和Ubuntu做到这一点。
试试这个:http : //www.technology-ebay.de/the-teams/mobile-de/blog/deploying-node-applications-with-capistrano-github-nginx-and-upstart.html
关于通过Capistrano,Upstart和Nginx部署Node.js应用程序的详尽指导
如Box9所说,Forever是生产代码的不错选择。但是,即使从客户端关闭SSH连接,也可以使进程继续运行。
虽然不一定是生产的好主意,但是在长时间的调试会话中,或者遵循冗长的进程的控制台输出时,或者在断开SSH连接但在服务器中保持终端活动的有用时,这非常方便以便稍后重新连接(例如在家中启动Node.js应用程序并稍后在工作中重新连接到控制台以检查运行情况)。
假设您的服务器是一个* nix框,那么即使关闭客户端SSH ,也可以使用shell中的screen命令保持进程运行。如果尚未安装,则可以从Web下载/安装屏幕(如果是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进行安装。