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, ändra webbappen till att inkludera spårningsloggning och visa 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
- Ansluta 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
- Begära
- Ta bort resurser med Azure CLI
Förutsättningar
- Ett Azure-användarkonto och en prenumeration: skapa en kostnadsfri prenumeration.
- 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.
Använd Bash-miljön i Azure Cloud Shell. Mer information finns i Snabbstart för Bash i Azure Cloud Shell.
Om du föredrar att köra CLI-referenskommandon lokalt installerar du Azure CLI. Om du kör i Windows eller macOS kan du köra Azure CLI i en Docker-container. Mer information finns i Så här kör du Azure CLI i en Docker-container.
Om du använder en lokal installation loggar du in på Azure CLI med hjälp av kommandot az login. Slutför autentiseringsprocessen genom att följa stegen som visas i terminalen. Andra inloggningsalternativ finns i Logga in med Azure CLI.
När du uppmanas att installera Azure CLI-tillägget vid första användningen. Mer information om tillägg finns i Använda tillägg med Azure CLI.
Kör az version om du vill hitta versionen och de beroende bibliotek som är installerade. Om du vill uppgradera till den senaste versionen kör du az upgrade.
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.
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"
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
Installera Application Insights-tillägget till Azure CLI.
az extension add -n application-insights
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
Kopiera resultatet från utdata, du behöver det värdet som ditt
instrumentationKey
senare.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).
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
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
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
Vänta medan processen kan ta några minuter.
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.
Processen skapade SSH-nycklar och men de på en plats som anges i svaret.
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
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
Om resursen misslyckas med ett gatewayfel kan det ta en minut att starta webbappen igen om en minut.
Den virtuella datorns webbapp returnerar följande information:
- VM-namn
- Klientens IP-adress
- Aktuellt datum/tid
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. Ansluta 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.
Ansluta med SSH och ändra webbapp
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.
Om du tillfrågas om du är säker på att du vill ansluta, svara
y
elleryes
fortsätta.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
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:
Webbappen finns i underkatalogen,
myapp
. Ändra till katalogenmyapp
och lista innehållet:cd myapp && ls -l
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
Installera Azure SDK-klientbiblioteket för Application Insights i SSH-terminalen, som är ansluten till den virtuella datorn.
sudo npm install --save applicationinsights
Vänta tills kommandot har slutförts innan du fortsätter.
Lägg till instrumentationsnyckel för övervakning
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
Lägg till en
APPINSIGHTS_INSTRUMENTATIONKEY
miljövariabel i början av startskriptet. I följande exempel ersätter duREPLACE-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"
Spara filen i Nano-redigeraren med kontroll + X i SSH-terminalen.
Om du uppmanas till det i Nano-redigeraren anger du Y för att spara.
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.
Stoppa PM2, som är en produktionsprocesshanterare för Node.js program, med följande kommandon:
sudo npm run-script stop
Ersätt originalet
index.js
med filen med Application Insights.sudo npm run-script appinsights
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()}`) })
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
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 |
- 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
- 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 |
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
Loggen innehåller anropet från den lokala datorn.
grep "Hello world app listening on port 3000!" /var/log/pm2.log
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 . |