Vytvoření virtuálního počítače Express.js pomocí Azure CLI

V tomto kurzu vytvořte virtuální počítač s Linuxem pro aplikaci Express.js. Virtuální počítač je nakonfigurovaný s konfiguračním souborem cloud-init a zahrnuje NGINX a úložiště GitHubu pro aplikaci Express.js. Připojení k virtuálnímu počítači pomocí SSH, změňte webovou aplikaci na protokolování trasování a zobrazte veřejnou serverovou aplikaci Express.js ve webovém prohlížeči.

Tento kurz sestává z následujících úloh:

  • Přihlášení k Azure pomocí Azure CLI
  • Vytvoření prostředku virtuálního počítače Azure s Linuxem pomocí Azure CLI
    • Otevření veřejného portu 80
    • Instalace ukázkové webové aplikace Express.js z úložiště GitHub
    • Instalace závislostí webové aplikace
    • Spuštění webové aplikace
  • Vytvoření prostředku monitorování Azure pomocí Azure CLI
    • Připojení k virtuálnímu počítači pomocí SSH
    • Instalace klientské knihovny Sady Azure SDK pomocí npm
    • Přidání kódu klientské knihovny Přehledy aplikace pro vytvoření vlastního trasování
  • Zobrazení webové aplikace z prohlížeče
    • Žádost o /trace trasu pro generování vlastního trasování v protokolu Přehledy aplikace
    • Zobrazení počtu trasování shromážděných v protokolu pomocí Azure CLI
    • Zobrazení seznamu trasování pomocí webu Azure Portal
  • Odebrání prostředků pomocí Azure CLI

Vytvoření nebo použití existujícího předplatného Azure

Budete potřebovat uživatelský účet Azure s aktivním předplatným. Vytvořte si ho zdarma.

Požadavky

  • Připojení k virtuálnímu počítači přes SSH: Použijte Azure Cloud Shell nebo moderní terminál, jako je prostředí Bash, které zahrnuje SSH.

1. Vytvoření prostředku Přehledy aplikace pro webové stránky

Vytvořte skupinu prostředků Azure pro všechny prostředky Azure a prostředek monitoru, abyste mohli shromažďovat soubory protokolů vaší webové aplikace do cloudu Azure. Vytvoření skupiny prostředků vám umožní snadno najít prostředky a po dokončení je odstranit. Azure Monitor je název služby Azure, zatímco aplikační Přehledy je název klientské knihovny, která kurz používá.

  1. Volitelné, pokud máte více než jedno předplatné, před dokončením zbývajících příkazů nastavte výchozí předplatné pomocí příkazu az account set .

    az account set \
        --subscription "ACCOUNT NAME OR ID" 
    
  2. Vytvořte skupinu prostředků Azure pomocí příkazu az group create. Použijte název rg-demo-vm-eastus:

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

Vytvoření prostředku Azure Monitoru pomocí Azure CLI

  1. Nainstalujte rozšíření application Přehledy do Azure CLI.

    az extension add -n application-insights
    
  2. Pomocí následujícího příkazu vytvořte monitorovací prostředek pomocí příkazu 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. Zkopírujte výsledek z výstupu. Tuto hodnotu budete potřebovat pozdějiinstrumentationKey.

  4. Nechte terminál otevřený, použijete ho v dalším kroku.

2. Vytvoření virtuálního počítače s Linuxem pomocí Azure CLI

Pomocí konfiguračního souboru cloud-init vytvoří reverzní proxy server NGINX i server Express.js. NGINX se používá k přesměrování portu Express.js (3000) na veřejný port (80).

  1. Vytvořte místní soubor s názvem cloud-init-github.txt a uložte do něj následující obsah nebo soubor úložiště můžete uložit do místního počítače. Formátovaný soubor cloud-init musí existovat ve stejné složce jako cesta terminálu pro příkazy 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 Projděte si část souboru a zjistěte, co dělá.

    runcmd několik úkolů:

    • Stáhněte si Node.js a nainstalujte ho.
    • Klonování ukázkového úložiště Express.js z GitHubu do myapp adresáře
    • Instalace závislostí aplikace
    • Spuštění aplikace Express.js pomocí PM2

Vytvoření prostředku virtuálního počítače

  1. Zadejte příkaz Azure CLI, az vm create, v terminálu a vytvořte prostředek Azure virtuálního počítače s Linuxem. Příkaz vytvoří virtuální počítač ze souboru cloud-init a vygeneruje klíče SSH za vás. Spuštěný příkaz zobrazí, kde jsou klíče uložené.

    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. Počkejte, než proces může trvat několik minut.

  3. Ponechte hodnotu publicIpAddress z odpovědi, je potřeba zobrazit webovou aplikaci v prohlížeči a připojit se k virtuálnímu počítači. Pokud tuto IP adresu ztratíte, použijte příkaz Azure CLI, az vm list-ip-addresses a získejte ji znovu.

  4. Proces vytvořil klíče SSH, ale v umístění uvedené v odpovědi.

  5. Přejděte do daného umístění a vytvořte authorized_keys soubor:

    cd <SSH-KEY-LOCATION> && cat id_rsa >> authorized_keys
    

Otevření portu pro virtuální počítač

Při prvním vytvoření nemá virtuální počítač žádné otevřené porty. Otevřete port 80 pomocí následujícího příkazu Azure CLI, az vm open-port, aby byla webová aplikace veřejně dostupná:

az vm open-port \
  --port 80 \
  --resource-group rg-demo-vm-eastus \
  --name demo-vm

Přejít na web

  1. Pomocí veřejné IP adresy ve webovém prohlížeči se ujistěte, že je virtuální počítač dostupný a spuštěný. Změňte adresu URL tak, aby používala hodnotu z publicIpAddress.

    http://YOUR-VM-PUBLIC-IP-ADDRESS
    
  2. Pokud prostředek selže s chybou brány, zkuste to za minutu znovu, může spuštění webové aplikace chvíli trvat.

  3. Webová aplikace virtuálního počítače vrátí následující informace:

    • název virtuálního počítače
    • IP adresa vašeho klienta
    • Aktuální datum a čas

    Screenshot of web browser showing simple app served from Linus virtual machine on Azure.

  4. Počáteční soubor kódu pro webovou aplikaci má jednu trasu, která prošla přes proxy server 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. Připojení k virtuálnímu počítači s Linuxem pomocí SSH

V této části kurzu se pomocí SSH v terminálu připojte k virtuálnímu počítači. SSH je běžný nástroj poskytovaný mnoha moderními prostředími, včetně Azure Cloud Shellu.

Připojení s protokolem SSH a změnou webové aplikace

  1. Připojení ke vzdálenému virtuálnímu počítači pomocí následujícího příkazu.

    Nahraďte YOUR-VM-PUBLIC-IP veřejnou IP adresou vašeho virtuálního počítače.

    ssh azureuser@YOUR-VM-PUBLIC-IP
    

    Tento proces předpokládá, že váš klient SSH může najít klíče SSH, vytvořené jako součást vytvoření virtuálního počítače a umístěné na místním počítači.

  2. Pokud se zobrazí dotaz, jestli se opravdu chcete připojit, odpovězte y nebo yes pokračujte.

  3. Pomocí následujícího příkazu zjistěte, kde se nacházíte na virtuálním počítači. Měli byste být v kořenovém adresáři azureuser: /home/azureuser.

    pwd
    
  4. Po dokončení připojení by se měl příkazový řádek terminálu změnit a indikovat uživatelské jméno a název prostředku vzdáleného virtuálního počítače.

    azureuser@demo-vm:
    
  5. Vaše webová aplikace je v podadresáři. myapp Přejděte do myapp adresáře a vypíšete jeho obsah:

    cd myapp && ls -l
    
  6. Měli byste vidět obsah představující úložiště GitHub naklonované do virtuálního počítače a soubory balíčků 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
    

Instalace sady SDK pro monitorování

  1. V terminálu SSH, který je připojený k virtuálnímu počítači, nainstalujte klientskou knihovnu Azure SDK pro službu Application Přehledy.

    sudo npm install --save applicationinsights
    
  2. Než budete pokračovat, počkejte na dokončení příkazu.

Přidání klíče instrumentace monitorování

  1. V terminálu SSH, který je připojený k virtuálnímu počítači, otevřete soubor pomocí editoru package.json Nano.

    sudo nano package.json
    
  2. Přidejte proměnnou APPINSIGHTS_INSTRUMENTATIONKEY prostředí na začátek skriptu Start . V následujícím příkladu nahraďte REPLACE-WITH-YOUR-KEY hodnotou klíče instrumentace.

    "start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
    
  3. V terminálu SSH uložte soubor v editoru Nano pomocí ovládacího prvku + X.

  4. Pokud se zobrazí výzva v editoru Nano, zadejte Y , abyste ho uložili.

  5. Pokud se zobrazí výzva v editoru Nano, přijměte název souboru po zobrazení výzvy.

Zastavení změny aplikace virtuálního počítače

Klientská knihovna Azure je teď ve vašem node_modules adresáři a klíč se předá do aplikace jako proměnná prostředí. Další krok programově používá Přehledy aplikace.

  1. Stop PM2, což je správce produkčních procesů pro aplikace Node.js, s následujícími příkazy:

    sudo npm run-script stop 
    
  2. Nahraďte originál index.js souborem pomocí Přehledy aplikace.

    sudo npm run-script appinsights
    
  3. Klientská knihovna a kód protokolování jsou k dispozici za vás.

    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. Restartujte aplikaci pomocí pm2, aby se vybrala další proměnná prostředí.

    sudo npm start
    

Použití aplikace k ověření protokolování

  1. Ve webovém prohlížeči otestujte aplikaci pomocí nové trace trasy:

    http://YOUR-VM-PUBLIC-IP-ADDRESS/trace
    

    Prohlížeč zobrazí odpověď trace route demo-vm YOUR-CLIENT-IP VM-DATE-TIME s vaší IP adresou.

Zobrazení protokolu pro NGINX

Virtuální počítač shromažďuje protokoly pro NGINX, které jsou k dispozici pro zobrazení.

Service Umístění protokolu
NGINX /var/log/nginx/access.log
  1. V terminálu SSH zobrazte protokol virtuálního počítače pro proxy službu NGINX pomocí následujícího příkazu pro zobrazení protokolu:
cat /var/log/nginx/access.log
  1. Protokol zahrnuje volání z místního počítače.
"GET /trace HTTP/1.1" 200 10 "-"

Zobrazení protokolu pm2

Virtuální počítač shromažďuje protokoly pm2, které jsou k dispozici k zobrazení.

Service Umístění protokolu
PM2 /var/log/pm2.log
  1. Zobrazte protokol virtuálního počítače pro službu PM2, což je vaše webová aplikace Express.js Node. Ve stejném prostředí Bash zobrazte protokol pomocí následujícího příkazu:

    cat /var/log/pm2.log
    
  2. Protokol zahrnuje volání z místního počítače.

    grep "Hello world app listening on port 3000!" /var/log/pm2.log
    
  3. Protokol obsahuje také proměnné prostředí, včetně klíče application Přehledy předaného ve spouštěcím skriptu npm. Pomocí následujícího příkazu grep ověřte, že váš klíč je v proměnných prostředí.

    grep APPINSIGHTS_INSTRUMENTATIONKEY /var/log/pm2.log
    

    Zobrazí se protokol PM2 se APPINSIGHTS_INSTRUMENTATIONKEY zvýrazněnou jinou barvou.

Protokolování virtuálních počítačů a protokolování cloudu

V této aplikaci pomocí console.log zápisu zpráv do protokolů PM2 nalezených pouze na virtuálním počítači. Pokud odstraníte protokoly nebo virtuální počítač, ztratíte tyto informace.

Pokud chcete protokoly uchovávat i po dobu životnosti virtuálního počítače, použijte Přehledy aplikace.

5. Vyčištění prostředků

Po dokončení tohoto kurzu je potřeba odebrat skupinu prostředků, která obsahuje všechny její prostředky, abyste měli jistotu, že se vám neúčtuje žádné další využití.

Ve stejném terminálu pomocí příkazu Azure CLI az group delete odstraňte skupinu prostředků:

az group delete --name rg-demo-vm-eastus -y

Tento příkaz trvá několik minut.

Řešení problému

Pokud máte problémy, použijte následující tabulku, abyste pochopili, jak problém vyřešit:

Problém Rozlišení
Chyba brány 502 To může znamenat, že soubor index.js nebo package.js obsahuje chybu. Další informace najdete v /var/log/pm2.log protokolech PM2. Poslední chyba je v dolní části souboru. Pokud jste si jisti, že jsou tyto soubory správné, zastavte a spusťte PM2 pomocí skriptů npm v package.jsonsouboru .

Ukázkový kód

Další kroky