Подтвердить что ты не робот

Настройка Node.js в Webfaction

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

4b9b3361

Ответ 1

Введение

Результатом следующих инструкций является приложение Node.js, которое работает непрерывно, создает лог файлы и перезагружается даже после перезагрузки серверной машины. Инструкции особенно ориентированы на общие учетные записи хоста на Webfaction, но могут также использоваться для общего назначения.

Установить Node.js

Eventough Node.js страница загрузки предлагает двоичные файлы Linux, было бы более надежно устанавливать Node.js из исходного кода. Загрузите самые последние исходные коды и извлеките их в ~/src/.

(log in to your webfaction console)
> mkdir -p ~/src/
> cd src/
> wget http://nodejs.org/dist/v0.10.18/node-v0.10.18.tar.gz
> tar -xzf node-v0.10.18.tar.gz

Следующим шагом является компиляция и установка кода. Для этого используется Python. Поскольку версия по умолчанию python равна 2.4 (по крайней мере, на моем сервере Webfaction web223), а поскольку для установки Node.js требуется одна из версий 2.6+, вы должны временно установить более новую версию по умолчанию. См. Следующий фрагмент (также см. в этой статье). Примечание --prefix=$HOME, который требуется из-за ограничений среды Webfaction (у вас есть доступ только к домашнему каталогу).

> cd node-v0.10.18/
> alias python=python2.7
> python configure --prefix=$HOME
> make
> make install

Node.js. Проверьте успешность

> node -v
v0.10.18

Это также установил менеджер пакетов node npm.

> npm -v
1.3.8

Установить Forever

Чтобы запустить run Node.js приложение, работающее как можно дольше и регистрируя вывод для обслуживания, вам нужно Forever. Для удобства установите его глобально (для вас) с помощью флага -g.

> cd ~
> npm install -g forever
> forever --version
v0.10.8

Вы можете позже обновить

> npm update -g forever

Запустите приложение

Сначала создайте собственное приложение через Панель управления Webfaction (Пользовательское приложение (прослушивание на порту)). Назовите его, например, foonode. Вы также можете создать домен и веб-сайт для приложения.

Во-вторых, обратите внимание на номер порта сокета, который был указан для приложения Webfaction. Пусть пример будет 48888.

В-третьих, скопируйте свой код приложения в каталог приложения i.e. ~/webapps/foonode/. После этого содержимое каталога будет, например, следующим.

> cd ~/webapps/foonode/
> ls
node_modules/
index.js

Index.js будет похож на фрагмент ниже. Ключевым моментом является использование данного номера порта для приложения.

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello Universe.\n');
}).listen(48888, '127.0.0.1');
console.log('Listening at http://127.0.0.1:48888/');

Теперь вы можете запустить приложение node index.js. Однако есть проблема: когда вы выходите из оболочки, приложение также выходит. Поэтому вы должны запустить Node.js как демон. Это то, что Forever делает для вас многое. Начать node с навсегда:

> cd ~/webapps/foonode/
> forever start index.js

Теперь приложение продолжает работать после выхода из системы и, как очень хорошая вещь, быстро перезапускается, если произойдет сбой. Это много, но все еще недостаточно. Что делать, если сервер перезагружается? Где идет выход из приложения? Что делать, если script постоянно падает? Что делать, если у вас несколько сценариев с именем index.js? Продолжайте читать.

Использовать абсолютные пути с Forever

Forever идентифицирует процесс по имени файла script, поданному на forever start <filename_of_script>. Проблема возникает, когда у вас есть несколько приложений с тем же именем файла для script.

Например, у вас есть два приложения /home/foouser/webapps/foonode/index.js и /home/foouser/webapps/barnode/index.js. Если теперь вы запускаете оба с forever start index.js в каталогах приложений, а затем запустите forever stop index.js только один раз, результатом будет то, что приложения оба будут остановлены. Это происходит потому, что они оба имеют одинаковые идентификаторы index.js

Решение заключается в использовании абсолютных путей к файлам при указании script.

> forever start /home/foouser/webapps/foonode/index.js

И остановить выполнение:

> forever stop /home/foouser/webapps/foonode/index.js

Это гарантирует, что только остановленное приложение будет остановлено. Эта привычка использовать абсолютные пути также положительно влияет на forever list. Подробнее см. эту проблему.

Вход

Чтобы сохранить вывод приложения где-нибудь, укажите следующие аргументы.

-l <logfile>  = stream all output to this file. Relative to ~/.forever/
-o <logfile>  = stream script stdout to this file. Relative to current dir.
-e <logfile>  = stream script stderr to this file. Relative to current dir.
-a  = append to the files instead of overwriting them.

Кажется удобным иметь подкаталог для журналов, например. logs/. С аргументами, абсолютный путь и журнал подкаталогов/команда становятся следующими:

> cd ~/webapps/foonode/
> mkdir -p logs/
> forever start -a -l forever.log -o logs/out.log -e logs/err.log /home/foouser/webapps/foonode/index.js

Обнаружение и перезапуск процесса скручивания

Навсегда есть параметры --minUptime и --spinSleepTime, которые в настоящее время не так хорошо документированы. Смысл параметров заключается в том, чтобы контролировать ситуацию, когда script аварийно завершает работу и почти сразу же после сбоя снова падает. Поскольку навсегда пытается перезапустить script как можно скорее после сбоя, это может привести к циклу занятости, который может съесть много ресурсов сервера.

--minUptime указывает количество миллисекунд, которое должно быть запущено и запущено script без сбоев, которые необходимо перезапустить немедленно. Если время безотказной работы script меньше minUptime, то script считается вращающимся, то есть проблематичным. Если время безотказной работы больше, то script считается неоткручивающим.

Если крутится script, т.е. время безотказной работы script меньше, чем --minUptime, то навсегда ждет --spinSleepTime числа миллисекунд перед перезапуском script. В противном случае script перезапускается как можно скорее. Это предотвращает цикл питания. См. этот ответ для дальнейшего обсуждения.

Я лично использую 5000 для --minUptime, чтобы убедиться, что node полностью запущен, прежде чем объявлять его неоткручивающим. 2000 был бы хорошим для --spinSleepTime, чтобы избежать цикла, но все же пытается быстро запустить script после устранения проблемной ситуации.

> forever start -a -l forever.log -o logs/out.log -e logs/err.log --minUptime=5000 --spinSleepTime=2000 /home/foouser/webapps/foonode/index.js

Управление приложением

По мере того как команды растут, запоминание и запись их становится все более громоздким. Поэтому их удобно скопировать в Makefile. Makefile также будет полезен позже, когда вам нужно указать команду для запуска после перезагрузки сервера.

> cd ~/webapps/foonode/
> cat Makefile

foreverstart:
    # Run server forever (until reboot)
    mkdir -p logs
    forever start -a -l forever.log -o logs/out.log -e logs/err.log --minUptime 5000 --spinSleepTime 2000 /home/foouser/webapps/foonode/index.js

foreverstop:
    forever stop /home/foouser/webapps/foonode/index.js

Сохранение выполняемого приложения

Forever не распространяется на случай перезагрузки сервера. Для этого вам нужно указать cronjob с правилом @reboot, которое запускается навсегда после перезагрузки.

> export EDITOR=nano   # Editor to use to edit crontab. A matter of taste.
> crontab -e

Добавьте следующую строку и сохраните.

@reboot make -C ~/webapps/foonode/ -f ~/webapps/foonode/Makefile foreverstart

Линия гарантирует, что foonode запускается сразу после перезагрузки сервера. Флаг -C указывает каталог для запуска makefile from и -f фактическое местоположение файла makefile. Подробнее об использовании @reboot см. .

Заключение

Теперь у вас есть процесс node, работающий действительно навсегда или, по крайней мере, до тех пор, пока есть те, кто обслуживает тех, кто питает сервер электричеством. Многое сделано, но, возможно, больше придет. Вещи, которые вы, возможно, хотели бы сделать в будущем, которые не были охвачены здесь, включают следующее.

  • Просмотр изменений файла и автоматического перезапуска при обнаружении (см. --watch в forever --help)
  • Использование Grunt.js вместо Make (см. bustardcelly/grunt-forever)
  • Резервное копирование приложения раз в то время.

См. также

Любые идеи, комментарии или исправления?

Ответ 2

Ну, вы, наверное, уже следовали всем шагам в другом ответе (ничего себе! таких деталей! отлично), но теперь стало намного проще: они теперь установите установщик с одним щелчком мыши для node.js.