如何将Node.js应用程序作为自己的进程运行?

时间:2011-01-13 14:24:09

标签: node.js service deployment daemon

部署Node.js的最佳方法是什么?

我有一个Dreamhost VPS(他们称之为VM),我已经能够安装Node.js并设置代理。只要我保持打开的节点的SSH连接,这就很好用。

16 个答案:

答案 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

简而言之:

  • 使用git post-receive hook
  • Jake用于构建工具
  • Upstart作为节点
  • 的服务包装器
  • Monit监控并重启应用程序
  • nginx将请求路由到同一服务器上的不同应用程序

答案 3 :(得分:16)

pm2做了招数。

功能包括:监控,热代码重新加载,内置负载均衡器,自动启动脚本以及复活/转储过程。

答案 4 :(得分:9)

您可以使用monitforeverupstartsystemd启动服务器。

您可以使用Varnish或HAProxy而不是Nginx(已知Nginx不能与websockets一起使用)。

作为一种快速而肮脏的解决方案,您可以使用nohup node your_app.js &来阻止您的应用终止于您的服务器,但forevermonit和其他建议的解决方案更好。

答案 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的指南,其中包含示例文件:

Tutorial: How to Deploy Node.js Applications, With Examples

它涵盖了http-proxy,SSLSocket.IO等内容。

答案 7 :(得分:5)

如果您具有root访问权限,则最好设置一个守护程序,以便它在后台运行安全可靠。您可以在博客文章 Debian 中阅读UbuntuRun Node.js as a Service on Ubuntu如何做到这一点。

答案 8 :(得分:5)

以下是有关使用systemd http://savanne.be/articles/deploying-node-js-with-systemd/

解决此问题的较长篇文章

要记住的一些事情:

  • 谁将开始您的过程监控? Forever是一个很棒的工具,但它需要一个监控工具来保持自身运行。这有点傻,为什么不只是使用你的init系统?
  • 您能充分监控您的流程吗?
  • 您是否正在运行多个后端?如果是这样,你是否有规定防止任何一方在资源使用方面摧毁其他人?
  • 是否一直需要这项服务?如果没有,请考虑套接字激活(请参阅文章)。

所有这些都可以通过systemd轻松完成。

答案 9 :(得分:3)

Forever 可以解决问题。

@Kevin:你应该能够杀死进程。我会仔细检查一下文档。如果您可以重现错误,那么将它作为一个问题发布在GitHub上会很棒。

答案 10 :(得分:2)

正如Box9所说,Forever是生产代码的不错选择。但即使从客户端关闭SSH连接,也可以保持进程。

虽然对于生产来说不一定是个好主意,但是在长调试会话的中间,或者跟随冗长进程的控制台输出,或者只要有时断开SSH连接,但保持终端活动,这非常方便在服务器中稍后重新连接(比如在家中启动Node.js应用程序并在以后重新连接到控制台以检查工作情况)。

假设您的服务器是* nix框,您可以使用shell中的screen命令来保持进程正常运行,即使客户端SSH已关闭。如果尚未安装,您可以从Web下载/安装屏幕(如果是Linux,请查找分发包,或者如果OS X则使用MacPorts。)

它的工作原理如下:

  1. 首次打开SSH连接时,请键入“screen” - 这将启动您的屏幕会话。
  2. 开始正常工作(即启动Node.js应用程序)
  3. 完成后,关闭终端。您的服务器进程将继续运行。
  4. 要重新连接到控制台,请回到服务器,登录,然后输入'screen -r'重新连接。您的旧控制台上下文将弹回以备您继续使用它。
  5. 要退出屏幕,在连接到服务器的同时,在控制台提示符下键入“exit” - 这将使您进入常规shell。
  6. 如果需要,您可以同时运行多个屏幕会话,并且可以从任何客户端连接到任何屏幕会话。在线阅读文档以获取所有选项。

答案 11 :(得分:2)

试试这个: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应用程序的详细指南

答案 12 :(得分:1)

在您的情况下,您可以使用upstart守护程序。对于完整的部署解决方案,我可能会建议capistrano。两个有用的指南是 How to setup Node.js env How to deploy via capistrano + upstart

答案 13 :(得分:1)

永远是保持应用程序运行的一个很好的选择(并且它可以作为一个很好的模块安装npm。)

但是对于更严肃的“部署” - 远程管理部署,重启,运行命令等 - 我会使用capistrano和节点扩展。

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

答案 14 :(得分:1)

试试node-deploy-server。它是用于将应用程序部署到私有服务器上的复杂工具集。它是用Node.js编写的,并使用npm进行安装。

答案 15 :(得分:1)

https://paastor.com是一项相对较新的服务,可以为您,VPS或其他服务器进行部署。有一个CLI来推送代码。 Paastor有一个免费套餐,至少它在发布时已经做过了。