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


194

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

我有一个Dreamhost VPS(这就是他们所说的VM),并且我已经能够安装Node.js并设置代理。只要我保持打开节点时启动的SSH连接就可以了。


6
嗯,您把Forever称为“部署node.js”,这对我来说似乎很奇怪。不仅仅是过程监视/监督工具吗?通常,Web部署意味着(至少我在文章中遇到的东西)一些相互关联的活动,这些活动使Web应用程序可用(此过程工具是其中的一部分)。无论如何,正如我从每个人的答案中学到的,这仍然是StackOverflow中的精彩文章。
mikong 2011年

这只是在Dreamhost上最简单的node.js部署。目标只是让节点可靠地运行,以此作为构建的起点。
尊重TheCode

您如何处理将域转发到正在运行的端口节点?
grm 2012年


我们现在正在使用Elastic Beanstalk,并且运行良好。
respectTheCode

Answers:


106

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文件)的命令。


1
对如何处理有任何想法Failed to issue method call: Unit name ... is not valid.吗?
Julien Genestoux

1
@JulienGenestoux的“单位”名称与您的服务相同。听起来那里有差异。将文件复制到之后,/etc/systemd/system您可能需要运行systemctl daemon-reload(systemd通常会告诉您是否需要这样做)。TBH最好将其作为一个单独的问题提出。
mikemaccana 2015年

3
无需将服务文件复制到中/etc/systemd/system,您只需使用即可为您systemctl enable /full/path/to/myapp.service创建一个符号链接/etc/systemd/system
Arne

1
与pm2相比如何?它可以代替pm2还是提供更多必要的功能?
谢尔盖·巴沙罗夫

1
@VinodSrivastav 本身node被调用/var/www/myapp/app.js。在Unix中,如果#!/some/file将文件设为可执行文件,并且文件的第一行将使用该二进制文件进行解释。Google的“解释器Unix”了解更多。
mikemaccana

101

永远使用。它在单独的进程中运行Node.js程序,如果有死机,则重新启动它们。

用法:

  • forever start example.js 开始一个过程。
  • forever list 查看永远启动的所有进程的列表
  • forever stop example.js以停止该进程,或forever stop 0以索引0停止该进程(如所示forever list)。

这很近。它开始很好,但不会让我停止任何事情。我能够注销并重新登录,然后杀死节点进程。永远都没有重启它。因此,我正在考虑其工作方式是否与DH不兼容。
尊重TheCode

@Kevin,您无法杀死节点进程,因为Forever本身在节点上运行!我在答案中添加了一些用法说明,包括如何停止进程。我已经在我的VPS上使用了它,它的工作就像一个魅力。
大卫·唐

forever stop 0发生错误,事情就从那儿崩溃了。我一直试图在没有root用户权限的情况下执行此操作,以便一旦找到正确的解决方案就可以轻松清理。那可能是我的问题。我会进一步研究。
尊重TheCode

我的npm出现问题,导致出现问题。在正确安装npm和node的情况下,永远可以正常工作。我最终要做的是将永久启动命令添加到cronjob集中,以在重新启动时运行。我现在正在开发一个小节点应用程序,它将使我永远启动和停止proc。
–ECTIONTheCode

有一种使用节点的本机集群API的Forever的替代方法:github.com/superjoe30/naught
andrewrk 2013年

41

我在这里已经介绍了我的部署方法:部署node.js应用

简而言之:

  • 使用git post-receive钩子
  • 杰克的构建工具
  • Upstart作为节点的服务包装器
  • 监视并重新启动应用程序,使其崩溃
  • nginx将请求路由到同一服务器上的不同应用程序

2
如果我的服务器上始终有一个Node站点,我可以安全地放弃Nginx吗?
2013年

3
链接似乎已断开
verybadalloc 2013年

@Dor我知道这是一个较晚的答复,但我不会。除了SSL终止和缓存之类的功能之外,与直接在端口80上运行节点相比,主机前端的nginx反向代理还提供了更大的基础结构灵活性。这也意味着您不必以root身份运行节点。支持nginx设置的一个非常繁琐的论点。
克里斯·布朗


9

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

您可以使用Varnish或HAProxy代替Nginx(已知Nginx不适用于websockets)。

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


2
用户“ Sergey Yarotskiy”试图编辑您的帖子,说Nginx现在支持WebSockets(从1.3版开始)。我拒绝了该修改,因为我认为应该将其发布为评论。(否则,您将在同
一篇

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

谢谢,正是我所需要的。
Nilson Morais 2014年


5

这是有关使用systemd解决此问题的较长文章:http : //savanne.be/articles/deploying-node-js-with-systemd/

注意事项:

  • 谁将开始您的过程监控?永远是一个很棒的工具,但是它需要一个监视工具来保持自身运行。有点傻,为什么不只使用您的init系统呢?
  • 您可以充分监控流程吗?
  • 您是否在运行多个后端?如果是这样,您是否已制定条款以防止其中任何一个在资源使用方面降低其他标准?
  • 是否会一直需要该服务?如果没有,请考虑激活套接字(请参阅文章)。

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



3

永远会成功。

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


凯文是谁?OP?
Peter Mortensen


2

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

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

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

它的工作方式如下:

  1. 首次打开SSH连接时,键入“ screen”-这将启动您的屏幕会话。
  2. 开始正常工作(即启动Node.js应用程序)
  3. 完成后,关闭终端。您的服务器进程将继续运行。
  4. 要重新连接到控制台,请ssh返回服务器,登录,然后输入“ screen -r”以重新连接。您的旧控制台上下文将弹出以供您继续使用。
  5. 要退出屏幕,请在连接到服务器时在控制台提示符下键入“ exit”,这将使您进入常规外壳。

如果需要,您可以同时运行多个屏幕会话,并且可以从任何客户端连接到其中的任何一个。有关所有选项,请在线阅读文档。


有好的信息。我同意这不适用于生产环境,但是在远程服务器上调试时可能非常有用。
respectTheCode

为什么不只使用nohup节点myapp.js&2> /var/log/myapp.log 1> / dev / null
markus_p 2012年

我发现这个AV有用youtube.com/watch?v=P4mT5Tbx_KE解释nohupforever
维诺德Srivastav

1

Forever是保持应用程序运行的好选择(它可以作为模块安装npm,这很好)。

但是对于更严重的“部署”(例如部署,重新启动,运行命令的远程管理等),我会在节点扩展中使用capistrano。

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


1

https://paastor.com是一项相对较新的服务,可以为您部署到VPS或其他服务器。有一个CLI可以推送代码。Paastor有一个免费层,至少在发布此页面时就是如此。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.