Node.js设置便于部署和更新

Node.js设置便于部署和更新,node.js,deployment,updates,Node.js,Deployment,Updates,我们目前正在为客户开发一个网站(Apache下的TYPO3),该网站由node.js/socket.io应用程序支持,该应用程序可实时更新CMS提供的内容 由于这是我们的第一个node.js项目,所以在“完美设置”方面,我没有任何最佳实践可供参考,因此我花了一些时间研究部署技术 要实现良好的设置,我还有几个问题要问: 便于客户部署。这一点非常重要,因为我们的网站将集成到他们的“实时”TYPO3安装中,该安装服务于大量网站,并且运行在不是由客户管理的服务器上,而是另一个(集中式)组织,该组织进行支

我们目前正在为客户开发一个网站(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
    模块,用于检查文件修改,并在检测到更改后重新启动
    节点
    ,如:

    • (这不需要重新启动节点,因此可能更容易与
      永久性地结合使用
    有没有人有这些方面的经验

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

    通过该机制提供类似的功能,但是。取而代之的不是所有这些特性,而是只提供集群。反过来又是这样。至少(这对我们来说是个问题,因为我们不能强迫客户接受另一个prereq服务)

    --


    显然,在将项目移交给客户之前,我正试图找到最稳定的解决方案,该解决方案将更新重启器与
    永久
    相结合,我真的希望任何人都能提供一种经过验证的技术组合。

    在生产使用中,您最好看看类似的东西。您可能不需要集群功能,但它还包括其他生产功能,如零停机重启、日志记录、工作人员等

    正如您所说,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
    何恩文