Запуск Node.JS приложений при старте сервера

    Общий рейтинг статьи: 0 (проголосовало 0 )
    Опубликовано:  [просмотров 318]


    На этапе разработки, Node.JS приложение обычно запускается вручную, а сегодня мы рассмотрим как решить проблему автоматического запуска приложения при старте сервера.

    Обычно для запуска такого типа приложений используется команда:

    # npm run start

    В файле package.json прописаны команды запуска для различных вариантов старта и моем случае имеются типы запуска:

    "start": "node index.js | ./node_modules/.bin/bunyan -o short",
    "dev": "nodemon index.js | ./node_modules/.bin/bunyan -o short",
    "data": "node index.js data"

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

    Для автоматического запуска специализированных WEB-приложений таких как Django и Node.JS существует несколько подходов и сегодня мы рассмотрим один из наиболее распространенных с использованием демона Supervisor.

    Для установки пакета приложения в Ubuntu Linux используется команда:

    # aptitude install supervisor

    Supervisor - это система для контроля состояния процессов и основным ее назначением является запускать заданные конфигурацией процессы и отслеживать их состояние. Каждое запускаемое приложение (не обязательно web-приложение) описывается или в центральном конфигурационном файле /etc/supervisor/supervisord.conf или в виде отдельных файлов с расширением .conf в каталоге /etc/supervisor/conf.d/, причем второй способ предпочтительнее.

    Мы рассмотрим в качестве примера конфигурационный файл для запуска Node.JS-приложения от имени пользователя user в его домашнем каталоге.

    Файл расположен в файле /etc/supervisor/conf.d/tracking-server.conf и содержит следующие записи:

    command=node /home/user/tracking-server/index.js | /home/user/tracking-server/node_modules/.bin/bunyan -o short
    autostart=true
    autorestart=true
    environment=
    stderr_logfile=/var/log/tracking-server.err.log
    stdout_logfile=/var/log/tracking-server.out.log
    user=user

    Параметр command содержит команду запуска из файла package.json, а остальные параметры понятны из без особых объяснений:

    • command - команда запуска
    • autostart - активируем автозапуск
    • autorestart - автоматический перезапуск при "падении" приложения
    • environment - параметры переменных окружения (если используются, например NODE_ENV=production)
    • stderr_logfile - файл вывода лога ошибок
    • stdout_logfile - основной файл вывода консольных сообщений
    • user - пользователь от имени которого приложение запускается

    Для управления демоном supervisor используется команда supervisorctl и у нее очень много параметров (о которых вы можете почитать в инструкции), а нас сейчас интересует как перезапустить одно приложение.

    Для перезапуска описанного в конфигурационном файле приложения используется команда:

    # supervisorctl restart tracking-server

    Команда не может быть выполнена от имени непривелигированного пользователя и вам придется добавить исключение в правила sudo для запуска этой команды пользователем user.

    Для добавления резрешения пользователю на выполнение одной команды sudo с строго определенными параметрами без ввода пароля используется следующая запись в файле /etc/sudoers:

    user ALL=(root) NOPASSWD:/usr/bin/supervisorctl restart tracking-server

    Обратите внимание, что путь к supervisorctl указывается полностью и так же полностью указываются разрешенные аргументы. Теперь вы можете строить скрипты автоматизации любой сложности не предоставляя разработчиками полноценного root или sudo доступа к серверу.

    Собственно на этом все, ваше приложение работает и в случае сбоя будет перезапускаться.


    Связанные записи в блоге

    Обсуждение статьи

    Ваш комментарий: