什么是部署Node.js的最佳方式?
我有一个Dreamhost VPS(他们称之为VM),我已经能够安装Node.js并设置代理。只要保持我用来启动node的SSH连接开放,这个方法就很好用。
什么是部署Node.js的最佳方式?
我有一个Dreamhost VPS(他们称之为VM),我已经能够安装Node.js并设置代理。只要保持我用来启动node的SSH连接开放,这个方法就很好用。
2016的答案: 几乎每个Linux发行版都附带有systemd,这意味着 forever、monit、PM2等工具已不再必需 - 您的操作系统已经处理了这些任务。
创建一个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=nogroup
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
并执行 chmod +x myapp.js
命令以打开可执行权限。
将服务文件复制到 /etc/systemd/system
文件夹中。
使用 systemctl daemon-reload
命令告诉 systemd 新的服务信息。
使用 systemctl start myapp
命令启动服务。
使用 systemctl enable myapp
命令设置服务开机自启。
使用 journalctl -u myapp
命令查看日志。
这段内容摘自How we deploy node apps on Linux, 2018 edition,其中还包括生成 AWS/DigitalOcean/Azure CloudConfig 构建 Linux/node 服务器(包括 .service
文件)的命令。
/etc/systemd/system
中,您可以使用systemctl enable /full/path/to/myapp.service
,它会为您创建一个符号链接放在/etc/systemd/system
中。 - Arnenode
是由 /var/www/myapp/app.js
自身调用的。在 Unix 中,如果您将文件设置为可执行文件,并且第一行以 #!/some/file
开头,则该文件将使用该二进制文件进行解释。请搜索“Unix 解释器”以了解更多信息。 - mikemaccana使用Forever。它可以在单独的进程中运行Node.js程序,并在任何进程失败时重新启动它们。
用法:
forever start example.js
启动一个进程。forever list
查看所有由Forever启动的进程列表forever stop example.js
停止进程,或者forever stop 0
停止索引为0的进程(如forever list
所示)。我在这里写了关于我的部署方法:部署Node.js应用
简要概述:
monit
、forever
、upstart
或 systemd
来启动您的服务器。nohup node your_app.js &
来防止您的应用程序随服务器终止,但是使用 forever
、monit
和其他提议的解决方案更好。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 完成。
Forever可以解决这个问题。
@Kevin: 你应该能够成功终止进程。我建议再仔细查阅一下文档。如果你能重现错误,最好在GitHub上发布问题以便解决。