Uw app rechtstreeks vanuit een ZIP-pakket uitvoeren in Azure-app Service
Notitie
Uitvoeren vanuit pakket wordt niet ondersteund voor Python-apps. Wanneer u een ZIP-bestand van uw Python-code implementeert, moet u een vlag instellen om Azure-buildautomatisering in te schakelen. De buildautomatisering maakt de virtuele Python-omgeving voor uw app en installeert de benodigde vereisten en het benodigde pakket. Zie buildautomatisering voor meer informatie.
In Azure-app Service kunt u uw apps rechtstreeks vanuit een ZIP-pakketbestand voor implementatie uitvoeren. In dit artikel wordt beschreven hoe u deze functionaliteit inschakelt in uw app.
Alle andere implementatiemethoden in App Service hebben iets gemeen: uw bestanden worden geïmplementeerd op D:\home\site\wwwroot in uw app (of /home/site/wwwroot voor Linux-apps). Omdat dezelfde map tijdens runtime door uw app wordt gebruikt, kan de implementatie mislukken vanwege conflicten met bestandsvergrendeling en kan de app onvoorspelbaar gedrag vertonen omdat sommige bestanden nog niet zijn bijgewerkt.
Wanneer u daarentegen rechtstreeks vanuit een pakket uitvoert, worden de bestanden in het pakket niet gekopieerd naar de wwwroot-map . In plaats daarvan wordt het ZIP-pakket zelf rechtstreeks gekoppeld als de alleen-lezen wwwroot-map . Er zijn verschillende voordelen om rechtstreeks vanuit een pakket te worden uitgevoerd:
- Elimineert bestandsvergrendelingsconflicten tussen implementatie en runtime.
- Zorgt ervoor dat alleen volledig geïmplementeerde apps op elk gewenst moment worden uitgevoerd.
- Kan worden geïmplementeerd in een productie-app (met opnieuw opstarten).
- Verbetert de prestaties van Azure Resource Manager-implementaties.
- Kan koude begintijden verminderen, met name voor JavaScript-functies met grote npm-pakketstructuren.
Notitie
Momenteel worden alleen ZIP-pakketbestanden ondersteund.
Een ZIP-projectpakket maken
Belangrijk
Neem bij het maken van het ZIP-pakket voor implementatie niet de hoofdmap op, maar alleen de bestanden en mappen erin. Als u een GitHub-opslagplaats als een ZIP-bestand downloadt, kunt u dat bestand niet implementeren in App Service. GitHub voegt extra geneste mappen toe op het hoogste niveau, die niet werken met App Service.
Navigeer in een lokaal terminalvenster naar de hoofdmap van uw app-project.
Deze map moet het invoerbestand bevatten voor uw web-app, zoals index.html, index.php en app.js. Het kan ook pakketbeheerbestanden bevatten, zoals project.json, composer.json, package.json, bower.json en requirements.txt.
Tenzij u wilt dat App Service implementatieautomatisering voor u uitvoert, voert u alle buildtaken (bijvoorbeeld npm
, bower
, gulp
, composer
en ) pip
uit en controleert u of u alle bestanden hebt die u nodig hebt om de app uit te voeren. Deze stap is vereist als u uw pakket rechtstreeks wilt uitvoeren.
Maak een ZIP-archief van alle bestanden in uw project. Voor dotnet
projecten is dit alles in de uitvoermap van de dotnet publish
opdracht (met uitzondering van de uitvoermap zelf). Bijvoorbeeld de volgende opdracht in uw terminal om een ZIP-pakket te maken van de inhoud van de huidige map:
# Bash
zip -r <file-name>.zip .
# PowerShell
Compress-Archive -Path * -DestinationPath <file-name>.zip
Uitvoeren vanuit pakket inschakelen
De WEBSITE_RUN_FROM_PACKAGE
app-instelling kan worden uitgevoerd vanuit een pakket. Voer de volgende opdracht uit met Azure CLI om deze in te stellen.
az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings WEBSITE_RUN_FROM_PACKAGE="1"
WEBSITE_RUN_FROM_PACKAGE="1"
hiermee kunt u uw app uitvoeren vanuit een pakket lokaal naar uw app. U kunt ook uitvoeren vanuit een extern pakket.
Het pakket uitvoeren
De eenvoudigste manier om een pakket uit te voeren in uw App Service is met de Azure CLI az webapp deployment source config-zip command. Voorbeeld:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <filename>.zip
Omdat de WEBSITE_RUN_FROM_PACKAGE
app-instelling is ingesteld, wordt met deze opdracht de pakketinhoud niet geëxtraheerd naar de map D:\home\site\wwwroot van uw app. In plaats daarvan wordt het ZIP-bestand geüpload naar D:\home\data\SitePackages en wordt er een packagename.txt gemaakt in dezelfde map, die de naam van het ZIP-pakket bevat dat tijdens runtime moet worden geladen. Als u uw ZIP-pakket op een andere manier uploadt (zoals FTP), moet u de map D:\home\data\SitePackages en het packagename.txt bestand handmatig maken.
Met de opdracht wordt de app ook opnieuw opgestart. Omdat WEBSITE_RUN_FROM_PACKAGE
dit is ingesteld, koppelt App Service het geüploade pakket als de alleen-lezen wwwroot-map en voert de app rechtstreeks vanuit die gekoppelde map uit.
Uitvoeren vanaf externe URL in plaats daarvan
U kunt ook een pakket uitvoeren vanaf een externe URL, zoals Azure Blob Storage. U kunt Azure Storage Explorer gebruiken om pakketbestanden te uploaden naar uw Blob Storage-account. U moet een privéopslagcontainer gebruiken met een Shared Access Signature (SAS) of een beheerde identiteit gebruiken om de App Service-runtime in staat te stellen veilig toegang te krijgen tot het pakket.
Notitie
Momenteel kan een bestaande App Service-resource waarop een lokaal pakket wordt uitgevoerd, niet worden gemigreerd om uit te voeren vanuit een extern pakket. U moet een nieuwe App Service-resource maken die is geconfigureerd voor uitvoering vanaf een externe URL.
Nadat u het bestand hebt geüpload naar Blob Storage en een SAS-URL voor het bestand hebt, stelt u de app-instelling WEBSITE_RUN_FROM_PACKAGE
in op de URL. In het volgende voorbeeld wordt dit uitgevoerd met behulp van Azure CLI:
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_RUN_FROM_PACKAGE="https://myblobstorage.blob.core.windows.net/content/SampleCoreMVCApp.zip?st=2018-02-13T09%3A48%3A00Z&se=2044-06-14T09%3A48%3A00Z&sp=rl&sv=2017-04-17&sr=b&sig=bNrVrEFzRHQB17GFJ7boEanetyJ9DGwBSV8OM3Mdh%2FM%3D"
Als u een bijgewerkt pakket met dezelfde naam naar Blob Storage publiceert, moet u de app opnieuw opstarten, zodat het bijgewerkte pakket in App Service wordt geladen.
Toegang krijgen tot een pakket in Azure Blob Storage met behulp van een beheerde identiteit
U kunt Azure Blob Storage configureren om aanvragen te autoriseren met Microsoft Entra-id. Deze configuratie betekent dat in plaats van een SAS-sleutel te genereren met een vervaldatum, u in plaats daarvan kunt vertrouwen op de beheerde identiteit van de toepassing. Standaard wordt de door het systeem toegewezen identiteit van de app gebruikt. Als u een door de gebruiker toegewezen identiteit wilt opgeven, kunt u de WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID
app-instelling instellen op de resource-id van die identiteit. De instelling kan ook accepteren SystemAssigned
als een waarde, wat gelijk is aan het weglaten van de instelling.
Als u wilt dat het pakket wordt opgehaald met behulp van de identiteit:
Zorg ervoor dat de blob is geconfigureerd voor privétoegang.
Verdeel de identiteit de rol Opslagblobgegevenslezer met bereik over de pakket-blob. Zie Een Azure-rol toewijzen voor toegang tot blobgegevens voor meer informatie over het maken van de roltoewijzing.
Stel de
WEBSITE_RUN_FROM_PACKAGE
toepassingsinstelling in op de blob-URL van het pakket. Deze URL is meestal van de vormhttps://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package}
of vergelijkbaar.
Webtaakbestanden implementeren wanneer deze worden uitgevoerd vanuit het pakket
Er zijn twee manieren om WebJob-bestanden te implementeren wanneer u het uitvoeren van een app vanuit het pakket inschakelt:
- Implementeer in hetzelfde ZIP-pakket als uw app: neem ze op zoals u normaal zou doen
<project-root>\app_data\jobs\...
(wat overeenkomt met het implementatiepad\site\wwwroot\app_data\jobs\...
zoals opgegeven in de snelstart voor WebJobs). - Implementeer afzonderlijk van het ZIP-pakket van uw app: omdat het gebruikelijke implementatiepad
\site\wwwroot\app_data\jobs\...
nu alleen-lezen is, kunt u daar geen webtaakbestanden implementeren. In plaats daarvan implementeert u WebJob-bestanden in\site\jobs\...
, die niet alleen-lezen zijn. WebJobs die zijn geïmplementeerd in\site\wwwroot\app_data\jobs\...
en\site\jobs\...
beide worden uitgevoerd.
Notitie
Wanneer \site\wwwroot
het kenmerk Alleen-lezen wordt, mislukken bewerkingen zoals het maken van de disable.job .
Probleemoplossing
- Als het rechtstreeks vanuit een pakket wordt uitgevoerd, wordt
wwwroot
het kenmerk Alleen-lezen. Uw app ontvangt een foutmelding als er wordt geprobeerd bestanden naar deze map te schrijven. - TAR- en GZIP-indelingen worden niet ondersteund.
- Het ZIP-bestand kan maximaal 1 GB zijn
- Deze functie is niet compatibel met lokale cache.
- Gebruik de lokale zip-optie (
WEBSITE_RUN_FROM_PACKAGE
=1) voor verbeterde prestaties bij koude start.