首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于轻松部署和更新的Node.js设置

用于轻松部署和更新的Node.js设置
EN

Stack Overflow用户
提问于 2012-06-18 21:48:13
回答 3查看 23K关注 0票数 56

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

由于这是我们的第一个node.js项目,当涉及到“完美设置”时,我没有任何最佳实践可供参考,所以我花了一些时间研究部署技术。

为了实现一个好的设置,我还有几个问题要问:

  1. Is客户可以轻松部署。这一点非常重要,因为我们的网站将被集成到他们的‘实时’TYPO3安装中,它为大量网站提供服务,并且运行在不受客户管理的服务器上,但另一个(集中式)组织使得支持电话和服务器更改很容易更新。如前所述,请求重启和进行服务器更改是一个缓慢的过程,因此理想情况下,当使用git.

将更改推送到实时安装程序时,节点安装应该重新启动/更新

部署

当涉及到部署节点应用程序以使其保持运行时,general consensus似乎使用forever。我测试过forever,当它由npm install forever -g (全局)安装时,似乎工作得很好。不过,这需要外部帮助才能在实时环境中全局安装,所以我更喜欢从应用程序的node_modules目录中运行它,但我还无法创建一个可靠的包装器来实现这一点。

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

  • A simple init.d script?
  • Writing a watchdog wrapper?
  • 检查TYPO3状态的forever调度程序任务?

在更新时快速开发/重新启动

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

结合起来可能更容易

有没有人有这些方面的经验?

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

Cluster module通过reload机制提供类似的功能,但doesn't work with Node 0.5+。取代它的core Cluster module (Node 0.6+)并没有所有这些功能,而只是提供了集群。这反过来又是doesn't play well with socket.io。至少是not without using Redis (这对我们来说是一个问题,因为我们不能强迫客户提供另一项prereq服务)。

--

显然,我正在努力寻找最稳定的解决方案,在将项目交给客户之前,将更新-重启动器与forever相结合,我真的希望有人已经开发出了经过验证的技术组合。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-22 21:33:40

结合收集到的所有知识(非常感谢Julian Knight的想法)和在过去一周测试的方法,我决定采用下面描述的部署解决方案(我想我会很高兴与他人分享,以帮助其他有类似问题的人):

脚本错误时自动重启脚本更改时自动重载由处理,因为它还包括脚本监视,只要从node.js脚本中产生永久。

为此,我添加了一个server.js来启动我们实际想要运行的app.js脚本:

server.js

代码语言:javascript
复制
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

代码语言:javascript
复制
pids/**
logs/**

为了让所有这些都在系统启动时启动,并使我们能够使用start node-appstop node-app轻松控制服务,我们使用Ubuntu's Upstart。我已经将两个示例(thisthis one)组合成一个,可以很好地完成这项工作:

/etc/init/node-app.conf

代码语言:javascript
复制
# 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 wisely mentions in his article,以根用户身份运行node是不明智的,所以当我们下周迁移到新服务器时,我们将把它改为exec sudo -u www-data /usr/local/bin/node

因此,foreverupstart启动的node server.js自动启动,并监视崩溃和文件更改,使整个安装程序在我们想要的时间内运行。

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

票数 63
EN

Stack Overflow用户

发布于 2012-06-20 05:49:17

因为我最后的回答是面向未来的!以下是一些其他的辅助链接:

的幻灯片31

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

票数 7
EN

Stack Overflow用户

发布于 2012-06-19 04:26:54

对于生产使用,您可能会更好地使用Cluster之类的东西。您可能不需要集群功能,但它还包括其他生产功能,如零停机重新启动、日志记录、工作进程等。

正如您所说,Forever对于测试是可以的,但并不真正具备用于生产的条件。

我似乎模糊地记得,在Node v0.7中可能采用了Cluster或类似的东西

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11084279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档