Node.js для упрощения развертывания и обновления

В настоящее время мы разрабатываем веб-сайт (TYPO3 под Apache) для клиента, который поддерживается приложением node.js/socket.io, которое предоставляет обновления в реальном времени для контента, поданного с CMS.

Поскольку это наш первый проект node.js, у меня нет лучшей практики, когда дело доходит до "идеальной настройки", поэтому я потратил некоторое время на исследование методов развертывания.

Несколько вопросов остаются для меня, чтобы достичь хорошей настройки, которая:

  • Легко для клиента развертывать. Это очень важно, потому что наш сайт будет интегрирован в свою "живую" установку TYPO3, которая обслуживает множество веб-сайтов и работает на серверах, которые не управляются клиентом, а другая (централизованная) организация, которая делает вызовы поддержки и изменения сервера медленный процесс.

  • Должно быть легко обновлено. Как упоминалось, запрос на перезагрузку и внесение изменений в сервер - это медленный процесс, поэтому рекомендуется, чтобы установка node должна перезапускаться/обновляться, когда она получает внесенные изменения на живую установку с помощью git.

Развертывание

Общий консенсус , по-видимому, заключается в использовании forever, когда дело доходит до развертывания приложений node, чтобы они работали. Я тестировал forever, и, похоже, он отлично работает при установке npm install forever -g (global). Для этого потребуется внешняя помощь для глобальной установки на живую среду, поэтому я предпочел бы, чтобы она выполнялась из каталога приложения node_modules, но я не смог создать сплошную оболочку для этого.

Кроме того, forever работает нормально, но его нужно запускать вручную. Каким будет наилучший подход к тому, чтобы он запускался при загрузке сервера и продолжал работать?

  • Простой init.d script?
  • Написание сторожевой обертки?
  • Задача планировщика TYPO3, которая проверяет статус forever?

Быстрая разработка/Перезагрузка при обновлении

В настоящее время мы все еще находимся на стадии разработки проекта, и каждый раз, когда я вношу изменения в приложение node.js, я вручную перезапускаю node или forever. Это работает, но далека от идеала. Существует несколько небольших модулей npm, которые проверяют изменения файлов и перезапускают node при обнаруженных изменениях, например:

Есть ли у кого-нибудь опыт с любым из них?

Обновление: почему бы вам просто не использовать кластер?

Кластерный модуль обеспечивает аналогичную функциональность с помощью reload, но не работает с node 0.5+. основной кластерный модуль (Node 0.6+), который заменил его, не имеет всех этих функций, но обеспечивает кластеризацию. Что, в свою очередь, не очень хорошо работает с socket.io. По крайней мере не без использования Redis (это проблема для нас, потому что мы не можем заставить другую службу prereq для клиента).

-

Очевидно, я пытаюсь найти наиболее стабильное решение, которое объединяет обновление-restarter с forever, прежде чем передать проект клиенту, и я действительно надеюсь, что кто-то произведет проверенную комбинацию методов.

Ответ 1

Объединив все собранные знания (большое спасибо Джулиану Найту за идеи) и методы, проверенные на прошлой неделе, я решил согласиться на описанное решение для развертывания ниже (я думал, что было бы приятно поделиться, чтобы помочь другим с сопоставимыми вопросами):

Автоматическое перезапуск при script ошибках и автоматическая перезагрузка при изменениях script обрабатывается forever, так как он также содержит часы script, если Forever создается из node.js script.

Чтобы сделать это, я добавил server.js для запуска app.js script, который мы действительно хотим запустить:

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);

Это отслеживает все файлы в каталоге приложения для изменений и перезапускает script, работающий в forever, как только он изменяется. Поскольку журналы и pidfile находятся в подкаталогах приложения, их следует игнорировать из файла просмотра или перезапустить цикл script:

.foreverignore

pids/**
logs/**

Чтобы все это началось при загрузке системы и позволило нам легко управлять сервисом с помощью start node-app и stop node-app, мы используем Ubuntu Upstart. Я объединил два примера (this и this один) в один, который хорошо выполняет работу:

/и т.д./инициализации/ 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 <[email protected]>"
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

Как Кевин мудро упоминает в своей статье, неразумно запускать node как root, поэтому мы изменим его на exec sudo -u www-data /usr/local/bin/node когда мы перейдем на новые серверы на следующей неделе.

Итак, forever запускается автоматически с помощью node server.js, который запускается при помощи upstart, и отслеживает сбои и изменения файлов, сохраняя всю работу установки до тех пор, пока мы хотим.

Надеюсь, это поможет кому угодно.

Ответ 2

Поскольку мой последний ответ на будущее! Вот несколько других ссылок, которые помогут:

Там пока нет идеального ответа, но есть много людей, которые запускают производственные экземпляры Node. Надеемся, это укажет вам в правильном направлении.

Ответ 3

Вам может быть лучше, для использования в производстве, посмотреть на что-то вроде Cluster. Возможно, вам не нужны функции кластера, но также включают в себя другие производственные функции, такие как перезапуск с нулевым временем простоя, протоколирование, рабочие и т.д.

Как вы говорите, Forever подходит для тестирования, но на самом деле не имеет того, что требуется для использования в производстве.

Я, кажется, смутно помню, что кластер или что-то подобное может быть принято в Node сам прийти v0.7