Как запустить node js приложение на linux
Node.js – это платформа JavaScript для программирования общего назначения, которая позволяет быстро создавать сетевые приложения. Данная платформа работает на Linux, macOS, FreeBSD и Windows. Приложения Node.js можно запускать в командной строке, но данный мануал продемонстрирует, как запустить его как сервис (в таком случае приложение сможет автоматически перезагружаться вместе с сервером или при сбое и будет безопасно работать в производственной среде).
Требования
1: Установка Node.js
Для начала нужно установить Node.js при помощи архива NodeSource.
Установите PPA в домашний каталог, чтобы получить доступ к его содержимому. Используйте curl, чтобы извлечь установочный скрипт необходимой версии (укажите её вместо 8.x ):
Чтобы просмотреть содержимое скрипта, введите:
sudo bash nodesource_setup.sh
Архив PPA будет добавлен в настройки. Индекс пакетов обновится автоматически. После запуска установочного сценария nodesource можно установить пакет Node.js:
sudo apt install nodejs
Чтобы проверить версию Node.js, введите:
Примечание: При установке Node.js из архива PPA бинарный файл, как правило, называется nodejs, а не node.
Пакет nodejs содержит бинарный файл nodejs и npm (потому вам не придётся устанавливать npm отдельно).
Для отслеживания обновлений npm использует конфигурационный файл в домашнем каталоге. Он создается при первом запуске npm. Запустите эту команду, чтобы убедиться, что npm установлен и файл на месте:
Для работы некоторых компонентов npm (компилирующих исходный код и т.п.) необходим пакет build-essential:
sudo apt-get install build-essential
Теперь можно приступать к созданию приложения.
2: Создание приложения Node.js
Примечание: Копируя код, не забудьте указать свой IP-адрес вместо условных данных.
Создайте файл приложения Node.js и откройте его в текстовом редакторе (здесь файл называется hello.js):
Вставьте в него такой код:
Сохраните и закройте файл.
Чтобы протестировать приложение, введите:
Примечание: Запуская Node.js таким образом, вы блокируете дополнительные команды. Команды будут доступны после остановки приложения (Ctrl-C).
Чтобы протестировать приложение, откройте новый терминал и подключитесь к localhost с помощью curl:
Если на экране появился следующий вывод, приложение работает правильно:
Если такой вывод не появился, убедитесь, что приложение Node.js запущено и правильно настроено (слушает правильный адрес и порт).
Остановите приложение, нажав Ctrl+C.
3: Установка PM2
Теперь нужно установить PM2. Это менеджер процессов Node.js. PM2 предоставляет простой способ управления и демонизации приложений.
Установку можно выполнить при помощи пакетного менеджера npm.
sudo npm install pm2@latest -g
При помощи опции –g менеджер npm выполнит глобальную установку PM2.
Менеджер процессов PM2 очень прост в использовании. Рассмотрим основы его работы.
Для запуска приложений в фоновом режиме используется команда pm2 start:
pm2 start hello.js
Также эта команда добавит приложение в список процессов PM2, который выводится на экран при запуске каждого приложения:
[PM2] Spawning PM2 daemon with pm2_home=/home/8host/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /home/8host/hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│ hello │ 0 │ fork │ 1338 │ online │ 0 │ 0s │ 0% │ 23.0 MB │ 8host │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
Как видите, PM2 автоматически устанавливает App name (имя файла без расширения .js) и PM2 id. Также PM2 предоставляет другую информацию: PID процесса, текущее состояние, использование памяти.
Запущенное с помощью PM2 приложение будет автоматически перезапускаться в случае ошибок или сбоев, однако автозагрузку приложения нужно настроить отдельно. Для этого существует подкоманда startup. Эта команда генерирует и настраивает сценарий запуска менеджера PM2 и всех его процессов вместе с загрузкой сервера.
pm2 startup systemd
В последней строке вывода находится команда, которую нужно запустить с привилегиями суперпользователя, чтобы добавить PM2 в автозагрузку:
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u 8host --hp /home/8host
Запустите сгенерированную команду, чтобы настроить автозапуск PM2.
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u 8host --hp /home/8host
Также можно сохранить процесс PM2 и соответствующую среду.
Эта команда создаст unit-файл для systemd, запускающий pm2 при запуске сервера. Менеджер pm2, в свою очередь, запустит приложение hello.js. Проверьте состояние юнита systemd:
systemctl status pm2-8host
PM2 предоставляет множество других функций, которые позволяют управлять или просматривать информацию о приложениях. Запуск PM2 без каких-либо аргументов отобразит страницу справки, на которой можно найти подробные примеры использования PM2.
Остановить приложение можно при помощи:
pm2 stop app_name_or_id
Чтобы перезапустить приложение, введите:
pm2 restart app_name_or_id
Список приложений, управляемых PM2, можно просмотреть при помощи следующей подкоманды:
Подробную информацию о конкретном приложении можно получить с помощью подкоманды info, указав имя приложения:
pm2 info app_name
Подкоманда monit показывает данные процесса PM2: состояние приложения, использование CPU и памяти:
Теперь нужно настроить обратный прокси.
4: Nginx как обратный прокси-сервер
Итак, приложение запущено и прослушивает localhost. Теперь нужно настроить доступ к нему. Установите Nginx как обратный прокси-сервер.
В блоке server найдите блок location /. Замените его содержимое следующими конфигурациями. Если ваше приложение прослушивает другой порт, укажите его.
В данной статье я рассмотрю вопрос развертывания с нуля Nuxt.js-проекта (либо любого другого проекта на Node.js) на VDS-сервере с использованием веб-сервера Apahce2, Node.js, менеджера процессов pm2 с полным циклом установки всех компонентов.
Установка будет производится на чистом VDS-сервере, не имеющем каких-либо настроек.
Содержание статьи
Шаг 1. Подключаемся по SSH к VDS
Для подключения к VDS-серверу по SSH более не требуется скачивать и устанавливать какие-либо дополнительные программы, так как в Windows PowerShell на ОС Windows 10 последних версий уже встроен клиент OpenSSH.
Я же буду использовать приложение Windows Terminal, скачать которое можно в Microsoft Store (разработчик Windows Terminal - сами Microsoft).
В данной инструкции в качестве операционной системы на сервере мы будем использовать Ubuntu Server 20.04
Итак, подключаемся к серверу при помощи следующей команды:
Вместо root вы должны указать своего пользователя, который у Вас был выдан при создании сервера.
Вместо IP-адреса также можно использовать и FQDN-адрес сервера, если вы уже прописали DNS A-запись на Вашем домене со значением Вашего IP-адреса сервера.
Команда подключения к серверу по SSH
При успешном логине Вы увидите уже терминал (консоль) сервера:
Терминал Ubuntu Server
Как видим, мы подключены к удаленному серверу.
Шаг 2. Добавление репозитория Apache2 на сервер и установка веб-сервера
В данной инструкции мы будем устанавливать веб-сервер Apache2 из официального репозитория, так как в репозитории Ubuntu не всегда последняя версия веб-сервера Apache2.
Для начала установим необходимые пакеты командой:
Команда установки необходимого пакета
Если данный пакет уже установлен, то вы увидите следующее:
Необходимый пакет уже установлен
После установки необходимых пакетов добавляем официальный репозиторий Apache2 следующей командой:
При добавлении репозитория, в терминале появится вопрос, на который необходимо нажать клавишу Enter:
Подтверждение добавления репозитория
После добавления репозитория, производим установку самого веб-сервера Apache2:
В терминале появится вопрос о подтверждении установки веб-сервера Apache2. Если согласны с установкой - смело нажимайте клавишу Enter.
Теперь можно перейти по IP-адресу, либо по FQDN-адресу вашего сервера и убедиться, что веб-сервер Apache2 успешно установлен.
Примечание. Порты 80 и 443 на вашей виртуальной машине должны быть открыты. Если есть управляемый файерволл в панели управления вашего сервера на хостинге - обязательно проверьте!
Успешная установка Apache2
Шаг 3. Установка менеджера версий Node.js (nvm) и самого Node.js
Для установки и более удобного дальнейшего контроля версий NodeJS мы установки менеджер версии NodeJS. Пакет называется nvm.
И перейдем в раздел Installing and Updating и выберем один их способов установки скрипта. Я выберу второй через утилиту wget:
Раздел установки и обновления скрипта NVM в официальном репозитории на GitHub
Копируем команду и вставляем ее в терминал сервера:
Команда установки NVM в терминале
И жмем клавишу Enter
После установки перезагружаем сервер при помощи кнопки перезагрузки в панели управления сервером, либо через команду в терминале init 6
Примечание. Вместо перезапуска сервера можно переподключиться к нему по SSH так, как указано в шаге 1.
Автоматическое отключение от сервера после применения команды перезагрузки
После перезагрузки снова подключаемся к серверу согласно шагу 1.
Запускаем команду nvm для того, чтобы посмотреть и ознакомится со списком команд скрипта. Находим команду установки NodeJS в версии LTS:
Команда установки NodeJS LTS-версии
Пакет NVM поможет вам "в 2 клика" поддерживать всегда актуальную версию Node.js
Вводим эту команду в терминал и жмем клавишу Enter:
Успешная установка NodeJS через менеджер NVM
Проверяем установленную версию Node.js следующей командой:
Установленная версия NodeJS
Шаг 4. Установка менеджера процессов pm2
Для того, чтобы управлять процессами и приложениями, запущенными в среде Node.js, а также автоматического их запуска после перезагрузки сервера, нам понадобится менеджер процессов Node.js, который мы установим глобально в систему через пакетный менеджер npm. Пакет называется pm2:
При успешной установке мы увидим следующее:
Успешная установка пакета pm2
При помощи команды pm2 -h можно посмотреть список доступных команд
Шаг 5. Запуск Node.js-приложения (в нашем случае - Nuxt.js-приложения)
Я создам новое приложение на Nuxt.js для демонстрации работы. Можно запустить таким же образом любое Node.js-приложение, как новое, только что созданное, так и уже готовое приложение.
Примечание. Установку Nuxt.js описывать не буду, так как приложение новое и установка стандартная. Она написана на официальном сайте проекта, у которого есть русская версия документации
Nuxt.js проект по-умолчанию запускается в двух режимах:
В режиме разработки - npm run dev
В режиме продакшена - npm run start
Есть еще режим static, который запускается через команду npm run generate . Но я его рассматривать не буду, так как он не используется для постоянного запуска приложения через Node.js
Я же не буду сразу запускать это приложение одной из этих команд, а сразу воспользуюсь менеджером pm2
Для этого перейдем в папку с проектом и запустим команду инициализации менеджера pm2:
pm2 сообщает об успешной генерации файла экосистемы
Открываем файл ecosystem.config.js прямо в терминале через редактор nano командой и удаляем все содержимое:
Пустой файл ecosystem.config.js с удаленными стандартными значениями
Вставляем туда следующее содержимое и сохраняем комбинацией клавиш Ctrl+O, затем жмем Enter:
Для запуска dev-версии используем команду следующую команду:
Для запуска prod-версии:
Я, для примера, запущу Dev-версию:
Запущена dev-версия NuxtJS-приложения через pm2
Для последующей остановки/запуска приложения не нужно будет заходить в папку с проектом и запускать командой выше. Достаточно будет ввести название приложения из монитора pm2:
для запуска, либо
для остановки приложения.
Для просмотра всех запущенных NodeJS-приложений посредством pm2 небходимо ввести в терминал следующую команду:
Статус-панель pm2
Для просмотра монитора процессов:
Моинтор pm2
Подключаем автоматический запуск приложений через pm2 после перезагрузки сервера:
и сохраняем изменения:
Запуск автозагрузки и сохранение параметров
[Дополнительно] Графический интерфейс pm2 вне терминала
Для запуска веб-интерфейса управления процессами pm2 необходимо зарегистрироваться на сайте pm2.io и создать Bucket.
Будем считать, что есть существующий аккаунт и Bucket (инструкцию можно почитать на оф. сайте pm2).
Вводим команду для подключения к веб-интерфейсу:
На первом этапе pm2 спросит, есть ли у Вас аккаунт pm2.io (в нашем случае есть и мы вводим букву y и жмем клавишу Enter
Есть ли аккаунт pm2.io?
Вводим ваш email и пароль от аккаунта.
Если все введено верно, то pm2 попросит Вас выбрать, к какому Bucket подключиться - выбирайте ранее созданный. У меня это TestBucket
Выбор Bucket для подключения приложения к веб-интерфейсу pm2
При успешном подключении к Bucket в веб-интерфейсе pm2 появится Ваше приложение(процесс). Там вы сможете посмотреть статистику, сбросить монитор и перезагрузить приложение:
Веб-интерфейс pm2
Далее нам необходимо повторно добавить в автозагрузку pm2 и сохранить изменения:
Перезапуск автозагрузки pm2 и сохранение параметров
Шаг 6. Проксирование Node.js-приложения через Apache2 Proxy
У нас уже запущено приложение на Nuxt.js на порту 3000 (по-умолчанию)
Для этого установим и включим модуль Apache2 Proxy:
И перезагрузим веб-сервер командой:
Переходим в папку с виртуальными хостами Apache2 командой:
и дублируем дефолтный файл конфигурации виртуального хоста Apache2:
Открываем файл ваш_домен.conf с помощью редактора nano. Изменяем на Ваши следующие значения:
ServerAdmin: webmaster@localhost меняем на Ваш email
Затем, чтобы проксировать наше приложение на этот адрес, нам необходимо добавить следующие строки:
Где :3000 - Ваш порт приложения
Сохраняем изменения комбинацией клавиш Ctrl+O и жмем Enter. Выходим из редактора комбинацией Ctrl+Z
Проксирование 3000 порта
Теперь можно включить виртуальный хост и перезагрузить веб-сервер*:
* В команде a2ensite ваш_домен не обязательно указывать расширение конфигурационного файла
Как видим - приложение успешно открывается на необходимом нам адресе и стандартном порту веб-сервера Apache2
Шаг 7. Тестирование работы pm2
Теперь необходимо проверить, срабатывает ли автоматический запуск приложений менеджером pm2 после перезагрузки сервера.
Для этого в терминале пропишем команду init 6 , либо перезагрузим сервер в панели управления хостингом.
Если Вы все сделали правильно и согласно инструкции - приложение на Node.js автоматически запустится на вашем адресе в течение минуты после запуска VDS-сервера.
Заключение
В данном материале я рассмотрел подробно установку веб-сервера Apache2, установку менеджера версий Node.js - пакета NVM и установку самого Node.js через этот менеджер, запуск Node.js-приложения на примере приложения на Vue.js-фреймворке - Nuxt.js, автоматический запуск этого приложения после перезагрузки сервера с помощью менеджера процессов pm2 и проксирование приложения на определенный адрес.
Старался объединить несколько инструкций в одну на своем личном опыте, когда еще только начинал работать с этими инструментами.
Возможно, более удобный (или правильный?) способ запуска будет через Docker и NGINX. Но в данной статье я показал базовый пример запуска.
Серверные приложения, написанные, к примеру, на nodejs или на python, держат всегда запущенными. Если приложение вдруг упало, нужно его переподнять.
Кто-то запускает приложения через supervisor (написан на python) или pm2 (nodejs) - это такие демоны как раз для запуска приложений. Но на вашем сервере скорее всего уже есть systemd, который тоже умеет это делать. Зачем тогда устанавливать и настраивать supervisor или pm2?
Я не говорю о больших энтерпрайз-решениях, там свои инструменты для таких задач. Я говорю о небольших или хобби-проектах.
Рассмотрю запуск nodejs-приложения через systemd. Расскажу про перезапуск, ограничение прав и сбор логов.
Для примера попробую запустить такое приложение, написанное на nodejs:
Этот скрипт запускает веб-сервер. Он слушает порт, который задан в переменной окружения MYAPP_PORT . Запущу приложение, чтобы проверить:
Приложение на все гет-запросы отвечает «200 OK»:
На пост-запросы отвечает «405 Method Not Allowed»:
И при запросе /kill вообще умирает:
Сервис-юнит
Systemd оперирует понятиями юнитов. Юнитом может быть процесс-демон, устройство, или даже список других юнитов. В руководстве man systemd в секции «Concepts» описано, какие есть типы юнитов, и для чего они нужны.
Мне понадобится самый первый — Service unit. Он позволяет запустить процесс в режиме демона и перезапускать процесс, если он упал. В руководстве man systemd.unit описано, как писать юниты в целом, а в man systemd.service — как писать сервис-юниты.
Файлы своих юнитов нужно класть в /etc/systemd/system/ . Я назову свой /etc/systemd/system/myapp.service . Минимальная конфигурация для сервиса может быть такая:
В поле Environment нужные приложению переменные окружения. В ExecStart команда для запуска приложения. /usr/local/bin/node — это полный путь к nodejs, его можно узнать командой:
А /usr/local/www/myapp/index.js — полный путь к моему приложению.
Пробую запустить сервис:
Ну типа работает. Дёрну курлом, чтобы проверить:
Автоматический перезапуск
Если приложение по какой-то причине умрёт, то оно не поднимется. Вот я дёргаю убивающий эндпойнт:
И проверяю статус приложения:
Чтобы systemd переподнимал упавшее приложение, нужно добавить опцию Restart. У неё есть несколько значений, подробно описанных в man systemd.service . Значение always будет в любой ситуации перезапускать приложение:
Когда изменили файл юнита, надо заставлять systemd перечитать его, чтобы он использовал уже новый файл:
Снова запущу сервис, дёрну убивающую ручку и проверю, переподнимется ли приложение:
Ну вот. Теперь упавший процесс переподнимается.
Ограничение прав
Пользователя и группу, от имени которых будет запущен процесс, можно установить переменными User и Group:
Запись и просмотр логов
Здорово, если ваше приложение пишет логи в файлы. Но если оно пишет в стандартный вывод, то через systemd можно собирать эти записи. По умолчанию они и так куда-то собираются. Куда именно — зависит от ваших настроек. У меня например на Ubuntu 16.04 они сливаются в журнал systemd, и посмотреть их можно вот так:
или в файле /var/log/syslog .
Можно сделать, чтобы systemd направлял вывод процесса в syslog, и написать правила обработки логов для него. Например сливать их на сервер-агрегатор логов или просто писать в файлы.
Опции StandardOutput и StandardError определяют, куда писать вывод приложения. Возможные значения этих опций вы можете посмотреть в man systemd.exec . SyslogIdentifier собственно задаёт имя сервиса для syslog. Кстати, при отправке логов в syslog, в журнал systemd они тоже будут писаться, так что можно по-прежнему читать их с помощью journalctl.
Ну так вот, в syslog можно настроить правила обработки логов от вашего приложения. У меня в качестве syslog-демона rsyslog. Его настройки лежат в /etc/rsyslog.d/ . Создаю файл /etc/rsyslog.d/100-myapp.conf с таким содержимым:
Systemd не умеет слать stdout и stderr в syslog с разным уровнем severity, поэтому в такой конфигурации нельзя писать stdout в один файл, а stderr в другой.
И настроить в syslog правила для записи в разные файлы:
Кроме записи в файлы, можно конечно и на сервер-агрегатор слать.
Если вы пишете логи в файлы, не забудьте настроить logrotate. Пример файла конфигурации /etc/logrotate.d/myapp :
Самое главное тут — скрипт postrotate, который заставляет rsyslog переоткрыть файл после ротации. Подробности про настройку logrotate можно прочитать в man logrotate.conf
Вот так, с помощью нехитрых приспособлений приложение на nodejs (или на python) можно превратить в демон, который поднимется после падения, и логи которого нормально сохраняются и ротируются.
Node Js - это платформа на основе JavaScript, которая уже завоевала большую популярность и становится еще более легкой и эффективной для разработчиков. Она позволяет программистам использовать JavaScript как для веб-приложений и пользовательских интерфейсов, так и для обычных программ, благодаря движку V8 от Google.
Для платформы уже создано более чем миллион пакетов, которыми можно управлять с помощью менеджера пакетов Node или NPM. Это отличная система для расширяемости приложения с помощью решений с открытым исходным кодом. В этой статье мы рассмотрим четыре способа установить Node.js в Ubuntu 20.04. Мы рассмотрим их все ниже, но рекомендуется использовать первый:
- Использовать скрипт NVM, для управления несколькими версиями Node.js;
- Установить программу из официальных репозиториев вашего дистрибутива;
- Установить пакеты из PPA;
- Установка Node.js из бинарных пакетов, распространяемых на официальном сайте;
Первый способ рекомендованный, но второй более простой, третий и четвертый позволяют получить более новые версии программ. Если у вас уже была установлена более старая версия Node js, ее нужно удалить, чтобы не возникало конфликтов, также вы можете просто обновить программу, для этого смотрите статью как обновить Node.js на Windows, Linux и Mac.
Удалить старую версию Node.js
В Ubuntu пакет Node Js называется по-старому - Node, эта программа вам не нужна и вы можете ее удалить. Если программа останется, некоторые операции могут выполняться с помощью нее и это будет вызывать конфликты.
Сначала давайте проверим установлена ли у вас эта программа:
dpkg --get-selections | grep node
Теперь вы можете ее удалить с помощью следующих команд:
sudo apt purge nodejs
Теперь можно переходить к рассмотрению того как установить Node.js в Ubuntu 20.04.
Установка Node.js в Node Version Manager
Чтобы установить Node.js Ubuntu 20.04 с помощью NVM нам понадобится компилятор C++ в системе, а также другие инструменты для сборки. По умолчанию система не поставляется с этими программами, поэтому их необходимо установить. Для этого выполните команду:
sudo apt install build-essential checkinstall
Также нам понадобится libssl:
sudo apt install libssl-dev
После завершения установки вам понадобится перезапустить терминал. Или можно выполнить:
Затем смотрим список доступных версий Node js:
Дальше можно устанавливать Node js в Ubuntu, при установке обязательно указывать версию, на данный момент самая последняя 11.0, но установим десятую:
nvm install 14.0
Список установленных версий вы можете посмотреть выполнив:
Дальше необходимо указать менеджеру какую версию нужно использовать:
Как только появятся более новые версии node js, вы сможете их установить и активировать в системе. Посмотреть версию вы можете выполнив команду:
Чтобы удалить эту версию node js, ее нужно деактивировать:
nvm deactivate 14.0
Затем можно удалить:
nvm uninstall 14.0
Установка Node.js из репозиториев Ubuntu
Это самый простой способ установки этой платформы. Сначала выполните команду:
sudo apt install nodejs
Затем установите менеджер пакетов npm:
sudo apt install npm
Теперь вы можете проверить работоспособность только что установленных программ:
Как видите, при использовании официальных репозиториев вы получаете более старую версию.
Установка Node js из PPA
Установка Node js Ubuntu из PPA, это альтернативный вариант, позволяющий получить более новую версию, достаточно простым способом. Сначала добавьте репозитории Node js в список репозиториев Ubuntu с помощью такой одной из следующих команд. Для установки самой последней версии выполните:
А для стабильной:
Затем просто установите программу с помощью пакетного менеджера:
sudo apt install nodejs
Проверяем, что получилось:
Установка Node js из бинарников
Установка Node.js Ubuntu 20.04 через бинарные файлы не рекомендуется, потому что вы не сможете автоматически обновить программу до новой версии, вам придется повторять процедуру заново. Вы можете скачать установочные файлы Node js из официального сайта проекта. Здесь доступны как 32 битная, так и 64 битная версия. Вам нужно скачать файл именно для своей системы.
Чтобы узнать архитектуру выполните:
Откройте официальный сайт Node.js и найдите нужную версию, затем скачайте архив для своей архитектуры:
Вы можете скачать Node js и с помощью терминала, например, эта команда для 64 бит версии:
Читайте также: