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. Maak verbinding met de virtuele machine met SSH, wijzig de web-app in traceerlogboeken en bekijk 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 met 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
- Route aanvragen
- Resources verwijderen met Azure CLI
Vereisten
- Een Azure-gebruikersaccount en -abonnement: maak een gratis abonnement.
- SSH om verbinding te maken met de virtuele machine: Gebruik Azure Cloud Shell of een moderne terminal, zoals bash-shell, die SSH bevat.
Gebruik de Bash-omgeving in Azure Cloud Shell. Zie quickstart voor Bash in Azure Cloud Shell voor meer informatie.
Installeer de Azure CLI, indien gewenst, om CLI-referentieopdrachten uit te voeren. Als u in Windows of macOS werkt, kunt u Azure CLI uitvoeren in een Docker-container. Zie De Azure CLI uitvoeren in een Docker-container voor meer informatie.
Als u een lokale installatie gebruikt, meldt u zich aan bij Azure CLI met behulp van de opdracht az login. Volg de stappen die worden weergegeven in de terminal, om het verificatieproces te voltooien. Raadpleeg Aanmelden bij Azure CLI voor aanvullende aanmeldingsopties.
Installeer de Azure CLI-extensie bij het eerste gebruik, wanneer u hierom wordt gevraagd. Raadpleeg Extensies gebruiken met Azure CLI voor meer informatie over extensies.
Voer az version uit om de geïnstalleerde versie en afhankelijke bibliotheken te vinden. Voer az upgrade uit om te upgraden naar de nieuwste versie.
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.
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"
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
Installeer de Application Insights-extensie in de Azure CLI.
az extension add -n application-insights
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
Kopieer het resultaat uit de uitvoer. U hebt deze waarde
instrumentationKey
later nodig.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).
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
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
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
Wacht tot het proces enkele minuten kan duren.
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.
Het proces heeft SSH-sleutels gemaakt en deze op een locatie vermeld in het antwoord.
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
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
publicIpAddress
gebruikt.http://YOUR-VM-PUBLIC-IP-ADDRESS
Als de resource mislukt met een gatewayfout, probeert u het over een minuut opnieuw. Het kan even duren voordat de web-app wordt gestart.
De web-app van de virtuele machine retourneert de volgende informatie:
- VM-naam
- Het IP-adres van uw client
- Huidige datum/tijd
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 met 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
Maak verbinding met uw externe virtuele machine met de volgende opdracht.
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.
Als u wordt gevraagd of u zeker weet dat u verbinding wilt maken, beantwoordt
y
ofyes
wilt doorgaan.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
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:
Uw web-app bevindt zich in de submap.
myapp
Ga naar demyapp
map en vermeld de inhoud:cd myapp && ls -l
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
Installeer in de SSH-terminal, die is verbonden met uw virtuele machine, de Azure SDK-clientbibliotheek voor Application Insights.
sudo npm install --save applicationinsights
Wacht totdat de opdracht is voltooid voordat u doorgaat.
Controle-instrumentatiesleutel toevoegen
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
Voeg een
APPINSIGHTS_INSTRUMENTATIONKEY
omgevingsvariabele toe aan het begin van het startscript . Vervang in het volgende voorbeeld doorREPLACE-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"
Sla het bestand in de Nano-editor op in de SSH-terminal met control + X.
Als u hierom wordt gevraagd in de Nano-editor, voert u Y in om op te slaan.
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.
Stop PM2, een productieprocesmanager voor Node.js toepassingen, met de volgende opdrachten:
sudo npm run-script stop
Vervang het origineel
index.js
door een bestand met Application Insights.sudo npm run-script appinsights
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()}`) })
Start de app opnieuw met PM2 om de volgende omgevingsvariabele op te halen.
sudo npm start
App gebruiken om logboekregistratie te verifiëren
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 |
- 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
- 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 |
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
Het logboek bevat de aanroep van uw lokale computer.
grep "Hello world app listening on port 3000!" /var/log/pm2.log
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 . |