Поделиться через


Создание виртуальной машины 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 — клиентская библиотека, используемая при работе с руководством.

  1. Необязательно, если у вас несколько подписок, используйте az account set , чтобы задать подписку по умолчанию перед выполнением оставшихся команд.

    az account set \
        --subscription "ACCOUNT NAME OR ID" 
    
  2. Создайте группу ресурсов Azure с помощью az group create. Используйте имя rg-demo-vm-eastus:

    az group create \
        --location eastus \
        --name rg-demo-vm-eastus 
    

Создание ресурса Azure Monitor с помощью Azure CLI

  1. Установите расширение Application Insights в Azure CLI.

    az extension add -n application-insights
    
  2. Используйте следующую команду для создания ресурса мониторинга с помощью 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
    
  3. Скопируйте результат из выходных данных, вам потребуется это значение в дальнейшемinstrumentationKey.

  4. Оставьте терминал открытым, вы будете использовать его на следующем шаге.

2. Создание виртуальной машины Linux с помощью Azure CLI

Использует файл конфигурации cloud-init для создания обратного прокси-сервера NGINX и сервера Express.js. NGINX используется для переадресации порта Express.js (3000) на общедоступный порт (80).

  1. Создайте локальный файл с именем 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
    
  2. Изучите раздел runcmd файла, чтобы понять, что он делает.

    runcmd выполняет несколько задач:

    • скачивает и устанавливает Node.js,;
    • клонирует пример репозитория Express.js из GitHub в каталог myapp;
    • устанавливает зависимости приложений;
    • запускает приложение Express.js с помощью PM2.

Создание ресурса виртуальной машины

  1. Введите команду 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
    
  2. Подождите, пока процесс может занять несколько минут.

  3. Сохраните значение publicIpAddress из ответа, необходимо просмотреть веб-приложение в браузере и подключиться к виртуальной машине. Если вы потеряете этот IP-адрес, используйте команду Azure CLI, az vm list-ip-addresss , чтобы снова получить его.

  4. Процесс создал ключи SSH и их в расположении, указанном в ответе.

  5. Перейдите в это расположение и создайте 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

Переход к веб-сайту

  1. Используйте общедоступный IP-адрес в веб-браузере, чтобы убедиться, что виртуальная машина доступна и работает. Измените URL-адрес, чтобы он использовал значение из publicIpAddress.

    http://YOUR-VM-PUBLIC-IP-ADDRESS
    
  2. Если ресурс завершит работу с ошибкой шлюза, повторите попытку через минуту, так как веб-приложению может потребоваться время на запуск.

  3. Веб-приложение виртуальной машины возвращает следующие сведения:

    • имя виртуальной машины;
    • IP-адрес клиента;
    • текущие дата и время.

    Снимок экрана веб-браузера с простым приложением, обслуживаемого с виртуальной машины Linus в Azure.

  4. Исходный файл кода для веб-приложения имеет один маршрут, который передается через прокси-сервер 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 и изменение веб-приложения

  1. Подключитесь к удаленной виртуальной машине с помощью следующей команды.

    Замените YOUR-VM-PUBLIC-IP общедоступным IP-адресом вашей виртуальной машины.

    ssh azureuser@YOUR-VM-PUBLIC-IP
    

    Этот процесс предполагает, что ваш клиент SSH может найти ваши SSH-ключи, созданные в ходе создания виртуальной машины и сохраненные на локальном компьютере.

  2. Если вы спрашиваете, хотите ли вы подключиться, ответить y или yes продолжить.

  3. Используйте следующую команду, чтобы понять, в какой папке виртуальной машины вы находитесь. Вы должны находиться в корне azureuser: /home/azureuser.

    pwd
    
  4. По завершении подключения запрос терминала должен изменить имя пользователя и имя ресурса удаленной виртуальной машины.

    azureuser@demo-vm:
    
  5. Веб-приложение располагается в подкаталоге myapp. Перейдите в каталог myapp и отобразите его содержимое:

    cd myapp && ls -l
    
  6. Вы увидите содержимое, представляющее репозиторий 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 для мониторинга

  1. В терминале SSH, подключенном к виртуальной машине, установите клиентскую библиотеку Пакета SDK Azure для Application Insights.

    sudo npm install --save applicationinsights
    
  2. Дождитесь завершения команды, прежде чем продолжить.

Добавление ключа инструментирования мониторинга

  1. В терминале SSH, подключенном к вашей виртуальной машине, воспользуйтесь редактором Nano, чтобы открыть файл package.json.

    sudo nano package.json
    
  2. Добавьте переменную среды APPINSIGHTS_INSTRUMENTATIONKEY в начало скрипта Start. В следующем примере замените REPLACE-WITH-YOUR-KEY значением ключа инструментирования.

    "start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
    
  3. Так же в терминале SSH сохраните файл в редакторе Nano, нажав клавиши CTRL + X.

  4. Если появится запрос в редакторе Nano, введите Y , чтобы сохранить.

  5. Если появится запрос в редакторе Nano, примите имя файла при появлении запроса.

Остановка виртуальной машины для изменения приложения

Клиентская библиотека Azure теперь располагается в каталоге node_modules, а ключ был передан в приложение в виде переменной среды. Следующий шаг программно использует Application Insights.

  1. Остановите PM2, который является диспетчером производственных процессов для приложений Node.js, с помощью следующих команд:

    sudo npm run-script stop 
    
  2. Замените исходный index.js файл с помощью Application Insights.

    sudo npm run-script appinsights
    
  3. Клиентская библиотека и код ведения журнала предоставляются для вас.

    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()}`)
    })
    
  4. Перезапустите приложение с помощью PM2, чтобы выбрать следующую переменную среды.

    sudo npm start
    

Использование приложения для проверки ведения журнала

  1. В веб-браузере протестируйте приложение с новым маршрутом 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
  1. Так же в терминале SSH просмотрите журнал виртуальной машины для службы прокси-сервера NGINX с помощью следующей команды:
cat /var/log/nginx/access.log
  1. Журнал включает сведения о вызове с локального компьютера.
"GET /trace HTTP/1.1" 200 10 "-"

Просмотр журнала для PM2

Виртуальная машина собирает журналы для PM2, которые доступны для просмотра.

Service Расположение журнала
PM2 /var/log/pm2.log
  1. Просмотрите журнал виртуальной машины для службы PM2, которая является вашим веб-приложением Node Express.js. В той же оболочке Bash воспользуйтесь следующей командой, чтобы просмотреть журнал:

    cat /var/log/pm2.log
    
  2. Журнал включает сведения о вызове с локального компьютера.

    grep "Hello world app listening on port 3000!" /var/log/pm2.log
    
  3. Журнал также содержит переменные среды, в том числе ключ 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.

Пример кода

Следующие шаги