Een Node.js-app configureren voor Azure App Service
Node.js apps moeten worden geïmplementeerd met alle vereiste NPM-afhankelijkheden. De App Service-implementatie-engine wordt automatisch voor u uitgevoerd npm install --production
wanneer u een Git-opslagplaats implementeert of een Zip-pakket waarvoor buildautomatisering is ingeschakeld. Als u uw bestanden echter implementeert met FTP/S, moet u de vereiste pakketten handmatig uploaden.
Deze handleiding bevat belangrijke concepten en instructies voor Node.js ontwikkelaars die implementeren in App Service. Als u Azure-app Service nog nooit hebt gebruikt, volgt u eerst de quickstart Node.js en Node.js met mongoDB-zelfstudie.
Node.js-versie weergeven
Als u de huidige Node.js-versie wilt weergeven, voert u de volgende opdracht uit in Cloud Shell:
az webapp config appsettings list --name <app-name> --resource-group <resource-group-name> --query "[?name=='WEBSITE_NODE_DEFAULT_VERSION'].value"
Als u alle ondersteunde Node.js versies wilt weergeven, gaat u naar https://<sitename>.scm.azurewebsites.net/api/diagnostics/runtime
of voert u de volgende opdracht uit in Cloud Shell:
az webapp list-runtimes --os windows | grep NODE
Als u de huidige Node.js-versie wilt weergeven, voert u de volgende opdracht uit in Cloud Shell:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion
Als u alle ondersteunde Node.js-versies wilt weergeven, voert u de volgende opdracht uit in Cloud Shell:
az webapp list-runtimes --os linux | grep NODE
Versie van Node.js instellen
Als u uw app wilt instellen op een ondersteunde Node.js versie, voert u de volgende opdracht uit in Cloud Shell om deze in te stellen WEBSITE_NODE_DEFAULT_VERSION
op een ondersteunde versie:
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_NODE_DEFAULT_VERSION="~16"
Notitie
In dit voorbeeld wordt de aanbevolen 'tilde-syntaxis' gebruikt om de meest recente beschikbare versie van Node.js 16 runtime in App Service te gebruiken.
Omdat de runtime regelmatig wordt gepatcht en bijgewerkt door het platform, wordt het afgeraden om een specifieke secundaire versie/patch te richten, omdat deze niet gegarandeerd beschikbaar zijn vanwege mogelijke beveiligingsrisico's.
Notitie
U moet de Node.js versie instellen in de projectversie package.json
. De implementatie-engine wordt uitgevoerd in een afzonderlijk proces dat alle ondersteunde Node.js versies bevat.
Als u uw app wilt instellen op een ondersteunde Node.js versie, voert u de volgende opdracht uit in Cloud Shell:
az webapp config set --resource-group <resource-group-name> --name <app-name> --linux-fx-version "NODE|14-lts"
Met deze instelling geeft u de Node.js versie op die moet worden gebruikt, zowel tijdens runtime als tijdens het automatisch herstellen van pakketten in Kudu.
Notitie
U moet de Node.js versie instellen in de projectversie package.json
. De implementatie-engine wordt uitgevoerd in een afzonderlijke container die alle ondersteunde Node.js versies bevat.
Poortnummer ophalen
Uw Node.js-app moet luisteren naar de juiste poort om binnenkomende aanvragen te ontvangen.
In App Service in Windows worden Node.js apps gehost met IISNode en moet uw Node.js-app luisteren naar de poort die is opgegeven in de process.env.PORT
variabele. In het volgende voorbeeld ziet u hoe u dit doet in een eenvoudige Express-app:
App Service stelt de omgevingsvariabele PORT
in de Node.js-container in en stuurt de binnenkomende aanvragen door naar uw container op dat poortnummer. Als u de aanvragen wilt ontvangen, moet uw app naar die poort luisteren met behulp van process.env.PORT
. In het volgende voorbeeld ziet u hoe u dit doet in een eenvoudige Express-app:
const express = require('express')
const app = express()
const port = process.env.PORT || 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
De automatisering van bouwbewerkingen aanpassen
Als u uw app implementeert met Git of zip-pakketten waarvoor buildautomatisering is ingeschakeld, doorloopt de App Service-buildautomatisering de volgende reeks:
- Voer aangepast script uit als dit is opgegeven door
PRE_BUILD_SCRIPT_PATH
. - Uitvoeren
npm install
zonder vlaggen, die npmpreinstall
enpostinstall
scripts bevatten en ook worden geïnstalleerddevDependencies
. - Voer
npm run build
uit als er een buildscript is opgegeven in uw package.json. - Voer
npm run build:azure
uit als een build:azure-script is opgegeven in uw package.json. - Voer aangepast script uit als dit is opgegeven door
POST_BUILD_SCRIPT_PATH
.
Notitie
Zoals beschreven in npm-documenten, worden scripts genoemd prebuild
en uitgevoerd vóór en postbuild
na build
respectievelijk, indien opgegeven. preinstall
en postinstall
worden respectievelijk vóór en na install
uitgevoerd.
PRE_BUILD_COMMAND
en POST_BUILD_COMMAND
zijn omgevingsvariabelen die standaard leeg zijn. Als u vooraf gebouwde opdrachten wilt uitvoeren, definieert u PRE_BUILD_COMMAND
. Als u achteraf gebouwde opdrachten wilt uitvoeren, definieert u POST_BUILD_COMMAND
.
In het volgende voorbeeld worden de twee variabelen voor een reeks opdrachten opgegeven, gescheiden door komma's.
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PRE_BUILD_COMMAND="echo foo, scripts/prebuild.sh"
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings POST_BUILD_COMMAND="echo foo, scripts/postbuild.sh"
Zie Oryx-configuratie voor aanvullende omgevingsvariabelen om bouwautomatisering aan te passen.
Node.js-server configureren
De Node.js containers worden geleverd met PM2, een productieprocesmanager. U kunt uw app configureren om te beginnen met PM2, of met NPM, of met een aangepaste opdracht.
Hulpprogramma | Doel |
---|---|
Uitvoeren met PM2 | Aanbevolen : productie- of faseringsgebruik. PM2 biedt een volledig app-beheerplatform. |
Npm starten uitvoeren | Alleen ontwikkelingsgebruik. |
Aangepaste opdracht uitvoeren | Ontwikkeling of fasering. |
Uitvoeren met PM2
De container start uw app automatisch met PM2 wanneer een van de algemene Node.js bestanden in uw project wordt gevonden:
- bin/www
- server.js
- app.js
- index.js
- hostingstart.js
- Een van de volgende PM2-bestanden: process.json en ecosystem.config.js
U kunt ook een aangepast startbestand configureren met de volgende extensies:
- Een .js-bestand
- Een PM2-bestand met de extensie .json, .config.js, .yaml of .yml
Notitie
Vanaf Node 14 LTS start de container uw app niet automatisch met PM2. Als u uw app wilt starten met PM2, stelt u de opstartopdracht in op pm2 start <.js-file-or-PM2-file> --no-daemon
. Zorg ervoor dat u het --no-daemon
argument gebruikt omdat PM2 op de voorgrond moet worden uitgevoerd om de container goed te laten werken.
Als u een aangepast startbestand wilt toevoegen, voert u de volgende opdracht uit in Cloud Shell:
az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "<filename-with-extension>"
Aangepaste opdracht uitvoeren
App Service kan uw app starten met behulp van een aangepaste opdracht, zoals een uitvoerbaar bestand zoals run.sh. Als u bijvoorbeeld wilt uitvoeren npm run start:prod
, voert u de volgende opdracht uit in Cloud Shell:
az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "npm run start:prod"
Npm starten uitvoeren
Als u uw app wilt gaan gebruiken npm start
, moet u ervoor zorgen dat een start
script zich in het package.json bestand bevindt. Voorbeeld:
{
...
"scripts": {
"start": "gulp",
...
},
...
}
Als u een aangepaste package.json in uw project wilt gebruiken, voert u de volgende opdracht uit in Cloud Shell:
az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "<filename>.json"
Foutopsporing op afstand
Notitie
Externe foutopsporing is momenteel beschikbaar als preview-versie.
U kunt fouten opsporen in uw Node.js-app op afstand in Visual Studio Code als u deze configureert voor uitvoering met PM2, behalve wanneer u deze uitvoert met behulp van een .config.js, .yml of .yaml.
In de meeste gevallen is er geen extra configuratie vereist voor uw app. Als uw app wordt uitgevoerd met een process.json bestand (standaard of aangepast), moet deze een script
eigenschap hebben in de JSON-hoofdmap. Voorbeeld:
{
"name" : "worker",
"script" : "./index.js",
...
}
Installeer de App Service-extensie om Visual Studio Code in te stellen voor externe foutopsporing. Volg de instructies op de extensiepagina en meld u aan bij Azure in Visual Studio Code.
Zoek in Azure Explorer de app die u wilt opsporen, klik er met de rechtermuisknop op en selecteer Externe foutopsporing starten. Klik op Ja om deze in te schakelen voor uw app. App Service start een tunnelproxy voor u en koppelt het foutopsporingsprogramma. Vervolgens kunt u aanvragen naar de app indienen en het foutopsporingsprogramma bij onderbrekingspunten bekijken.
Als u klaar bent met foutopsporing, stopt u het foutopsporingsprogramma door Verbinding verbreken te selecteren. Wanneer u hierom wordt gevraagd, klikt u op Ja om externe foutopsporing uit te schakelen. Als u deze later wilt uitschakelen, klikt u opnieuw met de rechtermuisknop op uw app in Azure Explorer en selecteert u Externe foutopsporing uitschakelen.
Toegang tot omgevingsvariabelen
In App Service kunt u app-instellingen configureren buiten uw app-code. Vervolgens kunt u ze openen met behulp van het standaardpatroon Node.js. Voor toegang tot bijvoorbeeld de app-instelling NODE_ENV
gebruikt u de volgende code:
process.env.NODE_ENV
Grunt/Bower/Gulp uitvoeren
App Service-buildautomatisering wordt standaard uitgevoerd npm install --production
wanneer een Node.js app wordt geïmplementeerd via Git of via Zip-implementatie waarvoor buildautomatisering is ingeschakeld. Als uw app een van de populaire automatiseringsprogramma's vereist, zoals Grunt, Bower of Gulp, moet u een aangepast implementatiescript opgeven om het uit te voeren.
Als u wilt dat uw opslagplaats deze hulpprogramma's uitvoert, moet u deze toevoegen aan de afhankelijkheden in package.json. Bijvoorbeeld:
"dependencies": {
"bower": "^1.7.9",
"grunt": "^1.0.1",
"gulp": "^3.9.1",
...
}
Wijzig vanuit een lokaal terminalvenster de map in de hoofdmap van uw opslagplaats en voer de volgende opdrachten uit:
npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt
De hoofdmap van de opslagplaats bevat nu twee extra bestanden: .deployment en deploy.sh.
Open deploy.sh en zoek de Deployment
sectie, die er als volgt uitziet:
##################################################################################################################################
# Deployment
# ----------
Deze sectie eindigt met uitvoeren npm install --production
. Voeg de codesectie toe die u nodig hebt om het vereiste hulpprogramma aan het einde van de Deployment
sectie uit te voeren:
Bekijk een voorbeeld in het MEAN.js voorbeeld, waarbij het implementatiescript ook een aangepaste npm install
opdracht uitvoert.
Bower
Dit fragment wordt uitgevoerd bower install
.
if [ -e "$DEPLOYMENT_TARGET/bower.json" ]; then
cd "$DEPLOYMENT_TARGET"
eval ./node_modules/.bin/bower install
exitWithMessageOnError "bower failed"
cd - > /dev/null
fi
Slok
Dit fragment wordt uitgevoerd gulp imagemin
.
if [ -e "$DEPLOYMENT_TARGET/gulpfile.js" ]; then
cd "$DEPLOYMENT_TARGET"
eval ./node_modules/.bin/gulp imagemin
exitWithMessageOnError "gulp failed"
cd - > /dev/null
fi
Grunt
Dit fragment wordt uitgevoerd grunt
.
if [ -e "$DEPLOYMENT_TARGET/Gruntfile.js" ]; then
cd "$DEPLOYMENT_TARGET"
eval ./node_modules/.bin/grunt
exitWithMessageOnError "Grunt failed"
cd - > /dev/null
fi
HTTPS-sessie detecteren
In App Service vindt TLS/SSL-beëindiging plaats bij de netwerktaakverdelers, zodat alle HTTPS-aanvragen uw app bereiken als niet-versleutelde HTTP-aanvragen. Inspecteer de header X-Forwarded-Proto
als de app-logica moet controleren of de aanvragen van gebruikers al dan niet zijn versleuteld.
Populaire webframeworks bieden toegang tot de X-Forwarded-*
-informatie in het patroon van de standaard-app. In Express kunt u vertrouwensproxy's gebruiken. Voorbeeld:
app.set('trust proxy', 1)
...
if (req.secure) {
// Do something when HTTPS is used
}
Toegang tot diagnostische logboeken
Als u toegang wilt tot de consolelogboeken die worden gegenereerd binnen uw toepassingscode in de App Service, schakelt u diagnostische logboekregistratie in door de volgende opdracht in de Cloud Shell uit te voeren:
az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose
Mogelijk waarden voor --level
zijn: Error
, Warning
, Info
en Verbose
. Elk hoger niveau omvat het vorige niveau. Bijvoorbeeld: Error
omvat alleen foutberichten en Verbose
omvat alle berichten.
Nadat diagnostische logboekregistratie is ingeschakeld, voert u de volgende opdracht uit om de logboekstream te zien:
az webapp log tail --resource-group <resource-group-name> --name <app-name>
Als u de consolelogboeken niet meteen ziet, probeert u het opnieuw na 30 seconden.
Notitie
U kunt ook de logboekbestanden van de browser inspecteren op https://<app-name>.scm.azurewebsites.net/api/logs/docker
.
U kunt op elk gewenst moment Ctrl
+C
typen om te stoppen met logboekstreaming.
U hebt vanuit de container toegang tot de consolelogboeken.
Schakel eerst logboekregistratie voor containers in door de volgende opdracht uit te voeren:
az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem
Vervang <app-name>
en <resource-group-name>
door de namen die van toepassing zijn op uw web-app.
Zodra logboekregistratie is ingeschakeld, voert u de volgende opdracht uit om de logboekstream te zien:
az webapp log tail --name <app-name> --resource-group <resource-group-name>
Als u de consolelogboeken niet meteen ziet, probeert u het opnieuw na 30 seconden.
U kunt op elk gewenst moment stoppen met logboekstreaming door Ctrl+C te typen.
U kunt ook de logboekbestanden in een browser inspecteren op https://<app-name>.scm.azurewebsites.net/api/logs/docker
.
URL-herschrijven
Wanneer u Node.js-apps implementeert in Azure-app Service voor Linux, moet u mogelijk URL-herschrijven rechtstreeks in uw toepassing verwerken. Dit is met name handig om ervoor te zorgen dat specifieke URL-patronen worden omgeleid naar de juiste eindpunten zonder gebruik te maken van webserverconfiguraties. Er zijn verschillende manieren om URL-herschrijven uit te voeren in Node.js. Een voorbeeld is via het express-urlrewrite-pakket .
Controleren met behulp van Application Insights
Met Application Insights kunt u de prestaties, uitzonderingen en het gebruik van uw toepassing bewaken zonder codewijzigingen aan te brengen. Als u de App Insights-agent wilt koppelen, gaat u naar uw web-app in de portal en selecteert u Application Insights onder Instellingen en selecteert u Application Insights inschakelen. Selecteer vervolgens een bestaande App Insights-resource of maak een nieuwe resource. Selecteer tot slot Toepassen onderaan. Als u uw web-app wilt instrumenteren met behulp van PowerShell, raadpleegt u deze instructies
Met deze agent wordt uw Node.js toepassing aan de serverzijde bewaakt. Als u javaScript aan de clientzijde wilt bewaken, voegt u de JavaScript-SDK toe aan uw project.
Zie de releaseopmerkingen voor de Application Insights-extensie voor meer informatie.
Probleemoplossing
Wanneer een werkende Node.js app zich anders gedraagt in App Service of fouten bevat, probeert u het volgende:
- Open de logboekstream.
- Test de app lokaal in de productiemodus. App Service voert uw Node.js-apps uit in de productiemodus, dus u moet ervoor zorgen dat uw project werkt zoals verwacht in de productiemodus lokaal. Bijvoorbeeld:
- Afhankelijk van uw package.json kunnen verschillende pakketten worden geïnstalleerd voor de productiemodus (
dependencies
vs.devDependencies
). - Bepaalde webframeworks kunnen statische bestanden anders implementeren in de productiemodus.
- Bepaalde webframeworks kunnen aangepaste opstartscripts gebruiken wanneer ze worden uitgevoerd in de productiemodus.
- Afhankelijk van uw package.json kunnen verschillende pakketten worden geïnstalleerd voor de productiemodus (
- Voer uw app uit in App Service in de ontwikkelmodus. In MEAN.js kunt u uw app bijvoorbeeld instellen op de ontwikkelingsmodus in runtime door de
NODE_ENV
app-instelling in te stellen.
U bent niet gemachtigd om deze map of pagina weer te geven
Nadat u uw Node.js code hebt geïmplementeerd in een systeemeigen Windows-app in App Service, ziet u mogelijk het bericht You do not have permission to view this directory or page.
in de browser wanneer u naar de URL van uw app navigeert. Dit komt waarschijnlijk doordat u geen web.config-bestand hebt (zie de sjabloon en een voorbeeld).
Als u uw bestanden implementeert met behulp van Git of door zip-implementatie te gebruiken waarvoor buildautomatisering is ingeschakeld, genereert de implementatie-engine automatisch een web.config in de webhoofdmap van uw app (%HOME%\site\wwwroot
) als aan een van de volgende voorwaarden wordt voldaan:
- De hoofdmap van uw project heeft een package.json waarmee een
start
script wordt gedefinieerd dat het pad van een JavaScript-bestand bevat. - De hoofdmap van uw project heeft een server.js of een app.js.
De gegenereerde web.config is aangepast aan het gedetecteerde startscript. Voor andere implementatiemethoden voegt u deze web.config handmatig toe. Zorg ervoor dat het bestand juist is opgemaakt.
Als u bijvoorbeeld ZIP-implementatie gebruikt (via Visual Studio Code), moet u buildautomatisering inschakelen omdat deze niet standaard is ingeschakeld. az webapp up
maakt gebruik van ZIP-implementatie waarbij buildautomatisering is ingeschakeld.
robots933456 in logboeken
U ziet mogelijk het volgende bericht in de containerlogboeken:
2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"
U kunt dit bericht veilig negeren. /robots933456.txt
is een dummy-URL-pad dat App Service gebruikt om te controleren of de container aanvragen kan verwerken. Een 404-antwoord geeft alleen aan dat het pad niet bestaat, maar laat App Service wel weten dat de container in orde is en klaar is om te reageren op aanvragen.
Volgende stappen
Of zie aanvullende informatiebronnen:
Naslaginformatie over omgevingsvariabelen en app-instellingen