Domande frequenti sul Servizio app di Azure in Linux

Note

Questo articolo è stato utile? Diamo importanza al contributo degli utenti. Usare il pulsante Feedback in questa pagina per comunicare se questo articolo è stato utile o come possiamo migliorarlo.

Con il lancio del Servizio app in Linux, sono previsti miglioramenti e nuove funzionalità per la piattaforma. Questo articolo fornisce le risposte alle domande che i clienti ci hanno posto di recente.

In caso di domande, inviare commenti su questo articolo.

Immagini predefinite

Quali sono i valori previsti per la sezione relativa al file di avvio quando si configura lo stack di runtime?

Stack Valore previsto
Java SE comando per avviare l'app JAR (ad esempio, java -jar /home/site/wwwroot/app.jar --server.port=80)
Tomcat posizione di uno script per eseguire le configurazioni necessarie (ad esempio, /home/site/deployments/tools/startup_script.sh)
Node.js il file di configurazione PM2 o il file di script
.NET Core il nome della DLL compilato come dotnet <myapp>.dll
PHP Avvio personalizzato facoltativo
Python script di avvio facoltativo
Ruby lo script Ruby con cui si vuole inizializzare l'app

Questi comandi o script vengono eseguiti dopo l'avvio del contenitore Docker predefinito, ma prima dell'avvio del codice dell'applicazione.

Gestione

Cosa accade quando viene premuto il pulsante di riavvio nel portale di Azure?

Questa azione equivale a un riavvio di Docker.

È possibile usare Secure Shell (SSH) per connettersi alla macchina virtuale (VM) del contenitore dell'app?

Sì, è possibile farlo tramite il sito di gestione controllo del codice sorgente.

Note

È anche possibile connettersi al contenitore di app direttamente dal computer di sviluppo locale tramite SSH, SFTP o Visual Studio Code (per eseguire il debug attivo di app Node.js). Per altre informazioni, vedere Remote debugging and SSH in App Service on Linux (Debug remoto e SHH nel servizio app in Linux).

Come è possibile creare un piano di servizio app Linux tramite un SDK o un modello di Azure Resource Manager?

Impostare il campo riservato del servizio app su true.

Integrazione e distribuzione continue

L'app Web usa ancora un'immagine obsoleta del contenitore Docker dopo l'aggiornamento dell'immagine su DockerHub. È supportata l'integrazione e distribuzione continua di contenitori personalizzati?

Sì, per configurare l'integrazione o la distribuzione continua per Registro Azure Container o le immagini di DockerHub, vedere Distribuzione continua con l'app Web per contenitori. Per registri privati, è possibile aggiornare il contenitore arrestando e riavviando l'app Web. Oppure è possibile modificare o aggiungere un'impostazione dell'applicazione fittizia per forzare l'aggiornamento del contenitore.

Gli ambienti di gestione temporanea sono supportati?

Sì.

È possibile usare "WebDeploy/MSDeploy" per distribuire l'app Web?

Sì, è necessario impostare WEBSITE_WEBDEPLOY_USE_SCM nell'app su false.

La distribuzione in GIT dell'applicazione non riesce quando si usa l'app Web di Linux. Come è possibile risolvere il problema?

Se la distribuzione in GIT non riesce per l'app Web di Linux, scegliere una delle opzioni seguenti per distribuire il codice dell'applicazione:

  • Usare la funzionalità Recapito continuo (anteprima): è possibile archiviare il codice sorgente dell'app in un repository Git di Azure DevOps o in un repository GitHub per usare il recapito continuo di Azure. Per altre informazioni, vedere How to configure Continuous Delivery for Linux web app (Come configurare Recapito continuo per app Web in Linux).

  • Usare l'API per la distribuzione di ZIP: per usare questa API, attivare una connessione SSH nell'app Web e passare alla cartella in cui si vuole distribuire il codice. Eseguire il codice seguente:

    curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy
    

    Se si verifica un errore che indica l'impossibilità di trovare il comando curl, assicurarsi di installare curl tramite apt-get install curl prima di eseguire il comando curl precedente.

Supporto di versioni in lingue diverse

Esistono impostazioni speciali o configurazioni specifiche da impostare se si vogliono usare Web Socket nell'applicazione Node.js?

Sì, disabilitare perMessageDeflate nel codice Node.js sul lato server. Ad esempio, per socket.io usare il codice seguente:

const io = require('socket.io')(server,{
  perMessageDeflate :false
});

È presente il supporto per le app .NET Core non compilate?

Sì.

È previsto il supporto per lo strumento Composer come gestore delle dipendenze per le app PHP?

Sì, durante una distribuzione Git, Kudu rileverà che si sta distribuendo un'applicazione PHP (grazie alla presenza di un file composer.lock) e Kudu attiverà l'installazione di Composer.

Contenitori personalizzati

È possibile usare identità gestite con servizio app durante il pull delle immagini in Registro Azure Container?

Sì, questa funzionalità è disponibile dall'interfaccia della riga di comando di Azure. È possibile usare identità assegnate dal sistema o assegnate dall'utente . Questa funzionalità non è attualmente supportata nella portale di Azure.

Uso un contenitore personalizzato. Si vuole che la piattaforma supporti una condivisione SMB nella directory "/home/".

Se WEBSITES_ENABLE_APP_SERVICE_STORAGE l'impostazione non è specificata o impostata su false, la /home/ directory non verrà condivisa tra istanze di scalabilità e i file scritti non verranno mantenuti tra i riavvii. Se si imposta in modo esplicito su WEBSITES_ENABLE_APP_SERVICE_STORAGE true , il montaggio verrà abilitato. Dopo aver impostato su true, se si vuole disabilitare il montaggio, è necessario impostare in modo esplicito su WEBSITES_ENABLE_APP_SERVICE_STORAGE false.

L'avvio del contenitore non riesce con "nessun spazio lasciato nel dispositivo". Cosa significa l'errore

servizio app in Linux usa due diversi tipi di archiviazione:

  • Archiviazione del file system: l'archiviazione del file system è inclusa nella quota del piano di servizio app. Viene usato quando i file vengono salvati nella risorsa di archiviazione permanente radicata nella /home directory.
  • Spazio su disco host: lo spazio su disco host viene usato per archiviare le immagini del contenitore. Viene gestito dalla piattaforma tramite il driver di archiviazione Docker.

Lo spazio su disco host è separato dalla quota di archiviazione del file system. Non è espandibile ed è previsto un limite di 15 GB per ogni istanza. Viene usato per archiviare tutte le immagini personalizzate nel ruolo di lavoro. È possibile usare dimensioni superiori a 15 GB a seconda della disponibilità esatta dello spazio su disco host, ma questo non è garantito.

Se il livello scrivibile del contenitore salva i dati all'esterno della /home directory o un percorso di archiviazione di Azure montato, verrà usato anche lo spazio su disco host.

La piattaforma pulisce regolarmente lo spazio su disco host per rimuovere i contenitori inutilizzati. Se il contenitore scrive una grande quantità di dati all'esterno della /home directory o Bring Your Own Storage (BYOS), genererà errori di avvio o eccezioni di runtime dopo il superamento del limite di spazio su disco host.

È consigliabile mantenere le immagini del contenitore il più piccolo possibile e scrivere dati nell'archiviazione permanente o BYOS durante l'esecuzione in Linux servizio app. Se non è possibile, è necessario dividere il piano di servizio app perché lo spazio su disco host è fisso e condiviso tra tutti i contenitori nel piano di servizio app.

L'avvio del contenitore personalizzato richiede molto tempo e la piattaforma riavvia il contenitore prima del completamento di questa operazione. Come si risolve il problema?

È possibile configurare il tempo di attesa della piattaforma prima del riavvio del contenitore. A tale scopo impostare WEBSITES_CONTAINER_START_TIME_LIMIT nell'app sul valore desiderato. Il valore predefinito è 230 secondi e il valore massimo è 1800 secondi.

Qual è il formato dell'URL del server del Registro di sistema privato?

È necessario immettere l'URL completo del registro, incluso http:// o https://.

Qual è il formato per il nome dell'immagine nell'opzione del Registro di sistema privato?

Aggiungere il nome dell'immagine completa, incluso l'URL del registro privato (ad esempio myacr.azurecr.io/dotnet:latest). I nomi di immagine che usano una porta personalizzata non possono essere inseriti tramite il portale. Per impostare docker-custom-image-name usare lo azstrumento dalla riga di comando.

È possibile esporre più di una porta sull'immagine del contenitore personalizzato?

Non è supportata l'esposizione di più porte.

È possibile usare la propria archiviazione?

Sì, l'opzione che consente di usare la propria archiviazione è disponibile in anteprima.

Perché non è possibile accedere al file system del contenitore personalizzato o ai processi in esecuzione dal sito SCM?

Il sito SCM viene eseguito in un contenitore separato. Non è possibile controllare il file system o i processi in esecuzione del contenitore dell'app.

È necessario implementare HTTPS nel contenitore personalizzato?

No, la piattaforma gestisce l'interruzione HTTPS a livello dei server front-end condivisi.

È necessario usare WEBSITES_PORT per i contenitori personalizzati?

Sì, questa operazione è necessaria per i contenitori personalizzati. Per configurare manualmente una porta personalizzata, usare l'istruzione EXPOSE nel Dockerfile e l'impostazione dell'app, WEBSITES_PORT, con un valore di porta da associare nel contenitore.

È possibile usare ASPNETCORE_URLS nell'immagine Docker?

Sì, sovrascrivere la variabile di ambiente prima dell'avvio dell'app .NET Core. Ad esempio, nello script di init.sh: esportazione ASPNETCORE_URLS={Valore}

Multi-contenitore con Docker Compose

Come si configura Registro Azure Container da usare con più contenitori?

Per usare Registro Azure Container con più contenitori, tutte le immagini del contenitore devono essere ospitate nello stesso server di Registro Azure Container. Una volta che si trovano nello stesso server del Registro di sistema, sarà necessario creare le impostazioni dell'applicazione e quindi aggiornare il file di configurazione Docker Compose per includere il nome dell'immagine del Registro Azure Container.

Definire le impostazioni dell'applicazione seguenti:

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL (URL completo, ad esempio : https://<server-name>.azurecr.io)
  • DOCKER_REGISTRY_SERVER_PASSWORD (abilitare l'accesso di amministratore nelle impostazioni di Registro Azure Container)

Nel file di configurazione fare riferimento all'immagine di Registro Azure Container come nell'esempio seguente:

image: <server-name>.azurecr.io/<image-name>:<tag>

Come è possibile sapere quale il contenitore è accessibile tramite Internet?

  • Solo un contenitore può essere aperto per l'accesso
  • Solo le porte 80 e 8080 sono accessibili (porte esposte)

Di seguito vengono indicate le regole per determinare quale contenitore è accessibile (in ordine di precedenza):

  • Impostazione dell'applicazione WEBSITES_WEB_CONTAINER_NAME definita sul nome del contenitore
  • Il primo contenitore definito dalla porta 80 o 8080
  • Se nessuna delle condizioni precedenti è soddisfatta, il primo contenitore definito nel file sarà accessibile (esposto)

Ricerca per categorie usare depends_on?

L'opzione depends_on non è supportata in servizio app e verrà ignorata. Proprio come la raccomandazione di avvio e arresto del controllo da Docker, servizio app le app multi-contenitore devono controllare le dipendenze tramite il codice dell'applicazione, sia all'avvio che alla disconnessione. Il codice di esempio seguente mostra un controllo dell'app Python per verificare se un contenitore Redis è in esecuzione.

import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello from Azure App Service team! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

WebSocket

I Web Socket sono supportati nelle app Linux. L'impostazione webSocketsEnabled arm non si applica alle app Linux perché i Web Socket sono sempre abilitati per Linux.

Importante

I Web Socket sono ora supportati per le app Linux nei piani di servizio app gratuito. Sono supportate fino a cinque connessioni Web Socket nei piani free servizio app. Il superamento di questo limite comporta una risposta HTTP 429 (troppe richieste).

Prezzi e contratto di servizio

Qual è il piano tariffario ora che il servizio è generalmente disponibile?

I prezzi variano in base allo SKU e all'area, ma è possibile visualizzare altri dettagli nella pagina dei prezzi: servizio app Prezzi.

Altre domande

Come funziona la richiesta di riscaldamento del contenitore?

Quando app Azure Services avvia il contenitore, la richiesta di riscaldamento invia una richiesta HTTP all'endpoint /robots933456.txt dell'applicazione. Si tratta semplicemente di un endpoint fittizio, ma l'applicazione deve rispondere con qualsiasi codice di stato non 5XX. Se la logica dell'applicazione non risponde con codice di stato HTTP a endpoint inesistenti, la richiesta di riscaldamento non può ricevere una risposta e riavvia in modo perpetuo il contenitore. La richiesta di riscaldamento potrebbe anche non riuscire a causa di errori di configurazione della porta.

Per assicurarsi che la porta sia configurata correttamente in app Azure Services, vedere la domanda Ricerca per categorie specificare la porta nel contenitore Linux?

È possibile aumentare il timeout della richiesta di riscaldamento del contenitore?

La richiesta di riscaldamento per impostazione predefinita ha esito negativo dopo l'attesa di 240 secondi per una risposta dal contenitore. È possibile aumentare il timeout della richiesta di riscaldamento del contenitore aggiungendo l'impostazione WEBSITES_CONTAINER_START_TIME_LIMIT dell'applicazione con un valore compreso tra 240 e 1800 secondi.

Ricerca per categorie specificare la porta nel contenitore Linux?

Tipo di contenitore Descrizione Come impostare/usare la porta
Contenitori predefiniti Se si seleziona una versione del linguaggio/framework per un'app Linux, viene selezionato automaticamente un contenitore predefinito. Per puntare il codice dell'app alla porta corretta, usare la variabile di ambiente PORT.
Contenitori personalizzati Si ha il controllo completo sul contenitore. servizio app non ha alcun controllo sulla porta su cui il contenitore è in ascolto. Ciò che serve è sapere a quale porta inoltrare le richieste. Se il contenitore è in ascolto della porta 80 o 8080, servizio app è in grado di rilevarlo automaticamente. Se è in ascolto di qualsiasi altra porta, è necessario impostare l'impostazione dell'app WEBSITES_PORT sul numero di porta e servizio app inoltra le richieste a tale porta nel contenitore. L'impostazione dell'app WEBSITES_PORT non ha alcun effetto all'interno del contenitore e non è possibile accedervi come variabile di ambiente all'interno del contenitore.

È possibile usare un database basato su file (ad esempio SQLite) con l'app Web Linux?

Il file system dell'applicazione è una condivisione di rete montata. In questo modo è possibile aumentare le istanze degli scenari in cui il codice deve essere eseguito in più host. Purtroppo questo blocca l'uso di provider di database basati su file come SQLite poiché non è possibile acquisire blocchi esclusivi nel file di database. È consigliabile un servizio di database gestito: Azure SQL, Database di Azure per MySQL o Database di Azure per PostgreSQL

Quali sono i caratteri supportati nei nomi delle impostazioni dell'applicazione?

Per le impostazioni dell'applicazione è possibile usare solo lettere (A-Z, a-z), numeri (0-9) e il carattere di sottolineatura (_).

Dove è possibile richiedere nuove funzionalità?

È possibile inviare l'idea al forum dei commenti App Web. Aggiungere "[Linux]" al titolo dell'idea.