Узел.установка js для легкого развертывания и обновления
в настоящее время мы разрабатываем веб-сайт (TYPO3 под Apache) для клиента, который поддерживается приложением node.js/socket.io, которое предоставляет обновления в реальном времени для контента, подаваемого с CMS.
как это наш первый узел.JS project у меня нет никаких лучших практик, когда дело доходит до "идеальной настройки", поэтому я потратил некоторое время на изучение методов развертывания.
несколько вопросов остаются для меня, чтобы добиться хорошей настройки который:
легко для клиента, чтобы развернуть. Это очень важно, потому что наш сайт будет интегрирован в их "живую" установку TYPO3, которая обслуживает множество веб-сайтов и работает на серверах, которые не управляются клиентом, но другой (централизованной) организацией, которая делает вызовы поддержки и серверные изменения медленным процессом.
должно быть легко обновить. как уже упоминалось запрос перезагрузки и внесение изменений в сервер-это медленный процесс, поэтому в идеале установка узла должна перезапускаться / обновляться, когда она получает изменения, которые передаются в live installion с помощью
git.
развертывание
общий консенсус, кажется, использовать forever когда дело доходит до развертывания приложений узла, чтобы они продолжали работать. Я проверил forever, и это, кажется, работает нормально при установке npm install forever -g (глобальный). Этот однако потребуется внешняя помощь для глобальной установки в живой среде, поэтому я бы предпочел, чтобы она работала из приложения node_modules каталог, но я не смог создать твердую оболочку, чтобы сделать это.
кроме того, forever работает нормально, но он должен быть запущен вручную. Что бы быть лучший подход, чтобы убедиться, что он запускается при загрузке сервера и продолжает работать?
- простой
init.dсценарий? - написание a сторожевая обертка?
- задача планировщика TYPO3, которая проверяет
foreverстатус?
быстрое развитие / перезапуск при обновлении
в настоящее время мы все еще находимся на стадии разработки проекта и каждый раз, когда я делаю изменения в узле.JS приложение я вручную перезапустить node или forever. Это работает, но далеко не идеально.
Есть несколько меньших npm модули, которые проверяют изменения файлов и перезапускают node по обнаруженные изменения, например:
- Nodemon
- узел.Яш руководитель
- отскок
Узелки (который не требует перезапуска узла, так что может быть проще объединить сforever)
до
есть ли у кого-нибудь опыт работы с любым из них?
обновление: почему бы вам просто не использовать Кластер?
The модуль кластера обеспечивает аналогичную функциональность через перезагрузка механизм, но не работает с узлом 0.5+. Элемент модуль кластера ядра (узел 0.6+) который заменил его, не имеет всех этих функций, а только обеспечивает кластеризацию. Что, в свою очередь не очень хорошо играет с socket.io по крайней мере, не без использования Redis (что является проблемой для нас, потому что мы не можем заставить другого предварительное обслуживание клиента).
--
очевидно, я пытаюсь найти наиболее стабильное решение, которое сочетает в себе обновление-рестартеры с forever прежде чем передать проект заказчику, и я действительно надеюсь, что кто-то произвел проверенную комбинацию методов.
3 ответов:
объединение всех собранных знаний (большое спасибо Джулиан Найт для идей) и методов, протестированных на прошлой неделе, я решил согласиться на решение для развертывания, описанное ниже (я подумал, что было бы неплохо поделиться, чтобы помочь другим с аналогичными вопросами):
автоматический перезапуск при ошибках скрипта и автоматическая перезагрузка при изменении скрипта обрабатывается навсегда, так как он также включает в себя скрипт смотреть, как долго, как навсегда выметывается в узел.JS скрипт.
для этого, я добавил
server.jsзапуститьapp.jsскрипт мы хотим запустить:сервер.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. Я объединил два примера (этой и этой один) в тот, который делает работу довольно хорошо:/ 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 <[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как Кевин мудро упоминает в своей статье это неразумно, чтобы запустить узел в качестве корня, так что мы изменим, что до
exec sudo -u www-data /usr/local/bin/nodeкогда мы перейдем на новые серверы на следующей неделе.и
foreverзапускается автоматическиnode server.jsкоторый запускается поupstart, и мониторы для сбоев и изменений файлов, сохраняя всю установку работает до тех пор, как мы хотим.я надеюсь, что это помогает любому.
Так как мой последний ответ на будущее! Вот некоторые другие ссылки, чтобы помочь:
- https://serverfault.com/questions/274857/how-to-use-node-js-as-a-production-web-server
- http://www.slideshare.net/the_undefined/nodejs-best-practices-10428790 (см. слайд 35)
- http://www.slideshare.net/the_undefined/nodejs-in-production (слайды 31 до конца)
- когда узел.js идет вниз, как я могу вернуть его автоматически?
кажется, что еще нет идеального ответа, но есть много людей, работающих с экземплярами производственного узла. Надеюсь, это укажет вам в правильном направлении.
вы могли бы быть лучше, для производственного использования, чтобы смотреть на что-то вроде кластер. Возможно, Вам не нужны функции кластера, но он также включает в себя другие производственные функции, такие как перезапуск нулевого времени простоя, ведение журнала, рабочие и т. д.
Как вы говорите, Forever подходит для тестирования, но на самом деле не имеет того, что требуется для использования в производстве.
Я, кажется, смутно помню, что кластер или что-то подобное может быть принято в сам узел come v0.7
Comments