Развертывание веб-приложения Node.js на виртуальной машине в Azure Stack Hub
Вы можете создать виртуальную машину для размещения веб-приложения Node.js в Azure Stack Hub. В этой статье описана настройка сервера, настройка сервера для размещения веб-приложения Node.js, а затем развертывание приложения в Azure Stack Hub.
Общие сведения о глобальной среде Azure см. в статье Azure для разработчиков JavaScript & Node.js. Эта статья посвящена использованию Azure Stack Hub, локальной версии Azure.
Создание виртуальной машины
- Настройте виртуальную машину в Azure Stack Hub, следуя инструкциям из статьи о развертывании виртуальной машины Linux для размещения веб-приложения в Azure Stack Hub.
- В области сети виртуальных машин разрешите доступ к следующим портам:
| Порт | Протокол | Описание |
|---|---|---|
| 80 | HTTP | HTTP — это протокол, который используется для доставки веб-страниц с серверов. Клиенты подключаются по протоколу HTTP, используя DNS-имя или IP-адрес. |
| 443 | HTTPS | HTTPS — это безопасная версия протокола HTTP, которая использует сертификат безопасности и обеспечивает передачу данных в зашифрованном виде. |
| 22 | SSH | Secure Shell (SSH) — это сетевой протокол с применением шифрования для безопасного обмена данными. Такое соединение используется клиентом SSH для настройки виртуальной машины и развертывания приложений. |
| 3389 | RDP | Необязательный параметр. Протокол RDP позволяет подключаться к удаленному рабочему столу, чтобы использовать графический пользовательский интерфейс на вашем компьютере. |
| 3000 | Особые настройки | Порт, используемый платформой Node.js Express. Для рабочего сервера разработки вам нужно перенаправить трафик через порты 80 и 443. |
Установка Node
- Подключитесь к виртуальной машине c помощью клиента SSH. Инструкции см. в разделе Подключение по протоколу SSH с помощью PuTTy.
- В командной строке bash на виртуальной машине ведите следующую команду:
sudo apt-get update sudo apt-get install nodejs sudo apt-get install npm
node --version
Подготовка нового приложения с помощью генератора Express
Express — это популярная платформа для создания и запуска приложений Node. js. Вы можете создать шаблон (создать) новое приложение Express с помощью средства Экспресс-генератора. Генератор Express поставляется в виде модуля npm и может запускаться напрямую (без установки) с помощью программы npx командной строки npm .
npx express-generator myExpressApp --view pug --git
Параметры —view pug —git сообщают генератору, что он должен использовать обработчик шаблонов pug (ранее известный под именем jade ) и создать файл с именем .gitignore .
Чтобы установить все зависимости приложения, перейдите в новую папку и запустите npm install.
cd myExpressApp npm install
Запустите приложение. Запустите приложение из терминала с помощью команды npm start , чтобы начать работу сервера.
Перейдите на новый сервер в веб-браузере. Вы увидите запущенное веб-приложение. URL-адрес виртуальной машины Linux можно найти на пользовательском портале Azure Stack Hub с меткой DNS-имя.
http://yourhostname.contoso.com:3000
Дальнейшие действия
- См. дополнительные сведения о разработке для Azure Stack Hub.
- Дополнительные сведения о распространенных сценариях развертывания IaaS для Azure Stack Hub см. здесь.
- Дополнительные сведения об использовании Node.js с Azure см. в статье Azure для разработчиков JavaScript & Node.js.
Node.js
Node.js — программная платформа, основанная на движке V8 (транслирующем JavaScript в машинный код), превращающая JavaScript из узкоспециализированного языка в язык общего назначения. Node.js добавляет возможность JavaScript взаимодействовать с устройствами ввода-вывода через свой API (написанный на C++), подключать другие внешние библиотеки, написанные на разных языках, обеспечивая вызовы к ним из JavaScript-кода. Node.js применяется преимущественно на сервере, выполняя роль веб-сервера, но есть возможность разрабатывать на Node.js и десктопные оконные приложения (при помощи NW.js, AppJS или Electron для Linux, Windows и Mac OS) и даже программировать микроконтроллеры (например, tessel и espruino). В основе Node.js лежит событийно-ориентированное и асинхронное (или реактивное) программирование с неблокирующим вводом/выводом. (c) ru.wikipedia.org
Рассмотрим установку Node.js приложения на примере блога ghost.

Подготовка Веб-сервера
Первое, что нам необходимо сделать — это получить доступ к SSH:
- Панель управления -> SSH -> Устаналиваем пароль и флаг Вкл. (либо ограничиваем по IP)
Создаем виртуальный сервер:
- Панель управления -> Веб-серверы -> Создать новый:
-
- Приложения на сервере -> Node.js
- Корневая папка -> ghost
- Имя Сервера -> mydomain.ru
- Индексный файл -> index.js
- Включить акселератор отдачи статического контента -> Вкл.
- Порт -> 4000
Установка приложения
Пока применяются настройки для нового сервера (это занимает не более получаса, состояние можно посмотреть Панель управления -> Главная), создадим приложение на сервере.
Используя любой SSH клиент, заходим на сервер:
- my_admin_login — Ваш логин администратора
- mydomain.ru — Ваш домен либо технический адрес сервера
В командной строке выполняем команды
Загружаем архив блога. Актуальную версию блога можно проверить тут:
https://github.com/TryGhost/Ghost/releases/ - $ wget —no-check-certificate https://ghost.org/zip/ghost-latest.zip
- $ unzip ghost-latest.zip
- $ CXX=c++
- $ export CXX
- $ npm install sqlite3 —sqlite=/usr/local
- $ npm install —production
- $ cp config.example.js config.js
Редактируем конфигурационный файл приложения:
В секции production меняем
- url: на mydomain.ru
- host: на IP, указанный в панели настроек веб-сервера
- port: на порт, указанный при создании веб-сервера в панели
Посмотреть, запустилось ли приложение, можно командой:
где id — это номер приложения из вывода команды forever list.
Сайт будет доступен в браузере по указанному Имя Сервера, без указания порта!
При создании нового (второго и т.д.) приложения Node.js, следует указывать уникальный порт для каждого веб-сервера в пределах между значениями 4000 и 5000.
Установка и настройка Node.js
Если вы используете Node.js как средство серверной разработки для своего сайта или web-приложения, то эта статья для вас, поскольку в ней мы рассмотрим настройку данной программной платформы и правильную организацию структуры папок для корректного функционирования вашего проекта.
Для начала вам необходимо установить Node.js на свой аккаунт. Скачать любую версию Node.js можно с официального репозитория https://nodejs.org/dist/. На момент написания данного руководства, последним релизом являлась версия v10.6.0, скачать её можно здесь.
Выбирать нужно версию для Linux, битность x64, архиватор GZIP. Скачиваем файл https://nodejs.org/dist/v10.6.0/node-v10.6.0-linux-x64.tar.gz
Для нужной версии вы сможете также установить и необходимые модули (см. ниже).
На хостинге функционирование Node.js реализовано через специальную библиотеку Passenger, которая осуществляет взаимодействие Вашего сайта с обработчиком Node.js
Рассмотрим структуру папок и файлов. Мы предлагаем реализовать ее примерно следующим образом:
- site-name.com (корневая папка вашего сайта)
- htdocs
- www
- nodejs_app
- www
- nodejs_tmp
- www
Ваша цель — создать идентичную структуру и разместить файлы в соответствующих схеме директориях. Далее мы наполним их содержимым.
Установка Node.js
Чтобы сразу начать пользоваться необходимой вам версией Node (при условии, что Вы уже получили доступ по SSH), можете ввести следующие команды в терминале для загрузки и распаковки архива с файлами:
Работа с .htaccess файлом
Чтобы Passenger мог взаимодействовать с Node.js, в файле .htaccess (мы рекомендуем располагать его здесь ./site-name.com/htdocs/www/.htaccess) необходимо прописать следующее:
PassengerAppRoot /home/hostXXXXXXX/site-name.com/nodejs_app/www PassengerAppType node PassengerStartupFile app.js PassengerNodejs /home/hostXXXXXXX/node/bin/node PassengerRestartDir /home/hostXXXXXXX/site-name.com/nodejs_tmp/www PassengerFriendlyErrorPages on
- Вместо hostXXXXXXX вы прописываете номер своего аккаунта
- site-name.com — это имя папки с вашим проектом
- app.js — название файла, который запускает работу серверной части (вы можете назвать его как захотите, главное, пропишите соответствующее имя в .htaccess)
- PassengerNodejs — путь до исполняемого файла Node.js
- PassengerFriendlyErrorPages — опция для отображения ошибок, в случае, когда приложение работает не корректно, или не запускается (по умолчанию — PassengerFriendlyErrorPages off). Данная опция выводит сообщения об ошибке, некоторые предложения по решению проблемы, трассировку и дамп переменных среды выполнения. Рекомендуется включать эту опцию только на этапе разработки. После её окончания удалите или закомментируйте в .htaccess эту опцию.
Включение лога ошибок
При разработке любого сайта или приложения разработчики допускают ошибки. По умолчанию, они записываются в папку logs, которая находится в корне сайта. Также, убедитесь, что у вас включена данная опция в панели управления. Во вкладке «Домены»→«Прикрепление домена», рядом с надписью «Лог-файлы веб сервера» есть переключатель, который включает/выключает данную опцию. После включения, логи начнут писаться в течение 5 минут (при обычной загруженности сервера).
Перезапуск приложения
Файлы restart.txt и always_restart.txt необходимы для того, чтобы при внесении вами каких-либо изменений в рабочие файлы (к примеру, app.js) Passenger, применяя правила записанные в .htaccess, мог перехватывать их и применять в работе сайта. Отличие заключается в том, что restart.txt сработает только один раз, а always_restart.txt перезапускает процесы веб-сервера при каждом поступившем запросе. Рекомендуется использовать always_restart.txt только при разработке. После того, как разработка проекта будет завершена, не забудьте удалить этот файл, чтобы избежать задержек при отображении страницы посетителям.
Если Вы уверены в том, что ваш код работает без багов, но всё-равно видите ошибки на странице, можно принудительно завершить все процессы с помощью следующей команды через SSH-соединение:
killall -2 "Passenger NodeApp"
После чего перезагрузить страницу.
Код для app.js
И напоследок, осталось добавить скрипт для запуска Node в app.js. Ниже представлен код с официального сайта Node.js (в дальнейшем вы можете изменять его по своему усмотрению, сейчас мы лишь хотим убедиться, что всё работает):
const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; const server = http.createServer((req, res) => < res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); >); server.listen(port, hostname, () => < console.log(`Server running at http://$:$/`); >);
Итак, все настройки произведены. Откройте сайт в новой вкладке. Если выводится Hello world, то всё работает, как и ожидалось. В противном случае, ещё раз пройдите по вышеприведённому алгоритму действий. Возможно, вы что то упустили.
Пример подключения модуля
Чтобы установить какой-либо модуль в директорию с файлами приложения, при этом используя установленную версию Node.js, необходимо для начала прописать путь до исполняемого файла node в .bash_profile (он лежит в корне вашего аккаунта). После этого вы сможете обращаться к нему из любой директории вашего проекта.
Итак, откройте .bash_profile и допишите следующую строку:
PATH=$HOME/.local/bin:$HOME/bin:$HOME/site-name.com/node/bin:$PATH
Для примера, рассмотрим подключение модуля mysql для работы с базой данных (предварительно, создайте таблицу под любым названием и поместите туда несколько записей). Чтобы установить даный модуль, зайдите через SSH-соединение в директорию «nodejs_app/www» и введите в терминале команду:
npm init --force
Таким обазом создастся файл package.json с данными о вашем приложении. После этого наберите команду:
npm install mysql --save-dev
Вы увидите, что автоматически создастся новая директория «node_modules» и подгрузятся необходимые нам для работы файлы.
Также, рекомендуем загрузить 2 часто используемых модуля — fs (для работы с файлами) и util (для красивого вывода объектов в консоль)
npm install fs util --save-dev
Далее, открываем файл нашего приложения app.js и добавляем следующий код:
const fs = require('fs'); const util = require('util'); var log_file = fs.createWriteStream(__dirname + '/debug.log', ); var log_stdout = process.stdout; console.log = function(d) < log_file.write(util.format(d) + '\n'); log_stdout.write(util.format(d) + '\n'); >; const mysql = require('mysql'); const connection = mysql.createConnection(< host : 'localhost', user : 'hostXXXXXXX', password : 'your_password', database : 'your_database_name' >); connection.connect(); connection.query('SELECT * FROM my_table', function (error, results, fields) < if (error) throw error; results.forEach(function(obj) < console.log( util.inspect(obj) ); >); >); connection.end();
В коде выше мы, с помощью модуля fs, создаём новый файл debug.log, в который будем помещать вывод функции console.log
Далее, переопределяем саму функцию console.log, задействуя поток на запись.
Теперь, при помощи модуля mysql, подключаемся к своей БД и выбираем все записи из нужной нам таблицы, прописывая их в созданный нами файл.
Проверим, всё ли сработало: перезагрузите страницу своего сайта и откройте файл debug.log — вы должны увидеть вывод всех записей из таблицы.
Запуск приложений через crontab
Для запуска приложений Node.js через crontab создайте shell скрипт и определите в нём переменную окружения PATH исходя из ваших требований, или можно указать полный путь к бинарному файлу nodejs и скрипту. Простейший Shell скрипт для запуска nodejs приложения:
#!/usr/bin/env sh env PATH=/home/hostXXXXXXX/node-vXX.ZZ.YY/bin:/home/hostXXXXXXX/node-vXX.ZZ.YY/bin:$PATH node example.js
Или команда для запуска целиком:
/home/hostXXXXXX/nodejs/bin/node /home/hostXXXXXX/nodeproject/example.js
Удачной работы! Если возникнут вопросы — напишите нам, пожалуйста, тикет из панели управления хостингом, раздел «Помощь и поддержка».
Настройка Node.js
В статье будет рассмотрена настройка Node.JS.
Обратите внимание!
Если вы хотите запустить веб-приложение, но еще не создали сайт — сначала необходимо создать сайт и прикрепить к нему домен в разделе Сайты. Лучше всего имя сайта указывать аналогично желаемому доменному имени — в противном случае в будущем могут возникнуть трудности с пониманием файловой структуры.
Если у вас еще нет доменного имени, его можно добавить или зарегистрировать в разделе Домены.
После того, как сайт создан и к нему прикреплён домен, направленный на наши NS сервера, можно приступать к настройке.
Сначала необходимо подключится к аккаунту по протоколу SSH.
Подключение к аккаунту
Если Вы пользуетесь OS Windows, то, скорее всего, Вам подойдет SSH-клиент PuTTy (статью по настройке можно прочитать здесь). Когда настроите, можно переходить на шаг 2.
Если Вы пользуетесь OS Linux или OS X, подойдет обычный терминал, который присутствует во всех Unix-подобных операционных системах. Подключиться можно следующей командой:
$ ssh username@username.beget.tech
Где username — логин, username.beget.tech — адрес сервера (посмотреть его можно в блоке Техническая информация на главной странице панели управления).
Переход в Docker
Далее нужно перейти в виртуальное окружении Docker. Запуск Node.js осуществляется только внутри Docker контейнера. Для этого, после подключения по SSH необходимо ввести команду:
ssh localhost -p 222
А также ввести свой пароль для подключения к SSH. В строке терминала будет отображено, что теперь мы находимся в Docker окружении:
(docker) valkeru@oscar2: [0]~
На хостинге уже установлены Node.js и npm.
(docker) valkeru@oscar2:~ [0] $ node -v v8.12.0 (docker) valkeru@oscar2:~ [0] $ npm -v 6.4.1
Установка Node.js другой версии
Обратите внимание!
На данный момент, на виртуальном хостинге, максимальная поддерживаемая версия — 17.9.1. NodeJS версии 18.0 и выше работать не будет.
Учитывайте эту информацию при выборе версии.
Установка Node.js производится в каталог .local Вашей учётной записи:
valkeru@oscar2:~ [0] $ mkdir -p .local valkeru@oscar2:~ [0] $ cd .local
Обратите внимание!
Загружать нужно 64-разрядную версию, запуск исполняемых файлов для 32-битной архитектуры на наших серверах запрещён!
Загрузим дистрибутив и распакуем его:
valkeru@oscar2:~/.local [0] $ wget https://nodejs.org/dist/v12.16.2/node-v12.16.2-linux-x64.tar.xz --2019-06-26 02:46:01-- https://nodejs.org/dist/v12.16.2/node-v12.16.2-linux-x64.tar.xz Resolving nodejs.org. 104.20.23.46, 104.20.22.46, 2400:cb00:2048:1::6814:172e, . Connecting to nodejs.org|104.20.23.46|:443. connected. HTTP request sent, awaiting response. 200 OK Length: 11314172 (11M) [application/x-xz] Saving to: ‘node-v8.1.2-linux-x64.tar.xz’ node-v12.16.2-linux-x64.tar.xz 100%[==========================>] 10,79M 7,18MB/s in 1,5s 2019-06-26 02:46:04 (7,18 MB/s) - ‘node-v12.16.2-linux-x64.tar.xz’ saved [11314172/11314172] valkeru@oscar2:~/.local [0] $ tar xJf node-v12.16.2-linux-x64.tar.xz --strip 1 valkeru@oscar2:~/.local [0] $
Удалите загруженный дистрибутив:
valkeru@oscar2:~/.local [0] $ rm node-v12.16.2-linux-x64.tar.xz valkeru@oscar2:~/.local [0] $
Обратите внимание!
Поскольку сайты на учётных записях изолированы, для запуска Node.js из окружения веб-сервера потребуется открыть общий доступ к каталогу ~/.local.
Инструкция по предоставлению общего доступа приведена в этой статье.
Создание каталога проекта
Теперь нужно перейти в каталог сайта, в рассматриваемом примере имя каталога — node:
valkeru@oscar2:~ [0] $ cd ~/node
Необходимо создать каталог для проекта и вложенный в него каталог tmp, в рассматриваемом примере имя каталога — HelloWorld:
valkeru@oscar2:~/node [0] $ mkdir -p HelloWorld/tmp valkeru@oscar2:~/node [0] $
Для корректной отдачи статического контента средствами Nginx создается ссылка public, указывающая на public_html:
valkeru@oscar2:~/node [0] $ ln -s public_html public
С помощью любого текстового редактора (например, nano или vim) необходимо создать файл app.js в каталоге проекта HelloWorld со следующим содержимым:
var http = require('http'); var server = http.createServer(function(req, res) < res.writeHead(200, < 'Content-Type': 'text/plain' >); res.end('Hello World!'); >); server.listen(3000);
Далее, если вы находитесь в каталоге проекта HelloWorld, необходимо вернутся в каталог node
valkeru@oscar2:~/node/HelloWorld [0] $ cd ..
Создание .htaccess
Затем нужно создать файл .htaccess. В общем виде его содержимое выглядит следующим образом:
PassengerNodejs /home/первая буква логина/логин/.local/bin/node PassengerAppRoot /home/первая буква логина/логин/папка сайта/название_проекта PassengerAppType node PassengerStartupFile app.js
Если вы установили новую версию NodeJS, то .htaccess будет следующим:
PassengerNodejs /home/v/valkeru/.local/bin/node PassengerAppRoot /home/v/valkeru/node/HelloWorld PassengerAppType node PassengerStartupFile app.js
Если вы решили воспользоваться предустановленным NodeJS, то .htaccess будет следующим:
PassengerNodejs /usr/local/bin/node PassengerAppRoot /home/v/valkeru/node/HelloWorld PassengerAppType node PassengerStartupFile app.js
Для того, чтобы Passenger перечитал конфиг, необходимо создать файл tmp/restart.txt. Cделать это нужно в директории, указанной в качестве PassengerAppRoot в файле .htaccess ранее.
valkeru@oscar2:~/node/HelloWorld [0] $ touch tmp/restart.txt valkeru@oscar2:~/node/HelloWorld [0] $
Обратите внимание!
В дальнейшем при изменении или добавлении кода также требуется выполнять данную команду, чтобы увидеть изменения на сайте.
Для проверки работоспособности откройте сайт в браузере:

Также для проверки работоспособности можно выполнить следующую команду:
valkeru@oscar2:~/node [0] $ ps aux | grep Passenger 659085 4148 0.1 0.0 878828 29796 ? Sl 02:55 0:00 Passenger NodeApp: /home/v/valkeru/node/HelloWorld valkeru 7365 0.0 0.0 7496 2144 pts/19 SN+ 02:56 0:00 grep Passenger
В листинге процессов присутствует модуль Apache Passenger.
Удачной работы! Если возникнут вопросы — напишите нам, пожалуйста, тикет из Панели управления аккаунта, раздел «Помощь и поддержка».