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