Express.js virtuális gép létrehozása az Azure CLI használatával

Ebben az oktatóanyagban hozzon létre egy Linux rendszerű virtuális gépet (VM) egy Express.js alkalmazáshoz. A virtuális gép egy cloud-init konfigurációs fájllal van konfigurálva, és tartalmaz egy NGINX-et és egy GitHub-adattárat egy Express.js-alkalmazáshoz. Csatlakozás a virtuális gépre SSH-val, módosítsa a webalkalmazást nyomkövetési naplózásra, és tekintse meg a nyilvános Express.js kiszolgálóalkalmazást egy webböngészőben.

Az oktatóanyag a következő feladatokat tartalmazza:

  • Bejelentkezés az Azure-ba az Azure CLI-vel
  • Azure Linux rendszerű virtuálisgép-erőforrás létrehozása az Azure CLI-vel
    • Nyilvános port megnyitása 80
    • Bemutató Express.js webalkalmazás telepítése GitHub-adattárból
    • Webalkalmazás-függőségek telepítése
    • Webalkalmazás indítása
  • Azure Monitoring-erőforrás létrehozása az Azure CLI-vel
    • Csatlakozás virtuális gépre SSH-val
    • Az Azure SDK-ügyfélkódtár telepítése npm használatával
    • Alkalmazáskód hozzáadása Elemzések ügyfélkódtárhoz egyéni nyomkövetés létrehozásához
  • Webalkalmazás megtekintése böngészőből
    • Útvonal kérése /trace egyéni nyomkövetés létrehozásához az alkalmazásnaplóban Elemzések
    • A naplóban gyűjtött nyomkövetések számának megtekintése az Azure CLI-vel
    • Nyomkövetési lista megtekintése az Azure Portalon
  • Erőforrások eltávolítása az Azure CLI-vel

Meglévő Azure-előfizetés létrehozása vagy használata

Aktív előfizetéssel rendelkező Azure-felhasználói fiókra lesz szüksége. Hozzon létre egyet ingyen.

Előfeltételek

  • SSH a virtuális géphez való csatlakozáshoz: Használja az Azure Cloud Shellt vagy egy modern terminált, például a Bash Shellt, amely tartalmazza az SSH-t.

1. Alkalmazás Elemzések-erőforrás létrehozása weblapokhoz

Hozzon létre egy Azure-erőforráscsoportot az összes Azure-erőforráshoz és egy Monitor-erőforráshoz, amely összegyűjti a webalkalmazás naplófájljait az Azure-felhőben. Az erőforráscsoport létrehozása lehetővé teszi az erőforrások egyszerű megtalálását és törlését, ha elkészült. Az Azure Monitor az Azure-szolgáltatás neve, míg az Alkalmazás Elemzések az oktatóanyag által használt ügyfélkódtár neve.

  1. Nem kötelező, ha több előfizetése van, az az account set használatával állítsa be az alapértelmezett előfizetést a többi parancs végrehajtása előtt.

    az account set \
        --subscription "ACCOUNT NAME OR ID" 
    
  2. Hozzon létre egy Azure-erőforráscsoportot az az group create használatával. Használja a következő nevet rg-demo-vm-eastus:

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

Azure Monitor-erőforrás létrehozása az Azure CLI-vel

  1. Telepítse az Application Elemzések bővítményt az Azure CLI-re.

    az extension add -n application-insights
    
  2. Az alábbi paranccsal hozzon létre egy monitorozási erőforrást az az monitor app-insights összetevővel:

    az monitor app-insights component create \
      --app demoWebAppMonitor \
      --location eastus \
      --resource-group rg-demo-vm-eastus \
      --query instrumentationKey --output table
    
  3. Másolja ki az eredményt a kimenetből, és később szüksége lesz erre az értékre instrumentationKey .

  4. Hagyja nyitva a terminált, a következő lépésben fogja használni.

2. Linux rendszerű virtuális gép létrehozása az Azure CLI használatával

Egy cloud-init konfigurációs fájl használatával hozza létre az NGINX fordított proxykiszolgálót és a Express.js-kiszolgálót is. Az NGINX a Express.js portot (3000) a nyilvános portra (80) továbbítja.

  1. Hozzon létre egy helyi fájlt, cloud-init-github.txt és mentse a következő tartalmat a fájlba, vagy mentheti az adattár fájlját a helyi számítógépre. A cloud-init formátumú fájlnak ugyanabban a mappában kell lennie, mint az Azure CLI-parancsok terminál elérési útja.

    #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. Tekintse át a runcmd fájl szakaszát, hogy megértse, mit tesz.

    A runcmd feladat több feladatból áll:

    • Node.js letöltése és telepítése
    • Klónozza a gitHubról a Express.js mintaadattárat a címtárba myapp
    • Az alkalmazásfüggőségek telepítése
    • A Express.js alkalmazás indítása a PM2-vel

Virtuálisgép-erőforrás létrehozása

  1. Adja meg az Azure CLI-parancsot( az vm create) egy terminálon egy Linux rendszerű virtuális gép Azure-erőforrásának létrehozásához. A parancs létrehozza a virtuális gépet a cloud-init fájlból, és létrehozza az SSH-kulcsokat. A futó parancs megjeleníti a kulcsok tárolási helyét.

    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árjon, amíg a folyamat eltarthat néhány percig.

  3. Tartsa meg a nyilvánosIpAddress értéket a választól, a webalkalmazás böngészőben való megtekintéséhez és a virtuális géphez való csatlakozáshoz. Ha elveszíti ezt az IP-címet, használja az Azure CLI-parancsot, az az vm list-ip-addresses parancsot , hogy újra lekérje.

  4. A folyamat SSH-kulcsokat hozott létre, de a válaszban megadott helyen.

  5. Lépjen erre a helyre, és hozza létre a authorized_keys fájlt:

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

Port megnyitása virtuális géphez

Az első létrehozáskor a virtuális gép nem rendelkezik nyitott portok nélkül. Nyissa meg a 80-s portot az alábbi Azure CLI-paranccsal, az az vm open-porttal , hogy a webalkalmazás nyilvánosan elérhető legyen:

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

Tallózás a webhelyre

  1. A webböngésző nyilvános IP-címének használatával győződjön meg arról, hogy a virtuális gép elérhető és fut. Módosítsa az URL-címet a következő érték használatára: .publicIpAddress

    http://YOUR-VM-PUBLIC-IP-ADDRESS
    
  2. Ha az erőforrás átjáróhiba miatt meghiúsul, próbálkozzon újra egy perc múlva, a webalkalmazás indítása eltarthat egy percig.

  3. A virtuális gép webalkalmazása a következő információkat adja vissza:

    • a virtuális gép neve
    • Az ügyfél IP-címe
    • Aktuális dátum/idő

    Képernyőkép a webböngészőről, amelyen az Azure-beli Linus virtuális gépről kiszolgált egyszerű alkalmazás látható.

  4. A webalkalmazás kezdeti kódfájlja egyetlen útvonallal rendelkezik, amely az NGINX-proxyn keresztül halad át.

    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. Csatlakozás Linux rendszerű virtuális gépre SSH használatával

Az oktatóanyag jelen szakaszában az SSH használatával csatlakozhat a virtuális géphez egy terminálban. Az SSH egy gyakori eszköz, amely számos modern felülettel rendelkezik, beleértve az Azure Cloud Shellt is.

Csatlakozás az SSH-val és a webalkalmazás módosítása

  1. Csatlakozás a távoli virtuális gépre az alábbi paranccsal.

    Cserélje le YOUR-VM-PUBLIC-IP a saját virtuális gép nyilvános IP-címére.

    ssh azureuser@YOUR-VM-PUBLIC-IP
    

    Ez a folyamat feltételezi, hogy az SSH-ügyfél megtalálja a virtuális gép létrehozása során létrehozott és a helyi gépen elhelyezett SSH-kulcsokat.

  2. Ha a rendszer megkérdezi, hogy biztosan csatlakozni, válaszolni y vagy yes folytatni szeretné-e a műveletet.

  3. Az alábbi paranccsal megtudhatja, hogy hol van a virtuális gépen. Az azureuser gyökérnél kell lennie: /home/azureuser.

    pwd
    
  4. Ha a kapcsolat befejeződött, a terminálüzenetnek módosítania kell a távoli virtuális gép felhasználónevét és erőforrásnevét.

    azureuser@demo-vm:
    
  5. A webalkalmazás az alkönyvtárban található. myapp Váltson a myapp könyvtárra, és sorolja fel a tartalmat:

    cd myapp && ls -l
    
  6. Látnia kell a GitHub-adattárnak a virtuális gépbe klónozott tartalmát és az npm-csomagfájlokat:

    -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
    

Monitorozási SDK telepítése

  1. A virtuális géphez csatlakoztatott SSH-terminálon telepítse az Azure SDK-ügyfélkódtárat az Application Elemzések számára.

    sudo npm install --save applicationinsights
    
  2. A folytatás előtt várjon, amíg a parancs befejeződik.

Monitorozási eszközkulcs hozzáadása

  1. A virtuális géphez csatlakoztatott SSH-terminálban a Nano-szerkesztő használatával nyissa meg a package.json fájlt.

    sudo nano package.json
    
  2. Adjon hozzá egy környezeti változót APPINSIGHTS_INSTRUMENTATIONKEY a Start-szkript elejéhez. Az alábbi példában cserélje le REPLACE-WITH-YOUR-KEY a rendszerállapotkulcs értékét.

    "start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
    
  3. Az SSH-terminálban mentse a fájlt a Nano-szerkesztőbe az X vezérlővel. +

  4. Ha a Nano-szerkesztő kéri, mentse az Y értéket.

  5. Ha a Nano-szerkesztő kéri, fogadja el a fájlnevet, amikor a rendszer kéri.

A virtuális gép leállítása az alkalmazás módosításához

Az Azure-ügyfélkódtár most már a node_modules könyvtárban van, és a kulcs környezeti változóként kerül az alkalmazásba. A következő lépés programozott módon használja az Alkalmazás Elemzések.

  1. Állítsa le a PM2-t, amely Node.js alkalmazások éles folyamatkezelője, a következő parancsokkal:

    sudo npm run-script stop 
    
  2. Cserélje le az eredetit index.js fájlra az Application Elemzések használatával.

    sudo npm run-script appinsights
    
  3. Az ügyfélkódtár és a naplózási kód meg van adva Önnek.

    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. Indítsa újra az alkalmazást a PM2-vel a következő környezeti változó felvételéhez.

    sudo npm start
    

Alkalmazás használata a naplózás ellenőrzéséhez

  1. Egy webböngészőben tesztelje az alkalmazást az új trace útvonallal:

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

    A böngésző megjeleníti a választ az trace route demo-vm YOUR-CLIENT-IP VM-DATE-TIME Ön IP-címével.

Az NGINX naplójának megtekintése

A virtuális gép (VM) naplókat gyűjt az NGINX-hez, amelyek megtekinthetők.

Szolgáltatás Napló helye
NGINX /var/log/nginx/access.log
  1. Továbbra is az SSH-terminálban tekintse meg az NGINX proxyszolgáltatás virtuálisgép-naplóját az alábbi paranccsal a napló megtekintéséhez:
cat /var/log/nginx/access.log
  1. A napló tartalmazza a helyi számítógépről érkező hívást.
"GET /trace HTTP/1.1" 200 10 "-"

A PM2 naplójának megtekintése

A virtuális gép összegyűjti a PM2 naplóit, amelyek megtekinthetők.

Szolgáltatás Napló helye
PM2 /var/log/pm2.log
  1. Tekintse meg a PM2 szolgáltatás virtuálisgép-naplóját, amely a Express.js Node-webalkalmazás. Ugyanabban a bash-rendszerhéjban a következő paranccsal tekintheti meg a naplót:

    cat /var/log/pm2.log
    
  2. A napló tartalmazza a helyi számítógépről érkező hívást.

    grep "Hello world app listening on port 3000!" /var/log/pm2.log
    
  3. A napló tartalmazza a környezeti változókat is, beleértve az alkalmazás Elemzések kulcsot is, amely az npm kezdőszkriptben van átadva. A következő grep paranccsal ellenőrizze, hogy a kulcs szerepel-e a környezeti változókban.

    grep APPINSIGHTS_INSTRUMENTATIONKEY /var/log/pm2.log
    

    Ekkor a PM2-napló más színnel APPINSIGHTS_INSTRUMENTATIONKEY van kiemelve.

Virtuálisgép-naplózás és felhőnaplózás

Ebben az alkalmazásban console.log az üzeneteket csak a virtuális gépen található PM2-naplókba írja. Ha törli a naplókat vagy a virtuális gépet, elveszíti ezeket az információkat.

Ha a naplókat a virtuális gép élettartamán túl szeretné megőrizni, használja az Alkalmazás Elemzések.

5. Erőforrások eltávolítása

Miután elvégezte ezt az oktatóanyagot, el kell távolítania az erőforráscsoportot, amely tartalmazza az összes erőforrást, hogy biztosan ne kelljen többet fizetnie a használatért.

Ugyanabban a terminálban az Azure CLI-parancs, az az group delete paranccsal törölje az erőforráscsoportot:

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

Ez a parancs néhány percet vesz igénybe.

Hibaelhárítás

Ha problémákat tapasztal, az alábbi táblázat segítségével megtudhatja, hogyan háríthatja el a problémát:

Probléma Resolution (Osztás)
502-átjáróhiba Ez azt jelezheti, hogy a index.js vagy package.js fájl hibás. További információért tekintse meg a PM2-naplókat /var/log/pm2.log . A legutóbbi hiba a fájl alján található. Ha biztos benne, hogy a fájlok helyesek, állítsa le és indítsa el a PM2-t az npm-szkriptek használatával a következőben package.json: .

Mintakód

Következő lépések