Een Express.js virtuele machine maken met behulp van Azure CLI

In deze zelfstudie maakt u een virtuele Linux-machine (VM) voor een Express.js-app. De VIRTUELE machine is geconfigureerd met een cloud-init-configuratiebestand en bevat NGINX en een GitHub-opslagplaats voor een Express.js-app. Verbinding maken naar de virtuele machine met SSH, wijzigt u de web-app in het opnemen van traceringslogboeken en bekijkt u de openbare Express.js server-app in een webbrowser.

Deze zelfstudie bevat de volgende taken:

  • Aanmelden bij Azure met Azure CLI
  • Een Azure Linux-VM-resource maken met Azure CLI
    • Openbare poort 80 openen
    • Demo-Express.js-web-app installeren vanuit een GitHub-opslagplaats
    • Afhankelijkheden van web-apps installeren
    • Web-app starten
  • Azure Monitoring-resource maken met Azure CLI
    • Verbinding maken naar vm met SSH
    • Azure SDK-clientbibliotheek installeren met npm
    • Application Insights-clientbibliotheekcode toevoegen om aangepaste tracering te maken
  • Web-app weergeven vanuit browser
    • Route aanvragen /trace om aangepaste tracering te genereren in het Application Insights-logboek
    • Aantal traceringen weergeven dat is verzameld in logboek met Azure CLI
    • Lijst met traceringen weergeven met Azure Portal
  • Resources verwijderen met Azure CLI

Een bestaand Azure-abonnement maken of gebruiken

U hebt een Azure-gebruikersaccount met een actief abonnement nodig. Maak gratis een account.

Vereisten

  • SSH om verbinding te maken met de virtuele machine: Gebruik Azure Cloud Shell of een moderne terminal, zoals bash-shell, die SSH bevat.

1. Application Insights-resource maken voor webpagina's

Maak een Azure-resourcegroep voor al uw Azure-resources en een Monitor-resource om de logboekbestanden van uw web-app te verzamelen in de Azure-cloud. Door een resourcegroep te maken, kunt u de resources eenvoudig vinden en verwijderen wanneer u klaar bent. Azure Monitor is de naam van de Azure-service, terwijl Application Insights de naam is van de clientbibliotheek die in de zelfstudie wordt gebruikt.

  1. Als u meer dan één abonnement hebt, gebruikt u az account set om het standaardabonnement in te stellen voordat u de resterende opdrachten voltooit.

    az account set \
        --subscription "ACCOUNT NAME OR ID" 
    
  2. Maak een Azure-resourcegroep met az group create. Gebruik de naam rg-demo-vm-eastus:

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

Azure Monitor-resource maken met Azure CLI

  1. Installeer de Application Insights-extensie in de Azure CLI.

    az extension add -n application-insights
    
  2. Gebruik de volgende opdracht om een bewakingsresource te maken met 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. Kopieer het resultaat uit de uitvoer. U hebt deze waarde instrumentationKey later nodig.

  4. Laat de terminal open, u gebruikt deze in de volgende stap.

2. Een virtuele Linux-machine maken met behulp van Azure CLI

Maakt gebruik van een cloud-init-configuratiebestand om zowel de omgekeerde proxyserver NGINX als de Express.js-server te maken. NGINX wordt gebruikt om de Express.js poort (3000) door te sturen naar de openbare poort (80).

  1. Maak een lokaal bestand met de naam cloud-init-github.txt en sla de volgende inhoud op in het bestand of u kunt het bestand van de opslagplaats opslaan op uw lokale computer. Het init-geformatteerde bestand in de cloud moet zich in dezelfde map bevinden als het terminalpad voor uw Azure CLI-opdrachten.

    #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. Bekijk de sectie van het runcmd bestand om te begrijpen wat het doet.

    De runcmd heeft verschillende taken:

    • Download Node.js en installeer deze
    • Kloon de voorbeeldopslagplaats Express.js vanuit GitHub naar myapp map
    • De toepassingsafhankelijkheden installeren
    • De Express.js-app starten met PM2

Een virtuele-machineresource maken

  1. Voer de Azure CLI-opdracht az vm create in een terminal in om een Azure-resource van een virtuele Linux-machine te maken. Met de opdracht wordt de VIRTUELE machine gemaakt op basis van het cloud-init-bestand en worden de SSH-sleutels voor u gegenereerd. Met de actieve opdracht wordt weergegeven waar de sleutels zijn opgeslagen.

    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. Wacht tot het proces enkele minuten kan duren.

  3. Bewaar de publicIpAddress-waarde uit het antwoord. Het is nodig om de web-app in een browser weer te geven en verbinding te maken met de virtuele machine. Als u dit IP-adres kwijtraakt, gebruikt u de Azure CLI-opdracht az vm list-ip-addresses om het opnieuw op te halen.

  4. Het proces heeft SSH-sleutels gemaakt en deze op een locatie vermeld in het antwoord.

  5. Ga naar die locatie en maak het authorized_keys bestand:

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

Poort openen voor virtuele machine

Wanneer de virtuele machine voor het eerst is gemaakt, heeft de virtuele machine geen geopende poorten. Open poort 80 met de volgende Azure CLI-opdracht az vm open-port , zodat de web-app openbaar beschikbaar is:

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

Naar website bladeren

  1. Gebruik het openbare IP-adres in een webbrowser om ervoor te zorgen dat de virtuele machine beschikbaar is en wordt uitgevoerd. Wijzig de URL van waaruit de waarde wordt publicIpAddressgebruikt.

    http://YOUR-VM-PUBLIC-IP-ADDRESS
    
  2. Als de resource mislukt met een gatewayfout, probeert u het over een minuut opnieuw. Het kan even duren voordat de web-app wordt gestart.

  3. De web-app van de virtuele machine retourneert de volgende informatie:

    • VM-naam
    • Het IP-adres van uw client
    • Huidige datum/tijd

    Schermopname van de webbrowser met een eenvoudige app die wordt geleverd vanuit de virtuele Linus-machine in Azure.

  4. Het eerste codebestand voor de web-app heeft één route, die wordt doorgegeven via de NGINX-proxy.

    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. Verbinding maken naar virtuele Linux-machine met behulp van SSH

In deze sectie van de zelfstudie gebruikt u SSH in een terminal om verbinding te maken met uw virtuele machine. SSH is een algemeen hulpprogramma dat wordt geleverd met veel moderne shells, waaronder De Azure Cloud Shell.

Verbinding maken met SSH en web-app wijzigen

  1. Verbinding maken met de volgende opdracht naar uw externe virtuele machine.

    Vervang door YOUR-VM-PUBLIC-IP het openbare IP-adres van uw eigen virtuele machine.

    ssh azureuser@YOUR-VM-PUBLIC-IP
    

    Bij dit proces wordt ervan uitgegaan dat uw SSH-client uw SSH-sleutels kan vinden, die zijn gemaakt als onderdeel van het maken van uw VIRTUELE machine en op uw lokale computer zijn geplaatst.

  2. Als u wordt gevraagd of u zeker weet dat u verbinding wilt maken, beantwoordt y of yes wilt doorgaan.

  3. Gebruik de volgende opdracht om te begrijpen waar u zich op de virtuele machine bevindt. U moet de hoofdmap van de azureuser zijn: /home/azureuser.

    pwd
    
  4. Wanneer de verbinding is voltooid, moet de terminalprompt worden gewijzigd om de gebruikersnaam en resourcenaam van de externe virtuele machine aan te geven.

    azureuser@demo-vm:
    
  5. Uw web-app bevindt zich in de submap. myapp Ga naar de myapp map en vermeld de inhoud:

    cd myapp && ls -l
    
  6. U ziet nu de inhoud die de GitHub-opslagplaats vertegenwoordigt die is gekloond naar de virtuele machine en de npm-pakketbestanden:

    -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
    

Bewakings-SDK installeren

  1. Installeer in de SSH-terminal, die is verbonden met uw virtuele machine, de Azure SDK-clientbibliotheek voor Application Insights.

    sudo npm install --save applicationinsights
    
  2. Wacht totdat de opdracht is voltooid voordat u doorgaat.

Controle-instrumentatiesleutel toevoegen

  1. Gebruik in de SSH-terminal, die is verbonden met uw virtuele machine, de Nano-editor om het package.json bestand te openen.

    sudo nano package.json
    
  2. Voeg een APPINSIGHTS_INSTRUMENTATIONKEY omgevingsvariabele toe aan het begin van het startscript . Vervang in het volgende voorbeeld door REPLACE-WITH-YOUR-KEY de waarde van de instrumentatiesleutel.

    "start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
    
  3. Sla het bestand in de Nano-editor op in de SSH-terminal met control + X.

  4. Als u hierom wordt gevraagd in de Nano-editor, voert u Y in om op te slaan.

  5. Als u hierom wordt gevraagd in de Nano-editor, accepteert u de bestandsnaam wanneer u hierom wordt gevraagd.

Vm stoppen om de toepassing te wijzigen

De Azure-clientbibliotheek bevindt zich nu in uw node_modules map en de sleutel wordt als omgevingsvariabele doorgegeven aan de app. De volgende stap maakt programmatisch gebruik van Application Insights.

  1. Stop PM2, een productieprocesmanager voor Node.js toepassingen, met de volgende opdrachten:

    sudo npm run-script stop 
    
  2. Vervang het origineel index.js door een bestand met Application Insights.

    sudo npm run-script appinsights
    
  3. De clientbibliotheek en logboekregistratiecode worden voor u verstrekt.

    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. Start de app opnieuw met PM2 om de volgende omgevingsvariabele op te halen.

    sudo npm start
    

App gebruiken om logboekregistratie te verifiëren

  1. Test de app in een webbrowser met de nieuwe trace route:

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

    De browser geeft het antwoord weer, trace route demo-vm YOUR-CLIENT-IP VM-DATE-TIME met uw IP-adres.

Het logboek voor NGINX weergeven

De virtuele machine (VM) verzamelt logboeken voor NGINX, die beschikbaar zijn om weer te geven.

Service Logboeklocatie
NGINX /var/log/nginx/access.log
  1. Nog steeds in de SSH-terminal bekijkt u het VM-logboek voor de NGINX-proxyservice met de volgende opdracht om het logboek weer te geven:
cat /var/log/nginx/access.log
  1. Het logboek bevat de aanroep van uw lokale computer.
"GET /trace HTTP/1.1" 200 10 "-"

Het logboek voor PM2 weergeven

De virtuele machine verzamelt logboeken voor PM2, die beschikbaar zijn om weer te geven.

Service Logboeklocatie
PM2 /var/log/pm2.log
  1. Bekijk het VM-logboek voor de PM2-service. Dit is uw Express.js Node-web-app. Gebruik in dezelfde bash-shell de volgende opdracht om het logboek weer te geven:

    cat /var/log/pm2.log
    
  2. Het logboek bevat de aanroep van uw lokale computer.

    grep "Hello world app listening on port 3000!" /var/log/pm2.log
    
  3. Het logboek bevat ook uw omgevingsvariabelen, waaronder uw ApplicationInsights-sleutel, die zijn doorgegeven in het npm-startscript. gebruik de volgende grep-opdracht om te controleren of uw sleutel zich in de omgevingsvariabelen bevindt.

    grep APPINSIGHTS_INSTRUMENTATIONKEY /var/log/pm2.log
    

    Hiermee wordt uw PM2-logboek weergegeven met APPINSIGHTS_INSTRUMENTATIONKEY gemarkeerd in een andere kleur.

VM-logboekregistratie en cloudlogboekregistratie

In deze toepassing schrijft u console.log de berichten naar de PM2-logboeken die alleen op de VIRTUELE machine zijn gevonden. Als u de logboeken of de VIRTUELE machine verwijdert, verliest u die informatie.

Als u de logboeken na de levensduur van uw virtuele machine wilt behouden, gebruikt u Application Insights.

5. Resources opschonen

Nadat u deze zelfstudie hebt voltooid, moet u de resourcegroep verwijderen, die alle bijbehorende resources bevat om ervoor te zorgen dat er geen kosten meer in rekening worden gebracht voor gebruik.

Gebruik in dezelfde terminal de Azure CLI-opdracht az group delete om de resourcegroep te verwijderen:

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

Deze opdracht duurt enkele minuten.

Probleemoplossing

Als u problemen ondervindt, gebruikt u de volgende tabel om te begrijpen hoe u uw probleem kunt oplossen:

Probleem Oplossing
502-gatewayfout Dit kan erop wijzen dat uw index.js of package.js bestand een fout heeft. Bekijk uw PM2-logboeken op /var/log/pm2.log voor meer informatie. De meest recente fout bevindt zich onderaan het bestand. Als u zeker weet dat deze bestanden juist zijn, stopt en start u de PM2 met behulp van de npm-scripts in package.json.

Voorbeeldcode

Volgende stappen