Node.js设置便于部署和更新
我们目前正在为客户开发一个网站(Apache下的TYPO3),该网站由node.js/socket.io应用程序支持,该应用程序可实时更新CMS提供的内容 由于这是我们的第一个node.js项目,所以在“完美设置”方面,我没有任何最佳实践可供参考,因此我花了一些时间研究部署技术 要实现良好的设置,我还有几个问题要问:Node.js设置便于部署和更新,node.js,deployment,updates,Node.js,Deployment,Updates,我们目前正在为客户开发一个网站(Apache下的TYPO3),该网站由node.js/socket.io应用程序支持,该应用程序可实时更新CMS提供的内容 由于这是我们的第一个node.js项目,所以在“完美设置”方面,我没有任何最佳实践可供参考,因此我花了一些时间研究部署技术 要实现良好的设置,我还有几个问题要问: 便于客户部署。这一点非常重要,因为我们的网站将集成到他们的“实时”TYPO3安装中,该安装服务于大量网站,并且运行在不是由客户管理的服务器上,而是另一个(集中式)组织,该组织进行支
git
推送到实时安装上的更改时重新启动/更新
。我已经测试了forever
,当由npm install forever-g
(全局)安装时,它似乎运行良好。不过,这需要外部帮助才能在实时环境中全局安装,因此我更希望它从应用程序的node\u modules
目录运行,但我还无法创建一个可靠的包装器来实现这一点
此外,永久
工作正常,但必须手动启动。确保它在服务器启动时启动并保持运行的最佳方法是什么
- 一个简单的
脚本init.d
- 写一个看门狗包装
- 检查<代码>永久代码>状态的TYPO3计划程序任务李>
pids/**
logs/**
我们目前仍处于项目的开发阶段,每次对node.js应用程序进行更改时,我都会手动重新启动节点
或永久
。这是可行的,但还远远不够理想。
有几个较小的npm
模块,用于检查文件修改,并在检测到更改后重新启动节点
,如:
- (这不需要重新启动节点,因此可能更容易与
)永久性地结合使用
显然,在将项目移交给客户之前,我正试图找到最稳定的解决方案,该解决方案将更新重启器与
永久
相结合,我真的希望任何人都能提供一种经过验证的技术组合。在生产使用中,您最好看看类似的东西。您可能不需要集群功能,但它还包括其他生产功能,如零停机重启、日志记录、工作人员等
正如您所说,Forever对于测试来说是可以的,但是它并不真正具备生产使用所需的功能
我似乎模模糊糊地记得,集群或类似的东西可能会被应用到节点本身的v0.7中,因为我的最后一个答案是面向未来的!以下是一些其他帮助链接:
- (见幻灯片35)
- (幻灯片31至结尾)
目前似乎还没有一个完美的答案,但有很多人在运行生产节点实例。希望这将为您指明正确的方向。结合收集到的所有知识(非常感谢这些想法)和过去一周测试过的方法,我决定满足于下面描述的部署解决方案(我想我很乐意与大家分享,以帮助其他有类似问题的人): 脚本错误时自动重新启动和脚本更改时自动重新加载由处理,因为它还包括脚本监视,只要永远是从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);
这将监视应用程序目录中的所有文件的更改,并在脚本发生更改时立即重新启动在中永远运行的脚本。由于日志和pidfile位于应用程序的子目录中,因此必须从文件监视中忽略这些日志和pidfile,否则脚本将循环重新启动:
.foreverignore
pids/**
logs/**
为了使这一切在系统启动时启动,并使我们能够使用我们使用的start node app
和stop node app
轻松控制服务。
我已将两个(和一个)示例合并为一个非常好的示例:
/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
#这是个暴发户(http://upstart.ubuntu.com/)剧本
#在系统启动时运行node.js服务器并使其
#可通过以下命令进行管理:
#“启动节点应用程序”和“停止节点应用程序”
#
#此脚本将放置在/etc/init中,以便与upstart一起使用。
#
#在内部,“initctl”命令用于管理:
#initctl帮助
#initctl状态节点应用程序
#initctl重新加载节点应用程序
#initctl启动节点应用程序
说明“node.js forever server for node app”
作者“Remco Overdijk”
版本“1.0”
期望分叉
#过去是:启动时启动
#直到我们发现一些坐骑在引导时还没有准备好:
从已启动的挂载开始
停机停机
#自动重生:
重生
重生限额99 5
何恩文