Содержание
С ростом популярности 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) и вытягивать их напрямую с сервера. По этой теме очень советую посмотреть руководство от Артема Сапегина.