gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:51:50 26 4
gpt4 key购买 nike

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

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

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

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

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

部署

general consensus在部署 Node 应用程序以保持它们运行时,似乎是使用 forever 。我已经测试了 forever,当通过 npm install forever -g(全局)安装时,它似乎工作正常。不过,这需要外部协助才能在实时环境中全局安装,所以我希望它从应用程序的 node_modules 目录运行,但我无法创建一个可靠的包装器来做所以。

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

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

快速开发/更新重启

我们目前仍处于项目的开发阶段,每次我对 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 相结合的最稳定的解决方案,我真的希望任何人都已经产生了经过验证的技术。

最佳答案

结合所有收集到的知识(非常感谢 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-appstop node-app 轻松控制服务,我们使用 Ubuntu's Upstart .我将两个示例(thisthis 一个)组合成一个可以很好地完成工作的示例:

/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

因此,forevernode server.js 自动启动,该 Node 由 upstart 启动,并监控崩溃和文件更改,保持整个设置运行我们想要的时间。

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

关于用于轻松部署和更新的 Node.js 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11084279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com