Share via


Skapa Express.js virtuell dator med Hjälp av Azure CLI

I den här självstudien skapar du en virtuell Linux-dator (VM) för en Express.js app. Den virtuella datorn har konfigurerats med en cloud-init-konfigurationsfil och innehåller NGINX och en GitHub-lagringsplats för en Express.js app. Anslut till den virtuella datorn med SSH ändrar du webbappen till att inkludera spårningsloggning och visar den offentliga Express.js serverappen i en webbläsare.

Vägledningen innehåller följande uppgifter:

  • Logga in på Azure med Azure CLI
  • Skapa en virtuell Azure Linux-resurs med Azure CLI
    • Öppna offentlig port 80
    • Installera demo Express.js webbapp från en GitHub-lagringsplats
    • Installera beroenden för webbappar
    • Starta webbapp
  • Skapa Azure Monitoring-resurs med Azure CLI
    • Anslut till virtuell dator med SSH
    • Installera Azure SDK-klientbiblioteket med npm
    • Lägga till Application Insights-klientbibliotekskod för att skapa anpassad spårning
  • Visa webbapp från webbläsare
    • Begära /trace väg för att generera anpassad spårning i Application Insights-loggen
    • Visa antalet spårningar som samlats in i loggen med Azure CLI
    • Visa lista över spårningar med Azure-portalen
  • Ta bort resurser med Azure CLI

Skapa eller använda en befintlig Azure-prenumeration

Du behöver ett Azure-användarkonto med en aktiv prenumeration. Skapa en kostnadsfritt.

Förutsättningar

  • SSH för att ansluta till den virtuella datorn: Använd Azure Cloud Shell eller en modern terminal, till exempel bash shell, som innehåller SSH.

1. Skapa Application Insights-resurs för webbsidor

Skapa en Azure-resursgrupp för alla dina Azure-resurser och en Monitor-resurs för att samla in webbappens loggfiler till Azure-molnet. När du skapar en resursgrupp kan du enkelt hitta resurserna och ta bort dem när du är klar. Azure Monitor är namnet på Azure-tjänsten, medan Application Insights är namnet på klientbiblioteket som används i självstudien.

  1. Valfritt om du har fler än en prenumeration använder du az account set för att ange standardprenumerationen innan du slutför de återstående kommandona.

    az account set \
        --subscription "ACCOUNT NAME OR ID" 
    
  2. Skapa en Azure-resursgrupp med az group create. Använd namnet rg-demo-vm-eastus:

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

Skapa Azure Monitor-resurs med Azure CLI

  1. Installera Application Insights-tillägget till Azure CLI.

    az extension add -n application-insights
    
  2. Använd följande kommando för att skapa en övervakningsresurs med 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. Kopiera resultatet från utdata, du behöver det värdet som ditt instrumentationKey senare.

  4. Låt terminalen vara öppen. Du använder den i nästa steg.

2. Skapa en virtuell Linux-dator med Azure CLI

Använder en cloud-init-konfigurationsfil för att skapa både den omvända NGINX-proxyservern och Express.js-servern. NGINX används för att vidarebefordra Express.js port (3000) till den offentliga porten (80).

  1. Skapa en lokal fil med namnet cloud-init-github.txt och spara följande innehåll i filen, eller så kan du spara lagringsplatsens fil på den lokala datorn. Den molniniterade filen måste finnas i samma mapp som terminalsökvägen för dina Azure CLI-kommandon.

    #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. Granska avsnittet i runcmd filen för att förstå vad den gör.

    Har runcmd flera uppgifter:

    • Ladda ned Node.js och installera den
    • Klona exempellagringsplatsen Express.js från GitHub till myapp katalogen
    • Installera programberoenden
    • Starta Express.js-appen med PM2

Skapa en virtuell datorresurs

  1. Ange Azure CLI-kommandot az vm create i en terminal för att skapa en Azure-resurs för en virtuell Linux-dator. Kommandot skapar den virtuella datorn från filen cloud-init och genererar SSH-nycklarna åt dig. Kommandot som körs visar var nycklarna lagras.

    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. Vänta medan processen kan ta några minuter.

  3. Behåll publicIpAddress-värdet från svaret, det behövs för att visa webbappen i en webbläsare och för att ansluta till den virtuella datorn. Om du förlorar den här IP-adressen använder du Azure CLI-kommandot az vm list-ip-addresses för att hämta den igen.

  4. Processen skapade SSH-nycklar och men de på en plats som anges i svaret.

  5. Gå till den platsen och skapa authorized_keys filen:

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

Öppna port för virtuell dator

När den virtuella datorn först skapas har den inga öppna portar. Öppna port 80 med följande Azure CLI-kommando, az vm open-port så att webbappen är offentligt tillgänglig:

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

Bläddra till webbplatsen

  1. Använd den offentliga IP-adressen i en webbläsare för att kontrollera att den virtuella datorn är tillgänglig och körs. Ändra URL:en så att värdet används från publicIpAddress.

    http://YOUR-VM-PUBLIC-IP-ADDRESS
    
  2. Om resursen misslyckas med ett gatewayfel kan det ta en minut att starta webbappen igen om en minut.

  3. Den virtuella datorns webbapp returnerar följande information:

    • VM-namn
    • Klientens IP-adress
    • Aktuellt datum/tid

    Skärmbild av webbläsare som visar enkel app som hanteras från den virtuella Linus-datorn i Azure.

  4. Den första kodfilen för webbappen har en enda väg som passerade via NGINX-proxyn.

    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. Anslut till en virtuell Linux-dator med hjälp av SSH

I det här avsnittet av självstudien använder du SSH i en terminal för att ansluta till den virtuella datorn. SSH är ett vanligt verktyg med många moderna gränssnitt, inklusive Azure Cloud Shell.

Anslut med SSH och ändra webbapp

  1. Anslut till den virtuella fjärrdatorn med följande kommando.

    Ersätt YOUR-VM-PUBLIC-IP med den egna virtuella datorns offentliga IP-adress.

    ssh azureuser@YOUR-VM-PUBLIC-IP
    

    Den här processen förutsätter att SSH-klienten kan hitta dina SSH-nycklar, som skapats som en del av skapandet av den virtuella datorn och placerats på den lokala datorn.

  2. Om du tillfrågas om du är säker på att du vill ansluta, svara y eller yes fortsätta.

  3. Använd följande kommando för att förstå var du befinner dig på den virtuella datorn. Du bör ha azureuser-roten: /home/azureuser.

    pwd
    
  4. När anslutningen är klar bör terminalprompten ändras för att ange användarnamnet och resursnamnet för den virtuella fjärrdatorn.

    azureuser@demo-vm:
    
  5. Webbappen finns i underkatalogen, myapp. Ändra till katalogen myapp och lista innehållet:

    cd myapp && ls -l
    
  6. Du bör se innehåll som representerar GitHub-lagringsplatsen klonad till den virtuella datorn och npm-paketfilerna:

    -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
    

Installera Övervaknings-SDK

  1. Installera Azure SDK-klientbiblioteket för Application Insights i SSH-terminalen, som är ansluten till den virtuella datorn.

    sudo npm install --save applicationinsights
    
  2. Vänta tills kommandot har slutförts innan du fortsätter.

Lägg till instrumentationsnyckel för övervakning

  1. I SSH-terminalen, som är ansluten till den virtuella datorn, använder du Nano-redigeraren för att öppna package.json filen.

    sudo nano package.json
    
  2. Lägg till en APPINSIGHTS_INSTRUMENTATIONKEY miljövariabel i början av startskriptet. I följande exempel ersätter du REPLACE-WITH-YOUR-KEY med värdet för instrumentationsnyckeln.

    "start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
    
  3. Spara filen i Nano-redigeraren med kontroll + X i SSH-terminalen.

  4. Om du uppmanas till det i Nano-redigeraren anger du Y för att spara.

  5. Om du uppmanas att göra det i Nano-redigeraren godkänner du filnamnet när du uppmanas till det.

Stoppa virtuell dator för att ändra programmet

Azure-klientbiblioteket finns nu i din node_modules-katalog och nyckeln skickas till appen som en miljövariabel. I nästa steg används Application Insights programmatiskt.

  1. Stoppa PM2, som är en produktionsprocesshanterare för Node.js program, med följande kommandon:

    sudo npm run-script stop 
    
  2. Ersätt originalet index.js med filen med Application Insights.

    sudo npm run-script appinsights
    
  3. Klientbiblioteket och loggningskoden tillhandahålls åt dig.

    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. Starta om appen med PM2 för att hämta nästa miljövariabel.

    sudo npm start
    

Använda appen för att verifiera loggning

  1. Testa appen med den nya trace vägen i en webbläsare:

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

    Webbläsaren visar svaret trace route demo-vm YOUR-CLIENT-IP VM-DATE-TIME med din IP-adress.

Visa loggen för NGINX

Den virtuella datorn (VM) samlar in loggar för NGINX, som är tillgängliga att visa.

Tjänst Loggplats
NGINX /var/log/nginx/access.log
  1. Fortfarande i SSH-terminalen visar du VM-loggen för NGINX-proxytjänsten med följande kommando för att visa loggen:
cat /var/log/nginx/access.log
  1. Loggen innehåller anropet från den lokala datorn.
"GET /trace HTTP/1.1" 200 10 "-"

Visa loggen för PM2

Den virtuella datorn samlar in loggar för PM2, som är tillgängliga att visa.

Tjänst Loggplats
PM2 /var/log/pm2.log
  1. Visa VM-loggen för PM2-tjänsten, som är din Express.js Node-webbapp. I samma bash-gränssnitt använder du följande kommando för att visa loggen:

    cat /var/log/pm2.log
    
  2. Loggen innehåller anropet från den lokala datorn.

    grep "Hello world app listening on port 3000!" /var/log/pm2.log
    
  3. Loggen innehåller även dina miljövariabler, inklusive din ApplicationInsights-nyckel, som skickas i npm-startskriptet. använd följande grep-kommando för att kontrollera att nyckeln finns i miljövariablerna.

    grep APPINSIGHTS_INSTRUMENTATIONKEY /var/log/pm2.log
    

    Då visas PM2-loggen med APPINSIGHTS_INSTRUMENTATIONKEY markerad i en annan färg.

Loggning av virtuella datorer och molnloggning

I det här programmet skriver du console.log meddelandena i PM2-loggarna som endast finns på den virtuella datorn. Om du tar bort loggarna eller den virtuella datorn förlorar du den informationen.

Om du vill behålla loggarna utanför den virtuella datorns livslängd använder du Application Insights.

5. Rensa resurser

När du har slutfört den här självstudien måste du ta bort resursgruppen, som innehåller alla dess resurser för att se till att du inte debiteras för mer användning.

I samma terminal använder du Azure CLI-kommandot az group delete för att ta bort resursgruppen:

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

Det här kommandot tar några minuter.

Felsökning

Om du har problem använder du följande tabell för att förstå hur du löser problemet:

Problem Åtgärd
502 Gateway-fel Detta kan tyda på att din index.js- eller package.js-fil har ett fel. Mer information finns i PM2-loggarna./var/log/pm2.log Det senaste felet finns längst ned i filen. Om du är säker på att filerna är korrekta stoppar du och startar PM2 med npm-skripten i package.json.

Exempelkod

Nästa steg