- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我们目前正在为一个由 node.js/socket.io 应用程序支持的客户开发一个网站(Apache 下的 TYPO3),该应用程序为 CMS 提供的内容提供实时更新。
由于这是我们的第一个 node.js 项目,在“完美设置”方面我没有任何最佳实践可供引用,因此我花了一些时间研究部署技术。
为了实现良好的设置,我还有几个问题:
易于客户部署。这非常重要,因为我们的网站将集成到他们的“实时”TYPO3 安装中,该安装为大量网站提供服务,并且运行在不受客户管理的服务器上,而是由另一个(集中式)组织进行支持调用和服务器更改的组织过程缓慢。
应该很容易更新。 如前所述,请求重新启动和进行服务器更改是一个缓慢的过程,因此理想情况下, Node 安装应该在收到推送到服务器的更改时重新启动/更新使用 git
进行实时安装。
部署
general consensus在部署 Node 应用程序以保持它们运行时,似乎是使用 forever
。我已经测试了 forever
,当通过 npm install forever -g
(全局)安装时,它似乎工作正常。不过,这需要外部协助才能在实时环境中全局安装,所以我希望它从应用程序的 node_modules
目录运行,但我无法创建一个可靠的包装器来做所以。
此外,forever
工作正常,但必须手动启动。确保它在服务器启动时启动并继续运行的最佳方法是什么?
init.d
脚本?forever
状态的 TYPO3 调度程序任务? 快速开发/更新重启
我们目前仍处于项目的开发阶段,每次我对 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
相结合的最稳定的解决方案,我真的希望任何人都已经产生了经过验证的技术。
最佳答案
结合所有收集到的知识(非常感谢 Julian Knight 的想法)和过去一周测试的方法,我决定采用下面描述的部署解决方案(我想我很乐意分享以提供帮助其他有类似问题的人):
脚本错误时自动重启和脚本更改时自动重新加载由 forever 处理,因为它还包括一个脚本监视,只要 Forever 是从 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 一个)组合成一个可以很好地完成工作的示例:
/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以 root 身份运行 node 是不明智的,因此我们将在下周迁移到新服务器时将其更改为 exec sudo -u www-data/usr/local/bin/node
。
因此,forever
由 node server.js
自动启动,该 Node 由 upstart
启动,并监控崩溃和文件更改,保持整个设置运行我们想要的时间。
我希望这对任何人都有帮助。
关于用于轻松部署和更新的 Node.js 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11084279/
我用运行 Node node --debug app OR node --debug-brk app 它有反应 debugger listening on port 5858 Express serv
这个问题在这里已经有了答案: What is the difference between (int *i) and (int* i) in context of both C and C++? [
我有一个应用程序,它通过消息队列将数据库写入命令分派(dispatch)给工作人员(数量非常大),因此无法保证它们的接收顺序。 我有两个 Node ,例如“Account”和“Media”。在此假设的
有没有办法在调用 ts-node 时将选项传递给 Node ?我正在尝试在 Node 中使用一个实验性功能,如果它能与 ts-node 一起使用,那就太好了。 这就是我目前正在做的事情: ts-nod
我有一个容器化的Node应用程序,它在DigitalOcean服务器上运行。当我更新服务器上的应用程序时,该应用程序必须关闭一小段时间。为了能够更新应用程序并避免停机,我目前正在阅读零停机时间部署/蓝
我正在编写一个 Node.js 应用程序。我正在使用 request 和 Cheerio 加载一组 URL 并获取该网站的大量信息,现在假设我想要获取的只是标题: var urls = {"url_1
如果不弹出以下错误,我无法安装任何 Node.js 模块。错误代码引用package.json文件。如果知道为什么会发生这种情况,我们将不胜感激。 最佳答案 这些不是错误,它们只是警告。一切都应该如此
如果我运行(从我的项目目录中): supervisor javascripts/index.js 我得到:/usr/bin/env: Node :没有这样的文件或目录 如果我运行: node java
我已遵循使用 Node-Inspector 的所有步骤 但是当我打开应用程序时,我在控制台上看不到任何脚本或日志。 我的应用程序在端口 4000 上运行。我认为唯一可能发生冲突的是端口 8080 上的
我在android中使用rxjava2,有时会遇到这样的问题: Observable.fromArray( // maybe a list about photo url in SD
我目前正在使用 Node 光纤来编写同步服务器端代码。我主要通过 try-catch block 进行错误处理,但外部库或其他小部分异步代码中总是有可能发生错误。我正在考虑使用新的域功能来尝试将这些错
看起来node-debug是node-inspector周围的一个shell?分别什么时候应该使用? 最佳答案 如果您安装node-debug,您只能访问node-debug命令。 如果您安装node
我目前正在代理后面工作,该代理不允许我执行此命令的 HTTP GET 请求阶段: Node node-sass/scripts/build.js 请求阶段: gyp http GET https://
听说node js可以用在服务端。我以前用过jsp。 jsp页面内部的java代码对客户端是不可见的。如果 Node js 只是 javascript,那么它如何对客户端不可见? 最佳答案 首先,No
我正在为 Node native 插件从 node-waf 构建迁移到 node-gyp 构建系统。 node-gyp 说它支持多个目标版本,但我在使用 node-gyp 时找不到如何指定目标 Nod
给定一个 $node ,我正在尝试在以下两种输出该 $node 的方式之间做出决定。 要么 $output = theme('node', $node); 或 node_build_content($
如果package.json中的窗口A打开一个新窗口B,node-main如何访问它?这是我的代码: package.json { "main": "index.html",
我试图在我的 xml 中的特定节点 ( ) 之前插入一个注释节点。这是它的方法: function test(xmlResponse) { var parser = new DOMParse
我正在尝试做npm install wrtc使用 Node 版本 16.14.0 但这还没有完成。它在给npm error code 1所以我试图将 Node 版本更改为以前的 lts 14.19.0
当我在 Visual Studio 中运行 Node.js 应用程序时,我收到以下消息:DeprecationWarning: 'node --debug' 和 'node --debug-brk'
我是一名优秀的程序员,十分优秀!