我们目前正在为客户开发一个网站(Apache下的TYPO3),该网站由node.js/socket.io应用程序支持,该应用程序提供内容的实时更新。
由于这是我们的第一个node.js项目,当涉及到“完美设置”时,我没有任何最佳实践可供参考,所以我花了一些时间研究部署技术。
为了实现一个好的设置,我还有几个问题要问:
git
.将更改推送到实时安装程序时,节点安装应该重新启动/更新
部署
当涉及到部署节点应用程序以使其保持运行时,general consensus似乎使用forever
。我测试过forever
,当它由npm install forever -g
(全局)安装时,似乎工作得很好。不过,这需要外部帮助才能在实时环境中全局安装,所以我更喜欢从应用程序的node_modules
目录中运行它,但我还无法创建一个可靠的包装器来实现这一点。
此外,forever
运行良好,但它必须手动启动。确保它在服务器启动时启动并保持运行的最佳方法是什么?
init.d
script?forever
调度程序任务?在更新时快速开发/重新启动
我们目前仍处于项目的开发阶段,每次我对node.js应用程序进行更改时,我都会手动重新启动node
或forever
。这是可行的,但远不是理想的。有几个较小的npm
模块可以检查文件修改,并在检测到更改时重新启动node
,例如:
forever
)结合起来可能更容易
有没有人有这些方面的经验?
集群更新:为什么不直接使用?
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
相结合,我真的希望有人已经开发出了经过验证的技术组合。
发布于 2012-06-22 21:33:40
结合收集到的所有知识(非常感谢Julian Knight的想法)和在过去一周测试的方法,我决定采用下面描述的部署解决方案(我想我会很高兴与他人分享,以帮助其他有类似问题的人):
脚本错误时自动重启和脚本更改时自动重载由处理,因为它还包括脚本监视,只要从node.js脚本中产生永久。
为此,我添加了一个server.js
来启动我们实际想要运行的app.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/**
为了让所有这些都在系统启动时启动,并使我们能够使用start node-app
和stop node-app
轻松控制服务,我们使用Ubuntu's Upstart。我已经将两个示例(this和this one)组合成一个,可以很好地完成这项工作:
/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 wisely mentions in his article,以根用户身份运行node是不明智的,所以当我们下周迁移到新服务器时,我们将把它改为exec sudo -u www-data /usr/local/bin/node
。
因此,forever
由upstart
启动的node server.js
自动启动,并监视崩溃和文件更改,使整个安装程序在我们想要的时间内运行。
我希望这对任何人都有帮助。
发布于 2012-06-20 05:49:17
因为我最后的回答是面向未来的!以下是一些其他的辅助链接:
的幻灯片31
似乎还没有一个完美的答案,但有很多人在运行生产节点实例。希望这将为您指明正确的方向。
发布于 2012-06-19 04:26:54
对于生产使用,您可能会更好地使用Cluster之类的东西。您可能不需要集群功能,但它还包括其他生产功能,如零停机重新启动、日志记录、工作进程等。
正如您所说,Forever对于测试是可以的,但并不真正具备用于生产的条件。
我似乎模糊地记得,在Node v0.7中可能采用了Cluster或类似的东西
https://stackoverflow.com/questions/11084279
复制相似问题