Node.js设置,易于部署和更新

目前,我们正在为客户开发一个网站(Apache下为TYPO3),该网站由node.js / socket.io应用程序支持,该应用程序可实时更新CMS提供的内容。

由于这是我们的第一个node.js项目,因此在“完美设置”方面没有任何最佳实践,因此我花了一些时间研究部署技术。

对于我来说,要实现一个良好的设置还需要解决几个问题:

  1. 易于客户部署。 这非常重要,因为我们的网站将集成到其“实时” TYPO3安装中,该安装可服务大量网站,并且运行在不是由客户管理的服务器上,而是由另一个(集中的)组织进行服务呼叫和服务器更改 过程缓慢。

  2. 应该很容易更新。 如前所述,请求重新启动和更改服务器是一个缓慢的过程,因此,理想情况下,当节点安装收到使用forever推送到实时安装中的更改时,应重新启动/更新。

部署方式

对于部署节点应用程序以使其保持运行状态,似乎普遍同意使用forever。 我已经测试了forever,并且在npm(全局)下安装时似乎工作正常。 但是,这需要外部协助才能在实时环境中进行全局安装,因此我更希望从应用程序的node目录中运行它,但是我无法创建一个可靠的包装器来执行此操作。

此外,forever可以正常工作,但必须手动启动。 确保它在服务器启动时启动并保持运行的最佳方法是什么?

  • 一个简单的forever脚本?
  • 写看门狗包装?
  • TYPO3调度程序任务会检查forever状态?

快速开发/更新后重启

我们目前仍处于该项目的开发阶段,每当我对node.js应用程序进行更改时,我都会手动重新启动foreverforever。这行得通,但远非理想。有几个较小的npm模块检查文件修改,并在检测到更改后重新启动node,例如:

  • Nodemon
  • Node.js主管
  • 弹跳
  • 结节(不需要重新启动节点,因此可能更容易与forever结合使用)

有人有经验吗?

更新:为什么不只使用群集?

群集模块通过重新加载机制提供了类似的功能,但不适用于Node 0.5+。 替换它的核心集群模块(节点0.6+)不具有所有这些功能,而仅提供集群。 这反过来在socket.io中不能很好地发挥作用。 至少并非没有使用Redis(这对我们来说是个问题,因为我们不能向客户强制提供其他先决条件服务)。

-

显然,在将项目交付给客户之前,我试图找到一种最稳定的解决方案,该解决方案将更新重新启动器与forever结合在一起,我真的希望任何人都能产生出经过验证的技术组合。

Rem.co asked 2019-11-12T12:35:21Z
3个解决方案
63 votes

结合上周收集的所有知识(非常感谢Julian Knight的想法)和在过去一周中测试的方法,我决定解决以下所述的部署解决方案(我想很乐于分享给其他有类似问题的人以帮助他人 ):

只要脚本是在node.js脚本中生成的,就永远可以处理脚本错误的自动重启和脚本更改的自动重新加载,因为它还包括脚本监视。

为此,我添加了forever以启动我们实际上要运行的node server.js脚本:

server.js

var forever = require('forever'),
    child = new(forever.Monitor)('app.js', {
        'silent': false,
        'pidFile': 'pids/app.pid',
        'watch': true,
        'watchDirectory': '.',      // Top-level directory to watch from.
        'watchIgnoreDotFiles': true, // whether to ignore dot files
        'watchIgnorePatterns': [], // array of glob patterns to ignore, merged with contents of watchDirectory + '/.foreverignore' file
        'logFile': 'logs/forever.log', // Path to log output from forever process (when daemonized)
        'outFile': 'logs/forever.out', // Path to log output from child stdout
        'errFile': 'logs/forever.err'
    });
child.start();
forever.startServer(child);

这将监视应用程序目录中的所有文件是否有更改,并在更改后立即重新启动在forever中运行的脚本。 由于日志和pidfile位于应用程序的子目录中,因此必须从文件监视中忽略它们,否则脚本将循环重启:

.foreverignore

pids/**
logs/**

为了使这一切在系统启动时启动,并使我们能够使用forevernode server.js轻松控制服务,我们使用Ubuntu的Upstart。我将两个示例(这个和这个)组合在一起,可以很好地完成工作:

/etc/init/node-app.conf

# This is an upstart (http://upstart.ubuntu.com/) script
# to run the node.js server on system boot and make it
# manageable with commands such as
# 'start node-app' and 'stop node-app'
#
# This script is to be placed in /etc/init to work with upstart.
#
# Internally the 'initctl' command is used to manage:
# initctl help
# initctl status node-app
# initctl reload node-app
# initctl start node-app

description "node.js forever server for node-app"
author      "Remco Overdijk <remco@maxserv.nl>"
version "1.0"

expect fork

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:

start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

env HOME=/home/user/node-app-dir

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME=$HOME
    chdir $HOME
    exec /usr/local/bin/node server.js > logs/node.log &
end script

#post-start script
#   # Optionally put a script here that will notifiy you node has (re)started
#   # /root/bin/hoptoad.sh "node.js has started!"
#end script

正如Kevin在他的文章中明智地提到的那样,以root身份运行node是不明智的,因此下周我们将其移至新服务器时,将其更改为forever

因此,forevernode server.js自动启动,而upstartupstart启动,并监视崩溃和文件更改,从而使整个设置始终保持运行所需的时间。

我希望这对任何人都有帮助。

Rem.co answered 2019-11-12T12:37:11Z
7 votes

由于我的最后答案是为了未来! 以下是一些其他帮助链接:

  • [https://serverfault.com/questions/274857/how-to-use-node-js-as-a-production-web-server]
  • [http://www.slideshare.net/the_undefined/nodejs-best-practices-10428790](请参见幻灯片35)
  • [http://www.slideshare.net/the_undefined/nodejs-in-production](幻灯片31到末尾)
  • 当node.js发生故障时,如何自动将其备份?

似乎还没有完美的答案,但是有很多人在运行生产Node实例。 希望这将为您指明正确的方向。

Julian Knight answered 2019-11-12T12:38:22Z
5 votes

对于生产用途,最好查看Cluster之类的东西。 您可能不需要群集功能,但它还包含其他生产功能,例如零停机重启,日志记录,工作程序等。

如您所说,Forever可以进行测试,但实际上并没有生产所需的功能。

我似乎隐约记得,v0.7本身可能会采用Cluster或类似的东西

Julian Knight answered 2019-11-12T12:39:04Z
translate from https://stackoverflow.com:/questions/11084279/node-js-setup-for-easy-deployment-and-updating