Создание виртуальной машины Express.js с помощью Azure CLI
В этом руководстве описано, как создать виртуальную машину Linux для приложения Express.js. Виртуальная машина настраивается с помощью файла конфигурации cloud-init и содержит NGINX и репозиторий GitHub для приложения Express.js. Подключитесь к виртуальной машине с помощью SSH, измените веб-приложение на включение журнала трассировки и просмотрите общедоступное Express.js серверное приложение в веб-браузере.
Учебник включает в себя следующие разделы:
- Вход в Azure с помощью Azure CLI
- Создание ресурса виртуальной машины Linux с помощью Azure CLI
- Открытие общедоступного порта 80.
- Установка демонстрационного веб-приложения Express.js из репозитория GitHub.
- Установка зависимостей веб-приложения.
- Запуск веб-приложения.
- Создание ресурса мониторинга Azure с помощью Azure CLI
- Подключение к виртуальной машине по протоколу SSH.
- Установка клиентской библиотеки пакета Azure SDK с помощью npm.
- Добавление кода клиентской библиотеки Application Insights для создания настраиваемой трассировки.
- Просмотр веб-приложения из браузера
- Запрос маршрута
/trace
для создания настраиваемой трассировки в журнале Application Insights. - Просмотр числа трассировок, собранных в журнале, с помощью Azure CLI.
- Просмотр списка трассировок на портале Azure.
- Запрос маршрута
- Удаление ресурсов с помощью Azure CLI.
Необходимые компоненты
- Учетная запись пользователя и подписка Azure: создайте бесплатную подписку.
- SSH для подключения к виртуальной машине: используйте Azure Cloud Shell или современный терминал, например оболочку bash, которая включает SSH.
Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.
Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.
Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
1. Создание ресурса Application Insights для веб-страниц
Узнайте, как создать группу ресурсов Azure для всех ваших ресурсов Azure и ресурс Monitor для сбора файлов журналов веб-приложения в облаке Azure. Создание группы ресурсов позволяет легко находить ресурсы и удалять их после завершения. Azure Monitor — это служба Azure, а Application Insights — клиентская библиотека, используемая при работе с руководством.
Необязательно, если у вас несколько подписок, используйте az account set , чтобы задать подписку по умолчанию перед выполнением оставшихся команд.
az account set \ --subscription "ACCOUNT NAME OR ID"
Создайте группу ресурсов Azure с помощью az group create. Используйте имя
rg-demo-vm-eastus
:az group create \ --location eastus \ --name rg-demo-vm-eastus
Создание ресурса Azure Monitor с помощью Azure CLI
Установите расширение Application Insights в Azure CLI.
az extension add -n application-insights
Используйте следующую команду для создания ресурса мониторинга с помощью az monitor app-insights component create:
az monitor app-insights component create \ --app demoWebAppMonitor \ --location eastus \ --resource-group rg-demo-vm-eastus \ --query instrumentationKey --output table
Скопируйте результат из выходных данных, вам потребуется это значение в дальнейшем
instrumentationKey
.Оставьте терминал открытым, вы будете использовать его на следующем шаге.
2. Создание виртуальной машины Linux с помощью Azure CLI
Использует файл конфигурации cloud-init для создания обратного прокси-сервера NGINX и сервера Express.js. NGINX используется для переадресации порта Express.js (3000) на общедоступный порт (80).
Создайте локальный файл с именем
cloud-init-github.txt
и сохраните следующее содержимое в файл. Или же вы можете сохранить файл репозитория на локальном компьютере. Папка, в которой располагается отформатированный файл cloud-init, должна соответствовать пути терминала для ваших команд Azure CLI.#cloud-config package_upgrade: true packages: - nginx write_files: - owner: www-data:www-data path: /etc/nginx/sites-available/default content: | server { listen 80 default_server; server_name _; location / { # First, try if the file exists locally, otherwise request it from the app try_files $uri @app; } location @app { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } runcmd: # install Node.js - 'curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -' - 'sudo apt-get install -y nodejs' # clone GitHub Repo into myapp directory - 'cd /home/azureuser' - git clone "https://github.com/Azure-Samples/js-e2e-vm" myapp # Start app - 'cd myapp && npm install && npm start' # restart NGINX - systemctl restart nginx
Изучите раздел
runcmd
файла, чтобы понять, что он делает.runcmd
выполняет несколько задач:- скачивает и устанавливает Node.js,;
- клонирует пример репозитория Express.js из GitHub в каталог
myapp
; - устанавливает зависимости приложений;
- запускает приложение Express.js с помощью PM2.
Создание ресурса виртуальной машины
Введите команду Azure CLI, az vm create, в терминале, чтобы создать ресурс Azure виртуальной машины Linux. Эта команда создает виртуальную машину из файла cloud-init, а также SSH-ключи. Выполняющаяся команда отображает расположение с ключами.
az vm create \ --resource-group rg-demo-vm-eastus \ --name demo-vm \ --location eastus \ --public-ip-sku Standard \ --image UbuntuLTS \ --admin-username azureuser \ --generate-ssh-keys \ --custom-data cloud-init-github.txt
Подождите, пока процесс может занять несколько минут.
Сохраните значение publicIpAddress из ответа, необходимо просмотреть веб-приложение в браузере и подключиться к виртуальной машине. Если вы потеряете этот IP-адрес, используйте команду Azure CLI, az vm list-ip-addresss , чтобы снова получить его.
Процесс создал ключи SSH и их в расположении, указанном в ответе.
Перейдите в это расположение и создайте
authorized_keys
файл:cd <SSH-KEY-LOCATION> && cat id_rsa >> authorized_keys
Открытие порта для виртуальной машины
После создания виртуальная машина не имеет открытых портов. Откройте порт 80 с помощью следующей команды Azure CLI, az vm open-port, чтобы веб-приложение было общедоступным:
az vm open-port \
--port 80 \
--resource-group rg-demo-vm-eastus \
--name demo-vm
Переход к веб-сайту
Используйте общедоступный IP-адрес в веб-браузере, чтобы убедиться, что виртуальная машина доступна и работает. Измените URL-адрес, чтобы он использовал значение из
publicIpAddress
.http://YOUR-VM-PUBLIC-IP-ADDRESS
Если ресурс завершит работу с ошибкой шлюза, повторите попытку через минуту, так как веб-приложению может потребоваться время на запуск.
Веб-приложение виртуальной машины возвращает следующие сведения:
- имя виртуальной машины;
- IP-адрес клиента;
- текущие дата и время.
Исходный файл кода для веб-приложения имеет один маршрут, который передается через прокси-сервер NGINX.
const os = require('os'); const express = require('express') const app = express() app.use('/public', express.static('public')) app.get('/', function (req, res) { const clientIP = req.headers['x-forwarded-for']; const msg = `HostName: ${os.hostname()}<br>ClientIP: ${clientIP}<br>DateTime: ${new Date()}<br><img width='200' height='200' src='/public/leaves.jpg' alt='flowers'>` console.log(msg) res.send(msg) }) app.listen(3000, function () { console.log(`Hello world app listening on port 3000! ${Date.now()}`) })
3. Подключение к виртуальной машине Linux с помощью SSH
Из этого раздела учебника вы узнаете, как использовать SSH в терминале для подключения к виртуальной машине. SSH — это популярный инструмент, предоставляемый с современными оболочками, в том числе с Azure Cloud Shell.
Подключение по протоколу SSH и изменение веб-приложения
Подключитесь к удаленной виртуальной машине с помощью следующей команды.
Замените
YOUR-VM-PUBLIC-IP
общедоступным IP-адресом вашей виртуальной машины.ssh azureuser@YOUR-VM-PUBLIC-IP
Этот процесс предполагает, что ваш клиент SSH может найти ваши SSH-ключи, созданные в ходе создания виртуальной машины и сохраненные на локальном компьютере.
Если вы спрашиваете, хотите ли вы подключиться, ответить
y
илиyes
продолжить.Используйте следующую команду, чтобы понять, в какой папке виртуальной машины вы находитесь. Вы должны находиться в корне azureuser:
/home/azureuser
.pwd
По завершении подключения запрос терминала должен изменить имя пользователя и имя ресурса удаленной виртуальной машины.
azureuser@demo-vm:
Веб-приложение располагается в подкаталоге
myapp
. Перейдите в каталогmyapp
и отобразите его содержимое:cd myapp && ls -l
Вы увидите содержимое, представляющее репозиторий GitHub, клонированного в виртуальную машину и файлы пакетов npm:
-rw-r--r-- 1 root root 891 Nov 11 20:23 cloud-init-github.txt -rw-r--r-- 1 root root 1347 Nov 11 20:23 index-logging.js -rw-r--r-- 1 root root 282 Nov 11 20:23 index.js drwxr-xr-x 190 root root 4096 Nov 11 20:23 node_modules -rw-r--r-- 1 root root 84115 Nov 11 20:23 package-lock.json -rw-r--r-- 1 root root 329 Nov 11 20:23 package.json -rw-r--r-- 1 root root 697 Nov 11 20:23 readme.md
Установка пакета SDK для мониторинга
В терминале SSH, подключенном к виртуальной машине, установите клиентскую библиотеку Пакета SDK Azure для Application Insights.
sudo npm install --save applicationinsights
Дождитесь завершения команды, прежде чем продолжить.
Добавление ключа инструментирования мониторинга
В терминале SSH, подключенном к вашей виртуальной машине, воспользуйтесь редактором Nano, чтобы открыть файл
package.json
.sudo nano package.json
Добавьте переменную среды
APPINSIGHTS_INSTRUMENTATIONKEY
в начало скрипта Start. В следующем примере заменитеREPLACE-WITH-YOUR-KEY
значением ключа инструментирования."start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
Так же в терминале SSH сохраните файл в редакторе Nano, нажав клавиши CTRL + X.
Если появится запрос в редакторе Nano, введите Y , чтобы сохранить.
Если появится запрос в редакторе Nano, примите имя файла при появлении запроса.
Остановка виртуальной машины для изменения приложения
Клиентская библиотека Azure теперь располагается в каталоге node_modules, а ключ был передан в приложение в виде переменной среды. Следующий шаг программно использует Application Insights.
Остановите PM2, который является диспетчером производственных процессов для приложений Node.js, с помощью следующих команд:
sudo npm run-script stop
Замените исходный
index.js
файл с помощью Application Insights.sudo npm run-script appinsights
Клиентская библиотека и код ведения журнала предоставляются для вас.
const express = require('express') const app = express() const os = require('os'); console.log(JSON.stringify(process.env)); const AppInsights = require('applicationinsights'); if (process.env.APPINSIGHTS_INSTRUMENTATIONKEY) { console.log(`AppInsights configured with key ${process.env.APPINSIGHTS_INSTRUMENTATIONKEY}`); } else{ console.log(`AppInsights not configured`); } AppInsights.setup(process.env.APPINSIGHTS_INSTRUMENTATIONKEY) .setAutoDependencyCorrelation(true) .setAutoCollectRequests(true) .setAutoCollectPerformance(true, true) .setAutoCollectExceptions(true) .setAutoCollectDependencies(true) .setAutoCollectConsole(true) .setUseDiskRetryCaching(true) .setSendLiveMetrics(false) .setDistributedTracingMode(AppInsights.DistributedTracingModes.AI) .start(); const AppInsightsClient = AppInsights.defaultClient; app.get('/trace', (req, res) => { const clientIP = req.headers['x-forwarded-for']; const msg = `trace route ${os.hostname()} ${clientIP} ${new Date()}`; console.log(msg) if (process.env.APPINSIGHTS_INSTRUMENTATIONKEY) { AppInsightsClient.trackPageView(); AppInsightsClient.trackTrace({ message: msg }) AppInsightsClient.flush(); } else { msg += ' AppInsights not configured'; } res.send(`${msg}`) }) app.get('/', function (req, res) { const clientIP = req.headers['x-forwarded-for']; const msg = `root route ${os.hostname()} ${clientIP} ${new Date()}` console.log(msg) res.send(msg) }) app.listen(3000, function () { console.log(`Hello world app listening on port 3000! ${os.hostname()}`) })
Перезапустите приложение с помощью PM2, чтобы выбрать следующую переменную среды.
sudo npm start
Использование приложения для проверки ведения журнала
В веб-браузере протестируйте приложение с новым маршрутом
trace
:http://YOUR-VM-PUBLIC-IP-ADDRESS/trace
В браузере отобразится ответ
trace route demo-vm YOUR-CLIENT-IP VM-DATE-TIME
с вашим IP-адресом.
Просмотр журнала для NGINX
Виртуальная машина собирает журналы для NGINX, доступные для просмотра.
Service | Расположение журнала |
---|---|
NGINX | /var/log/nginx/access.log |
- Так же в терминале SSH просмотрите журнал виртуальной машины для службы прокси-сервера NGINX с помощью следующей команды:
cat /var/log/nginx/access.log
- Журнал включает сведения о вызове с локального компьютера.
"GET /trace HTTP/1.1" 200 10 "-"
Просмотр журнала для PM2
Виртуальная машина собирает журналы для PM2, которые доступны для просмотра.
Service | Расположение журнала |
---|---|
PM2 | /var/log/pm2.log |
Просмотрите журнал виртуальной машины для службы PM2, которая является вашим веб-приложением Node Express.js. В той же оболочке Bash воспользуйтесь следующей командой, чтобы просмотреть журнал:
cat /var/log/pm2.log
Журнал включает сведения о вызове с локального компьютера.
grep "Hello world app listening on port 3000!" /var/log/pm2.log
Журнал также содержит переменные среды, в том числе ключ ApplicationInsights, переданный в скрипт запуска npm. Используйте следующую команду grep, чтобы проверить, что ключ находится в переменных среды.
grep APPINSIGHTS_INSTRUMENTATIONKEY /var/log/pm2.log
Это приведет к отображению журнала PM2 с выделенным другим цветом ключом
APPINSIGHTS_INSTRUMENTATIONKEY
.
Ведение журнала для виртуальной машины и облака
В этом приложении использование console.log
приводит к записи сообщения в журналы PM2, которые располагаются только в виртуальной машине. Если удалить журналы или виртуальную машину, эта информация будет утеряна.
Если вы хотите хранить журналы дольше срока существования виртуальной машины, используйте Application Insights.
5. Очистка ресурсов
После завершения работы с этим руководством необходимо удалить группу ресурсов, которая включает все его ресурсы, чтобы убедиться, что вы больше не оплачиваете использование.
В том же терминале используйте команду Azure CLI, az group delete, чтобы удалить группу ресурсов:
az group delete --name rg-demo-vm-eastus -y
Выполнение команды займет несколько минут.
Устранение неполадок
Если у вас возникли проблемы, воспользуйтесь следующей таблицей, чтобы понять, как устранить их:
Проблема | Разрешение |
---|---|
Ошибка шлюза 502 | Это может означать, что файл index.js или package.js включает ошибку. Просмотрите журналы PM2 по пути /var/log/pm2.log , чтобы узнать больше. Самая последняя ошибка находится в самом низу файла. Если вы уверены, что эти файлы правильны, остановите и запустите PM2 с помощью скриптов npm в package.json . |