部署Node.js的最佳方法是什么?
我有一个Dreamhost VPS(他们称之为VM),我已经能够安装Node.js并设置代理。只要我保持打开的节点的SSH连接,这就很好用。
答案 0 :(得分:100)
使用Forever。它在单独的进程中运行Node.js程序,并在任何程序死亡时重新启动它们。
用法:
forever start example.js
开始一个过程。forever list
查看永远启动的所有流程列表forever stop example.js
停止流程,或forever stop 0
停止索引为0的流程(如forever list
所示)。答案 1 :(得分:99)
2016年回答:几乎每个Linux发行版都附带systemd,这意味着永远,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=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
文件夹中。
使用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 /节点服务器(包括.service
文件)的命令。
答案 2 :(得分:41)
我在这里写过我的部署方法:Deploying node.js apps
简而言之:
答案 3 :(得分:16)
pm2做了招数。
功能包括:监控,热代码重新加载,内置负载均衡器,自动启动脚本以及复活/转储过程。
答案 4 :(得分:9)
您可以使用monit
,forever
,upstart
或systemd
启动服务器。
您可以使用Varnish或HAProxy而不是Nginx(已知Nginx不能与websockets一起使用)。
作为一种快速而肮脏的解决方案,您可以使用nohup node your_app.js &
来阻止您的应用终止于您的服务器,但forever
,monit
和其他建议的解决方案更好。
答案 5 :(得分: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
答案 6 :(得分:6)
我已经编写了一个非常全面的部署Node.js的指南,其中包含示例文件:
答案 7 :(得分:5)
如果您具有root访问权限,则最好设置一个守护程序,以便它在后台运行安全可靠。您可以在博客文章 Debian 中阅读Ubuntu和Run Node.js as a Service on Ubuntu如何做到这一点。
答案 8 :(得分:5)
以下是有关使用systemd http://savanne.be/articles/deploying-node-js-with-systemd/
解决此问题的较长篇文章要记住的一些事情:
所有这些都可以通过systemd轻松完成。
答案 9 :(得分:3)
Forever 可以解决问题。
@Kevin:你应该能够杀死进程。我会仔细检查一下文档。如果您可以重现错误,那么将它作为一个问题发布在GitHub上会很棒。
答案 10 :(得分:2)
正如Box9所说,Forever是生产代码的不错选择。但即使从客户端关闭SSH连接,也可以保持进程。
虽然对于生产来说不一定是个好主意,但是在长调试会话的中间,或者跟随冗长进程的控制台输出,或者只要有时断开SSH连接,但保持终端活动,这非常方便在服务器中稍后重新连接(比如在家中启动Node.js应用程序并在以后重新连接到控制台以检查工作情况)。
假设您的服务器是* nix框,您可以使用shell中的screen命令来保持进程正常运行,即使客户端SSH已关闭。如果尚未安装,您可以从Web下载/安装屏幕(如果是Linux,请查找分发包,或者如果OS X则使用MacPorts。)
它的工作原理如下:
如果需要,您可以同时运行多个屏幕会话,并且可以从任何客户端连接到任何屏幕会话。在线阅读文档以获取所有选项。
答案 11 :(得分:2)
使用Capistrano,Upstart和Nginx部署Node.js应用程序的详细指南
答案 12 :(得分:1)
在您的情况下,您可以使用upstart守护程序。对于完整的部署解决方案,我可能会建议capistrano。两个有用的指南是 How to setup Node.js env 和 How to deploy via capistrano + upstart 。
答案 13 :(得分:1)
永远是保持应用程序运行的一个很好的选择(并且它可以作为一个很好的模块安装npm。)
但是对于更严肃的“部署” - 远程管理部署,重启,运行命令等 - 我会使用capistrano和节点扩展。
答案 14 :(得分:1)
试试node-deploy-server。它是用于将应用程序部署到私有服务器上的复杂工具集。它是用Node.js编写的,并使用npm进行安装。
答案 15 :(得分:1)
https://paastor.com是一项相对较新的服务,可以为您,VPS或其他服务器进行部署。有一个CLI来推送代码。 Paastor有一个免费套餐,至少它在发布时已经做过了。