Domande frequenti - Azure Servizio app in Linux

Riassunto

Questo articolo risponde a domande comuni su Servizio app in Linux.

Immagini integrate

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

La tabella seguente elenca i valori previsti per ogni stack:

Stack Valore previsto
Java Platform, Standard Edition (Java SE) Comando per avviare l'app JAR ( ad esempio , java -jar /home/site/wwwroot/app.jar --server.port=80)
Tomcat Percorso di uno script per eseguire le configurazioni necessarie (ad esempio, /home/site/deployments/tools/startup_script.sh)
Node.js File di configurazione di Process Manager 2 (PM2) o file di script
.NET Core Nome della DLL compilato come dotnet <myapp>.dll
PHP Avvio personalizzato facoltativo
Pitone Script di avvio facoltativo
rubino Script Ruby che inizializza 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 si seleziona il pulsante di riavvio nel portale di Azure?

Questa azione equivale a un riavvio di Docker.

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

Sì, è possibile connettersi tramite il sito di gestione del controllo del codice sorgente (SCM) Azure.

Note

È anche possibile connettersi al contenitore dell'app dal computer locale usando SSH, Secure File Transfer Protocol (SFTP) o Visual Studio (VS).

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

Impostare il reserved campo del servizio app su true.

Integrazione e distribuzione continue

L'app Web usa ancora un'immagine del contenitore Docker precedente dopo averlo aggiornato in Docker Hub. È supportata l'integrazione continua e la distribuzione (CI/CD) di contenitori personalizzati?

Sì, CI/CD è supportato. Per altre informazioni, vedere Distribuzione continua con App Web per contenitori.

Supportate gli ambienti di staging?

Sì.

È possibile usare WebDeploy/MSDeploy?

Sì, impostare l'impostazione WEBSITE_WEBDEPLOY_USE_SCM su false.

La distribuzione Git non riesce utilizzando applicazioni web su Linux. Come è possibile risolvere il problema?

Usare una delle opzioni seguenti:

  • Usare il Continuous Delivery di Azure con Azure DevOps o GitHub.
  • Usare l'API zipdeploy ed eseguire il comando seguente dal computer locale:
curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy

Supporto linguistico

Voglio usare WebSocket nella mia applicazione Node.js. Sono disponibili impostazioni o configurazioni speciali da impostare?

Sì, disabilitare perMessageDeflate nel codice Node.js sul lato server. Ad esempio, se si usa 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 dovrebbe rilevare che si sta distribuendo un'applicazione PHP (a causa della presenza di un composer.lock file). Kudu avvia quindi un'installazione con Composer.

Contenitori personalizzati

È possibile usare le identità gestite durante il pull delle immagini da Registro Azure Container?

Sì. Usare l'interfaccia della riga di comando di Azure (non il portale di Azure). È possibile usare identità assegnate dal sistema o assegnate dall'utente .

Uso un contenitore personalizzato. Si vuole che la piattaforma supporti una condivisione SMB (Server Message Block) nella /home/ directory. È possibile farlo?

Se l'impostazione WEBSITES_ENABLE_APP_SERVICE_STORAGE 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. L'impostazione esplicita su WEBSITES_ENABLE_APP_SERVICE_STORAGEtrue abilita il montaggio. Una volta impostato questo valore su true, per disattivare il montaggio devi impostare esplicitamente WEBSITES_ENABLE_APP_SERVICE_STORAGE su false.

Il contenitore non si avvia e mostra un messaggio di errore "no space left on device". 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 qualsiasi immagine personalizzata sul worker. È 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, viene utilizzato 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 usa bring your own storage (BYOS), genera errori di avvio o eccezioni di runtime dopo il superamento del limite di spazio su disco host. Mantieni le immagini del container più piccole possibile e scrivi i dati nell'archiviazione persistente o in BYOS quando esegui App Service in Linux. Se non è possibile, 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 mio contenitore personalizzato richiede molto tempo e la piattaforma riavvia il contenitore prima che finisca di avviarsi. Come è possibile correggerlo?

È possibile configurare la quantità di tempo di attesa della piattaforma prima del riavvio del contenitore. Imposta l'impostazione dell'app WEBSITES_CONTAINER_START_TIME_LIMIT sul valore desiderato. Il valore minimo predefinito è 230 secondi e il valore massimo è 1800 secondi.

Qual è il formato dell'URL del server del registro privato?

Specificare l'URL completo del Registro di sistema, incluso https://.

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

Aggiungere il nome completo dell'immagine, incluso l'URL del registro privato, ad esempio myacr.azurecr.io/dotnet:latest. I nomi delle immagini che usano una porta personalizzata non possono essere immessi 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?

Questa operazione non è supportata.

È possibile usare il proprio spazio di archiviazione (BYOS)?

Sì. BYOS è attualmente in anteprima.

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

Il sito SCM funziona 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 la terminazione HTTPS nei front-end condivisi.

È necessario usare WEBSITES_PORT per i contenitori personalizzati?

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

È possibile usare ASPNETCORE_URLS nell'immagine Docker?

Sì. Assicurarsi di sovrascrivere la variabile di ambiente prima dell'avvio dell'app .NET Core. Ad esempio, nello init.sh script usare : export ASPNETCORE_URLS={Your value}.

Il multi-contenitore con Docker Compose

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

Per usare Registro Azure Container con più contenitori, ospitare tutte le immagini del contenitore nello stesso server del Registro di sistema Registro Azure Container. Quando le immagini si trovano nello stesso server del Registro di sistema, creare le impostazioni dell'applicazione e aggiornare il file di configurazione di Docker Compose in modo da includere il nome dell'immagine Registro Azure Container.

Definire le impostazioni dell'applicazione seguenti:

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL Usare un URL completo. Ad esempio: https://<server-name>.azurecr.io.)
  • DOCKER_REGISTRY_SERVER_PASSWORDAbilitare l'accesso amministratore nelle impostazioni di Registro Azure Container.

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

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

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

  • È possibile aprire un solo contenitore per l'accesso.
  • Solo le porte 80 e 8080 sono accessibili (porte esposte).

Ecco le regole per determinare quale contenitore è accessibile (nell'ordine di precedenza):

  • Impostazione dell'applicazione WEBSITES_WEB_CONTAINER_NAME sul nome del contenitore.
  • Primo contenitore per definire la porta 80 o 8080.
  • Se nessuna delle regole precedenti è true, il primo contenitore definito nel file è accessibile (esposto).

Come si usa depends_on?

Il servizio app non supporta l'opzione depends_on e la ignora. Come nella raccomandazione di Docker relativa al controllo dell'avvio e dell'arresto, le app multi-contenitore di App Service devono verificare le dipendenze tramite il codice dell'applicazione, sia all'avvio che all'arresto.

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)

I WebSocket sono supportati?

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

Importante

I WebSocket sono ora supportati per le app Linux nei piani di servizio app gratuiti. È possibile avere fino a cinque connessioni WebSocket. Il superamento di questo limite genera un errore HTTP 429 (troppe richieste).

Prezzi e contratto di licenza del servizio (SLA)

Qual è il prezzo ora che il servizio è disponibile a livello generale?

I prezzi variano in base a SKU e area geografica. Per altre informazioni, vedere la pagina dei prezzi: Prezzi del servizio app.

Altre domande

Come funziona la richiesta di riscaldamento del contenitore?

Quando il servizio app avvia il contenitore, la richiesta di riscaldamento invia una richiesta HTTP all'endpoint /robots933456.txt dell'applicazione. Questo endpoint è un segnaposto, ma l'applicazione deve rispondere restituendo qualsiasi codice di stato (incluso 5xx). Se la logica dell'applicazione non risponde inviando un codice di stato HTTP agli endpoint inesistenti, la richiesta di riscaldamento non può ricevere una risposta. Pertanto, riavvia costantemente il contenitore.

Per modificare questo comportamento predefinito, personalizzare il percorso dell'endpoint di warmup e i codici di stato in base ai quali il sito viene considerato pronto. Impostare le impostazioni dell'applicazione WEBSITE_WARMUP_PATH e WEBSITE_WARMUP_STATUSES .

La richiesta di riscaldamento potrebbe anche non riuscire a causa di errori di configurazione della porta.

È 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.

Come si specifica la porta nel contenitore Linux?

La tabella seguente descrive come specificare la porta nel contenitore Linux:

Tipo di contenitore Description Come impostare o 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 PORT variabile di ambiente.
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 8080 o 80, il servizio App Service è 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 il servizio app inoltra le richieste a tale porta nel contenitore. L'impostazione WEBSITES_PORT dell'app 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 scalare orizzontalmente gli scenari dove il codice deve essere eseguito su più host. Tuttavia, questo blocca l'uso di provider di database basati su file come SQLite poiché non è possibile acquisire blocchi esclusivi nel file di database. Usare un servizio di database gestito, ad esempio 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.

References