Быстрая настройка и простая поддержка NodeJS приложения

Содержание

Быстрая настройка и простая поддержка NodeJS приложения

С ростом популярности NodeJS в нашей команде (и в мире вообще), а так же с запуском наших первых проектов на ноде, появилась необходимость в навыках настройки и запуска сервера на виртуальном хостинге. Конечно можно было выбрать готовые PaaS решения на Heroku или на Nodejitsu, но это обычно дороже для первого запуска проекта и не очень удобно для внутренних инструментов на ноде, в виду ограничений по расширяемости.

Под катом я поделюсь опытом нескольких дней исследований, проб и ошибок в процессе настройки NodeJS проекта на Ubuntu Server. В рамках руководства, мы пройдем по следующим темам:

  • Вечный запуск процесса NodeJS аппликации и вывод на публику
  • Базовая настройка NoSQL базы данных MongoDB
  • Авто-запуск и менеджмент приложения

Введение

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

Что бы не раздувать руководство, мы начнем с момента, когда вы уже запустили Ubuntu Server и имеете NodeJS на борту. Лично я предпочитаю DigitalOcean как VPS хостинг, где за 5$ можно быстро и удобно получить нужные мощности, а так же большой набор гайдов на английском.

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

Вечный процесс

Начнем с самого простого — авто-запуск процесса при падании и удобный менеджмент NodeJS приложения. Тут нам спешит на помощь один из инструментов ранее упомянутого проекта Nodejitsu —forever.

Ставится forever как и обычная глобальная NodeJS аппликация:

$ [sudo] npm install forever -g

После чего вы можете запустить любое NodeJS приложение простой командой:

forever start app.js

И легко управлять процессом (или процессами) с помощью перечисленных команд:

forever list
forever stop app.js
forever restart app.js

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

forever start  -l /var/log/app.js.log -a app.js

Где мы определяем путь к файлу с логами приложения, и указываем параметр append для склеивания логов.

На заметку

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

Если же вы хотите запустить приложение в определенном окружении:

NODE_ENV=production forever start  -l /var/log/app.js.log -a app.js

 

Доступ из сети

Если вы запускаете веб сервер на ноде и хотите что бы он был доступен из глобальной сети, нужно лишь открыть необходимые порты. В Ubuntu Server стандартные порты (80, 8080) по умолчанию открыты, но открыть другие не составит никаких проблем:

sudo iptables -A INPUT -p tcp dport 777 -j ACCEPT

Вместо 777 поставьте номер необходимого порта.

80 порт

80 порт является стандартным для веба, но что бы запустить NodeJS процесс на этому порту, нужно запускать аппликацию от sudo, что далеко не всегда удобно и теоретически не безопасно.

Что бы принимать трафик с 80 порта на порт вашего приложения (например 8080) можно сделать простое перенаправление:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Эту команду необходимо запускать каждый раз при запуске системы, как автоматизировать этот процесс я опишу ниже в руководстве.

Немного сложней, но надежней будет настроить nginx для перенаправления портов и распределения нагрузки между несколькими демонами и серверами.

На OSx, что бы удобно заходить на приложение по прямой ссылке тоже можно настроить перенаправление с авто-настройкой при запуске системы, но уже по чуть более сложной схеме. Ранее я подготавливал небольшое руководство по упомянутой настройке OSx.

MongoDB

Чаще всего с NodeJS используют MongoDB как решение для NoSQL базы данных. Что бы установить ее на Ubuntu, следуем этим простым шагам.

Что бы включить MongoDВ как сервис, активизируя авто-запуск в том числе, вводим команду:

sudo service mongodb start

Настройки базы можно найти по этому пути /etc/mongodb.conf, там же сразу рекомендую включить авторизацию, что по умолчанию отключена:

auth=true

Это включит авторизацию для удаленных пользователей, оставив локальный доступ открытым. Что бы получить удаленные доступ к базе, можете создать пользователей в базе с любыми правами.

В качестве интерфейса для работы с базой, можно использовать Robomongo для OSx.

Авто-запуск проекта

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

Я подготовил заготовку скрипта на примере проекта DevShelf для сервиса Ubuntu. Вам останется лишь заполнить настройки:

NAME=devshelf                            # Название сервиса
SOUREC_DIR=/home/user/devshelf           # Путь до приложения
COMMAND=node                             # Команда запуска
SOURCE_NAME=app.js                       # Файл запуска приложения
USER=user                                # Пользователь от которого запускать процесс
NODE_ENVIROMENT=production               # Node environment

Логи приложения, судя по скрипту, будут доступны в директории /var/log/$NAME.log.

Поместите скрипт в директорию /etc/init.d/ с удобным именем, например /etc/init.d/app, после чего даем нужные права и прописываем в авто-загрузку:

sudo chmod a+x /etc/init.d/app
sudo update-rc.d app defaults

Теперь нам будут доступны следующие команды:

sudo service app start
sudo service app status
sudo service app restart
sudo service app stop

 

Пару слов о мониторинге и деплое

Для базового мониторинга приложения, я советую использовать сервис UptimeRobot. Ранее я пользовался только Яндекс.Метрикой, но последнее время этот сервис оповещал о падении сайтов только спустя несколько часов.

Для мониторинга нагрузки на приложение можно использовать возможности хостинга или встраивать решения в свое приложение на NodeJS.

Тема деплоя достойна отдельной статьи, самый простой и удобный способ — это держать все исходники в VCS (например Git) и вытягивать их напрямую с сервера. По этой теме очень советую посмотреть руководство от Артема Сапегина.