Быстрая настройка и простая поддержка NodeJS приложения
Под катом я поделюсь опытом нескольких дней исследований, проб и ошибок в процессе настройки 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