Eseguire l'app in Servizio app di Azure direttamente da un pacchetto ZIP
Nota
L'esecuzione dal pacchetto non è supportata per le app Python. Quando si distribuisce un file ZIP del codice Python, è necessario impostare un flag per abilitare l'automazione della generazione di Azure. L'automazione della compilazione creerà l'ambiente virtuale Python per l'app e installerà tutti i requisiti e i pacchetti necessari. Per altri dettagli, vedere Automazione della compilazione.
In Servizio app di Azure è possibile eseguire le app direttamente da un file del pacchetto ZIP di distribuzione. Questo articolo illustra come abilitare questa funzionalità nell'app.
Tutti gli altri metodi di distribuzione nel Servizio app hanno qualcosa in comune: i file vengono distribuiti in D:\home\site\wwwroot nell'app (o /home/site/wwwroot per le app Linux). Poiché la stessa directory viene usata dall'app in fase di esecuzione, è possibile che la distribuzione non riesca a causa di conflitti di blocco dei file e che l'app si comporti in modo imprevedibile perché alcuni file non sono ancora stati aggiornati.
Al contrario, quando l'esecuzione avviene direttamente da un pacchetto, i file nel pacchetto non vengono copiati nella directory wwwroot. Il pacchetto ZIP viene invece montato direttamente come directory wwwroot di sola lettura. Esistono diversi vantaggi nell'esecuzione diretta da un pacchetto:
- Elimina i conflitti di blocco dei file tra distribuzione e runtime.
- Assicura che in un determinato momento siano in esecuzione solo app completamente distribuite.
- Possono essere distribuiti in un'app di produzione (con il riavvio).
- Migliora le prestazioni delle distribuzioni Azure Resource Manager.
- Si possono ridurre i tempi di avvio a freddo, in particolare per le funzioni di JavaScript con grandi alberi del pacchetto npm.
Nota
Attualmente sono supportati solo i file di pacchetto ZIP.
Creare un pacchetto ZIP del progetto
Importante
Quando si crea il pacchetto ZIP per la distribuzione, non includere la directory radice, ma solo i file e le directory in esso contenuti. Se si scarica un repository GitHub come file ZIP, non è possibile distribuire il file così com'è nel servizio app. GitHub aggiunge altre directory annidate al livello superiore che non funzionano con il servizio app.
In una finestra terminale locale, passare alla directory radice del progetto dell'app.
Questa directory deve contenere il file di ingresso dell'app Web, ad esempio index.html, index.php e app.js. Può inoltre contenere file di gestione del pacchetto come project.json, composer.json, package.json, bower.json e requirements.txt.
A meno che il Servizio app di Azure non esegua automaticamente l'automazione della distribuzione, eseguire tutte le attività di compilazione ( ad esempio, npm
, bower
, gulp
, composer
e pip
) e assicurarsi di disporre di tutti i file necessari per eseguire l'app. Questo passaggio è obbligatorio se si desidera eseguire direttamente il pacchetto.
Creare un archivio ZIP per tutti gli elementi del progetto. Per i progetti dotnet
, questo è tutto nella directory di output del comando dotnet publish
(escluso la directory di output stessa). Ad esempio, il comando seguente nel terminale per creare un pacchetto ZIP del contenuto della directory corrente:
# Bash
zip -r <file-name>.zip .
# PowerShell
Compress-Archive -Path * -DestinationPath <file-name>.zip
Abilitare l'esecuzione dal pacchetto
L'impostazione dell'app WEBSITE_RUN_FROM_PACKAGE
abilita l'esecuzione da un pacchetto. Per impostarla, eseguire il comando seguente nell'interfaccia della riga di comando di Azure.
az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings WEBSITE_RUN_FROM_PACKAGE="1"
WEBSITE_RUN_FROM_PACKAGE="1"
consente di eseguire l'app da un pacchetto locale nell'app. È anche possibile eseguire l'app da un pacchetto remoto.
Eseguire il pacchetto
Il modo più semplice per eseguire un pacchetto nel servizio app consiste nell'usare il comando az webapp deploy dell'interfaccia della riga di comando di Azure. Ad esempio:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <filename>.zip
Poiché è impostata l'impostazione dell'app WEBSITE_RUN_FROM_PACKAGE
, questo comando non estrae il contenuto del pacchetto nella directory D:\home\site\wwwroot dell'app. Carica invece il file ZIP così com'è in D:\home\data\SitePackages e crea un file packagename.txt nella stessa directory, che contiene il nome del pacchetto ZIP da caricare in fase di esecuzione. Se si carica il pacchetto ZIP in modo diverso, ad esempio con FTP, è necessario creare manualmente la directory D:\home\data\SitePackages e il file packagename.txt.
Il comando riavvia anche l'app. Poiché è impostato WEBSITE_RUN_FROM_PACKAGE
, il Servizio app monta il pacchetto caricato come directory wwwroot di sola lettura ed esegue l'app direttamente da tale directory montata.
Eseguire invece dall'URL esterno
È anche possibile eseguire un pacchetto da un URL esterno, ad esempio Archiviazione BLOB di Azure. È possibile usare Azure Storage Explorer per caricare i file di pacchetto nell'account di archiviazione BLOB. È consigliabile usare un contenitore di archiviazione privato con una firma di accesso condiviso o usare un'identità gestita per consentire al runtime del Servizio app di accedere in modo sicuro al pacchetto.
Nota
Attualmente, non è possibile eseguire la migrazione di una risorsa del Servizio app esistente che esegue un pacchetto locale per l'esecuzione da un pacchetto remoto. Sarà necessario creare una nuova risorsa del Servizio app configurata per l'esecuzione da un URL esterno.
Dopo aver caricato il file nell'archiviazione BLOB e ottenuto un URL di firma di accesso condiviso per il file, impostare l'impostazione dell'app WEBSITE_RUN_FROM_PACKAGE
sull'URL. L'esempio seguente esegue questa operazione usando l'interfaccia della riga di comando di Azure:
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"
Se si pubblica un pacchetto aggiornato con lo stesso nome nell'archiviazione BLOB, è necessario riavviare l'app in modo che il pacchetto aggiornato venga caricato nel Servizio app.
Accedere a un pacchetto in Archiviazione BLOB di Azure usando un'identità gestita
È possibile configurare Archiviazione BLOB di Azure per autorizzare le richieste con Microsoft Entra ID. Questa configurazione significa che invece di generare una chiave di firma di accesso condiviso con una scadenza, è possibile basarsi sull'identità gestita dell'applicazione. Per impostazione predefinita, viene usata l'identità assegnata dal sistema dell'app. Se si vuole specificare un'identità assegnata dall'utente, è possibile impostare l'impostazione dell'app WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID
sull'ID risorsa di tale identità. L'impostazione può anche accettare SystemAssigned
come valore, che equivale a omettere l'impostazione.
Per abilitare il recupero del pacchetto tramite l'identità:
Assicurarsi che il BLOB sia configurato per l'accesso privato.
Concedere all'identità il ruolo Lettore di dati BLOB di archiviazione con ambito che includa il BLOB del pacchetto. Per informazioni dettagliate sulla creazione dell'assegnazione di ruolo, vedere Assegnare un ruolo di Azure per l'accesso ai dati BLOB.
Impostare l'impostazione dell'applicazione
WEBSITE_RUN_FROM_PACKAGE
sull'URL BLOB del pacchetto. Questo URL è in genere in formatohttps://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package}
o simile.
Distribuire file WebJob durante l'esecuzione dal pacchetto
Esistono due modi per distribuire i file WebJob quando si abilita l'esecuzione di un'app dal pacchetto:
- Distribuire nello stesso pacchetto ZIP dell'app: includerli come si farebbe normalmente in
<project-root>\app_data\jobs\...
(che esegue il mapping al percorso di distribuzione\site\wwwroot\app_data\jobs\...
come specificato nella guida introduttiva di WebJobs). - Distribuire separatamente dal pacchetto ZIP dell'app: poiché il percorso di distribuzione consueto
\site\wwwroot\app_data\jobs\...
è ora di sola lettura, non è possibile distribuire i file WebJob in tale posizione. Distribuire invece i file WebJob in\site\jobs\...
, che non è di sola lettura. I file WebJob distribuiti in\site\wwwroot\app_data\jobs\...
e\site\jobs\...
vengono entrambi eseguiti.
Nota
Quando \site\wwwroot
diventa di sola lettura, le operazioni come la creazione del file disable.job avranno esito negativo.
Risoluzione dei problemi
- L'esecuzione diretta da un pacchetto rende
wwwroot
di sola lettura. L'app riceverà un errore se tenta di scrivere file in questa directory. - I formati TAR e GZIP non sono supportati.
- Il file ZIP può essere al massimo di 1 GB
- Questa funzionalità non è compatibile con la cache locale.
- Per migliorare le prestazioni di avvio a freddo, usare l'opzione Zip locale (
WEBSITE_RUN_FROM_PACKAGE
=1).