Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra la configurazione di distribuzione e runtime più comune per le app Java nel servizio app di Azure. Se è la prima volta che si usa il servizio app di Azure, è necessario prima leggere la guida introduttiva a Java. È possibile trovare le risposte alle domande generali sull'uso del servizio app non specifiche dello sviluppo Java nelle domande frequenti sul servizio app.
Il servizio app di Azure esegue applicazioni Web Java in un servizio completamente gestito in tre varianti:
- Java Standard Edition (SE): può eseguire un'app distribuita come pacchetto JAR (Java Archive) che contiene un server incorporato (ad esempio Spring Boot, Quarkus, Dropwizard o un'app con un server Tomcat o Jetty incorporato).
- Tomcat: il server Tomcat predefinito può eseguire un'app distribuita come pacchetto WAR (Web Application Archive).
- JBoss Enterprise Application Platform (EAP): il server JBoss EAP predefinito può eseguire un'app distribuita come pacchetto EAR (WAR o enterprise archive). Supportato per le app Linux in un set di piani tariffari che includono Free, Premium v3 e Isolated v2.gti
Visualizzare la versione di Java
Per visualizzare la versione corrente di Java, eseguire il comando seguente in Azure Cloud Shell:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion
Per visualizzare tutte le versioni java supportate, eseguire il comando seguente in Cloud Shell:
az webapp list-runtimes --os linux | grep "JAVA\|TOMCAT\|JBOSSEAP"
Ottenere la versione Java nel contenitore Linux
Per informazioni più dettagliate sulla versione nel contenitore Linux, aprire una sessione SSH con il contenitore. Ecco alcuni esempi di ciò che è possibile eseguire.
Per visualizzare la versione java nella sessione SSH:
java -version
Per visualizzare la versione del server Tomcat nella sessione SSH:
sh /usr/local/tomcat/version.sh
In alternativa, se il server Tomcat si trova in una posizione personalizzata, trovare version.sh
con:
find / -name "version.sh"
Per visualizzare la versione del server JBoss EAP nella sessione SSH:
$JBOSS_HOME/bin/jboss-cli.sh --connect --commands=:product-info
Per ulteriori informazioni sul supporto della versione, vedere la politica di supporto del runtime linguistico dell'App Service.
Cosa accade ai runtime obsoleti nel servizio app?
I runtime obsoleti sono deprecati dall'organizzazione di gestione o hanno rilevato vulnerabilità significative. Di conseguenza, vengono rimossi dalle pagine di creazione e configurazione nel portale. Quando un runtime obsoleto è nascosto dal portale, qualsiasi app che usa ancora tale runtime continua a essere eseguita.
Se si vuole creare un'app con una versione di runtime obsoleta non più visualizzata nel portale, usare l'interfaccia della riga di comando di Azure, il modello arm o Bicep. Queste alternative di distribuzione consentono di creare runtime deprecati che sono stati rimossi dal portale, ma continuano a essere supportati.
Se un runtime viene rimosso completamente dalla piattaforma del servizio app, il proprietario della sottoscrizione di Azure riceve un avviso di posta elettronica prima della rimozione.
Distribuzione dell'app
Strumenti di compilazione
Intenditore
Usando il plug-in Maven per App Web di Azure, è possibile preparare facilmente il progetto con un comando nella radice del progetto:
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:config
Questo comando aggiunge un azure-webapp-maven-plugin
plug-in e la configurazione correlata richiedendo di selezionare un'app Web di Azure esistente o di crearne una nuova. Durante la configurazione, tenta di rilevare se l'applicazione deve essere distribuita in Java SE, Tomcat o (solo Linux) JBoss EAP. È quindi possibile distribuire l'app Java in Azure usando il comando seguente:
mvn package azure-webapp:deploy
Ecco una configurazione di esempio in pom.xml
:
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>2.11.0</version>
<configuration>
<subscriptionId>111111-11111-11111-1111111</subscriptionId>
<resourceGroup>spring-boot-xxxxxxxxxx-rg</resourceGroup>
<appName>spring-boot-xxxxxxxxxx</appName>
<pricingTier>B2</pricingTier>
<region>westus</region>
<runtime>
<os>Linux</os>
<webContainer>Java SE</webContainer>
<javaVersion>Java 17</javaVersion>
</runtime>
<deployment>
<resources>
<resource>
<type>jar</type>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
Gradle
Configurare il plug-in Gradle per app Web di Azure aggiungendo il plug-in a
build.gradle
:plugins { id "com.microsoft.azure.azurewebapp" version "1.10.0" }
Configurare i dettagli dell'app Web. Le risorse di Azure corrispondenti vengono create se non esistono. Ecco una configurazione di esempio. Per informazioni dettagliate, vedere questo documento.
azurewebapp { subscription = '<your subscription id>' resourceGroup = '<your resource group>' appName = '<your app name>' pricingTier = '<price tier like 'P1v2'>' region = '<region like 'westus'>' runtime { os = 'Linux' webContainer = 'Tomcat 10.0' // or 'Java SE' if you want to run an executable jar javaVersion = 'Java 17' } appSettings { <key> = <value> } auth { type = 'azure_cli' // support azure_cli, oauth2, device_code and service_principal } }
Eseguire la distribuzione con un unico comando.
gradle azureWebAppDeploy
IDE
Azure offre un'esperienza di sviluppo ottimale del servizio app Java in ambienti di sviluppo integrato Java (IDE), tra cui:
- VS Code: App Web Java con Visual Studio Code.
- IntelliJ IDEA: creare un'app Web Hello World per il servizio app di Azure usando IntelliJ.
- Eclipse IDE: creare un'app Web Hello World per il servizio app di Azure usando Eclipse.
API Kudu
Per distribuire file jar (Java Archive) in Java SE, usare l'endpoint /api/publish
del sito Kudu. Per altre informazioni su questa API, vedere questa documentazione.
Nota
L'applicazione JAR deve essere denominata app.jar
per il servizio app per identificare ed eseguire l'applicazione. Il plug-in Maven denomina automaticamente l'applicazione durante la distribuzione. Se non si vuole rinominare il file JAR in app.jar
, è possibile caricare uno script della shell con il comando per eseguire l'app JAR. Incollare il percorso assoluto di questo script nella casella di testo File di avvio nella sezione Configurazione del portale. Lo script di avvio non viene eseguito dalla directory in cui si trova. Pertanto, usare sempre percorsi assoluti per fare riferimento ai file dello script di avvio, ad esempio java -jar /home/myapp/myapp.jar
.
Per distribuire file WAR in Tomcat, usare l'endpoint /api/wardeploy/
per POST
il file di archivio. Per altre informazioni su questa API, vedere questa documentazione.
Per distribuire file WAR in JBoss EAP, usare l'endpoint /api/wardeploy/
per POST
il file di archivio. Per altre informazioni su questa API, vedere questa documentazione.
Per distribuire i file EAR, utilizzare FTP. L'applicazione EAR viene distribuita nella radice del contesto definita nella configurazione dell'applicazione. Ad esempio, se la radice del contesto dell'app è <context-root>myapp</context-root>
, è possibile esplorare il sito nel percorso /myapp
: http://my-app-name.azurewebsites.net/myapp
. Se desideri che la tua applicazione web venga servita nel percorso radice, assicurati che l'applicazione imposti il contesto root sul percorso radice: <context-root>/</context-root>
. Per altre informazioni, vedere Impostazione della radice del contesto di un'applicazione Web.
Non distribuire WAR o JAR tramite FTP. Lo strumento FTP è stato progettato per caricare script di avvio, dipendenze o altri file di runtime. Non è la scelta ottimale per la distribuzione di app Web.
Riscrivere o reindirizzare un URL
Per riscrivere o reindirizzare un URL, usare uno dei rewriter URL disponibili, ad esempio UrlRewriteFilter.
Tomcat fornisce anche una valvola di riscrittura.
JBoss EAP fornisce anche una valvola di riscrittura.
Registrazione e debug delle app
Nel portale di Azure sono disponibili report sulle prestazioni, visualizzazioni del traffico e controlli dell'integrità per ogni app. Per ulteriori informazioni, vedere Panoramica della diagnostica App Service di Azure.
Trasmettere i log di diagnostica
È possibile accedere ai log della console generati dall'interno del contenitore.
Per attivare la registrazione dei contenitori, eseguire il comando seguente:
az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem
Sostituire <app-name>
e <resource-group-name>
con i nomi appropriati per l'app Web.
Dopo aver attivato la registrazione dei contenitori, eseguire il comando seguente per visualizzare il flusso di log:
az webapp log tail --name <app-name> --resource-group <resource-group-name>
Se i log della console non vengono visualizzati immediatamente, controllare di nuovo in 30 secondi.
Per arrestare lo streaming dei log in qualsiasi momento, selezionare CTRL+C.
È anche possibile ispezionare i file di log in un browser all'indirizzo https://<app-name>.scm.azurewebsites.net/api/logs/docker
. Per le app create di recente, usare https://<app-name>-<random-hash>.scm.<region>.azurewebsites.net/
.
Per ulteriori informazioni, vedere Visualizzare i log in Cloud Shell.
Accesso alla console SSH in Linux
Per aprire una sessione SSH diretta con il contenitore, l'app deve essere in esecuzione.
Incollare l'URL seguente nel browser e sostituire <app-name> con il nome dell'app:
https://<app-name>.scm.azurewebsites.net/webssh/host
Se non lo si è già fatto, per connettersi è necessario eseguire l'autenticazione con la sottoscrizione di Azure. Al termine dell'autenticazione viene visualizzata una shell nel browser, in cui è possibile eseguire i comandi all'interno del contenitore.
Nota
Tutte le modifiche apportate all'esterno della /home
directory vengono archiviate nel contenitore stesso e non vengono mantenute oltre un riavvio dell'app.
Per aprire una sessione SSH remota dal computer locale, vedere Aprire una sessione SSH dalla shell remota.
Strumento per la risoluzione dei problemi di Linux
Le immagini Java predefinite si basano sul sistema operativo Alpine Linux . Usare la gestione pacchetti apk
per installare gli strumenti o i comandi per la risoluzione dei problemi.
Profiler Java
Tutti i runtime Java nel servizio app di Azure sono dotati di Java Development Kit (JDK) Flight Recorder per la profilatura dei carichi di lavoro Java. È possibile usarlo per registrare eventi di sistema ed applicazioni java virtual machine (JVM) e per risolvere i problemi nelle applicazioni.
Per altre informazioni sul profiler Java, vedere la documentazione di Azure Application Insights.
Java Flight Recorder
Tutti i runtime Java su App Service includono il Java Flight Recorder. È possibile usarlo per registrare gli eventi JVM, di sistema e dell'applicazione e per risolvere i problemi nelle applicazioni Java.
Eseguire SSH nel servizio app ed eseguire il jcmd
comando per visualizzare un elenco di tutti i processi Java in esecuzione. Oltre a jcmd
stesso, dovresti vedere la tua applicazione Java in esecuzione con un numero di ID processo (PID).
078990bbcd11:/home# jcmd
Picked up JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true
147 sun.tools.jcmd.JCmd
116 /home/site/wwwroot/app.jar
Eseguire il comando seguente per avviare una registrazione di 30 secondi della JVM. Esegue la profilatura della JVM e crea un file JFR (Java Flight Recorder) denominato jfr_example.jfr
nella home directory. Sostituire 116
con il PID dell'app Java.
jcmd 116 JFR.start name=MyRecording settings=profile duration=30s filename="/home/jfr_example.jfr"
Durante l'intervallo di 30 secondi, è possibile verificare che la registrazione avvenga eseguendo jcmd 116 JFR.check
. Il comando mostra tutte le registrazioni per il processo Java specificato.
Registrazione continua
È possibile usare Java Flight Recorder per profilare continuamente l'applicazione Java con un impatto minimo sulle prestazioni di runtime. A tale scopo, eseguire il comando seguente dell'interfaccia della riga di comando di Azure per creare un'impostazione dell'app denominata JAVA_OPTS
con la configurazione necessaria. I contenuti dell'impostazione dell'app JAVA_OPTS
vengono passati al comando java
all'avvio dell'app.
az webapp config appsettings set -g <your_resource_group> -n <your_app_name> --settings JAVA_OPTS=-XX:StartFlightRecording=disk=true,name=continuous_recording,dumponexit=true,maxsize=1024m,maxage=1d
Dopo l'avvio della registrazione, è possibile eseguire il dump dei dati di registrazione correnti in qualsiasi momento usando il JFR.dump
comando .
jcmd <pid> JFR.dump name=continuous_recording filename="/home/recording1.jfr"
Analizzare i file JFR
Usare FTPS per scaricare il file JFR nel computer locale. Per analizzare il file JFR, scaricare e installare Java Mission Control (JMC). Per istruzioni su come usare Java Mission Control, vedere la documentazione di JMC e le istruzioni di installazione.
Registrazione dell'app
"Per configurare il servizio app in modo che scriva gli output della console standard dell'applicazione e i flussi di errore della console standard nel file system locale o in Archiviazione BLOB di Azure, eseguire le operazioni seguenti. Abilitare la registrazione delle applicazioni tramite il portale di Azure o nell'interfaccia della riga di comando di Azure. Se è necessaria una conservazione più lunga, configurare l'applicazione per scrivere l'output in un contenitore di archiviazione BLOB.
I log delle app Java e Tomcat sono disponibili nella /home/LogFiles/Application/
directory .
La registrazione di Azure Blob Storage per le app basate su Linux può essere configurata solo usando Azure Monitor.
Se l'applicazione usa Logback o Log4j per la traccia, è possibile inoltrare queste tracce per la revisione in Azure Application Insights. Usare le istruzioni per la configurazione del framework di log in Esplorare i log di traccia Java in Application Insights.
Nota
A causa della vulnerabilità CVE-2021-44228
nota, assicurarsi di usare Log4j versione 2.16 o successiva.
Personalizzazione e ottimizzazione
Il servizio app di Azure supporta l'ottimizzazione e la personalizzazione integrate tramite il portale di Azure e la CLI di Azure. Per la configurazione delle app Web non specifiche di Java, vedere gli articoli seguenti:
- Configurare le impostazioni dell'app
- Configurare un dominio personalizzato
- Configurare le associazioni TLS/SSL
- Aggiungere una rete CDN
- Configurare il sito Kudu
Copiare il contenuto dell'app in locale
Configurare l'impostazione dell'app JAVA_COPY_ALL
su true
per copiare il contenuto dell'app nel ruolo di lavoro locale dal file system condiviso. Questa impostazione consente di risolvere i problemi di blocco dei file.
Impostare le opzioni di runtime Java
Per impostare la memoria allocata o altre opzioni di runtime JVM, creare un'impostazione dell'app denominata JAVA_OPTS
con le opzioni. Il servizio app passa questa impostazione come variabile di ambiente al runtime Java all'avvio.
Nel portale di Azure, in Impostazioni applicazione per l'app Web, creare una nuova impostazione dell'app denominata JAVA_OPTS
che include altre impostazioni, ad esempio -Xms512m -Xmx1204m
.
Nel portale di Azure, in Impostazioni applicazione per l'app Web, creare una nuova impostazione dell'app denominata CATALINA_OPTS
che include altre impostazioni, ad esempio -Xms512m -Xmx1204m
.
Per configurare l'impostazione dell'app dal plug-in Maven, aggiungere i tag setting/value nella sezione dei plug-in di Azure. L'esempio seguente imposta le dimensioni heap Java specifiche minime e massime:
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Xms1024m -Xmx1024m</value>
</property>
</appSettings>
Nota
Non è necessario creare un file web.config quando si usa Tomcat nel servizio app di Windows.
Gli sviluppatori che eseguono una singola applicazione con uno slot di distribuzione nel piano di servizio app possono usare le opzioni seguenti:
- Istanze B1 e S1:
-Xms1024m -Xmx1024m
- Istanze B2 e S2:
-Xms3072m -Xmx3072m
- Istanze B3 e S3:
-Xms6144m -Xmx6144m
- Istanze P1v2:
-Xms3072m -Xmx3072m
- Istanze P2v2:
-Xms6144m -Xmx6144m
- Istanze P3v2:
-Xms12800m -Xmx12800m
- Istanze P1v3:
-Xms6656m -Xmx6656m
- Istanze P2v3:
-Xms14848m -Xmx14848m
- Istanze P3v3:
-Xms30720m -Xmx30720m
- Istanze I1:
-Xms3072m -Xmx3072m
- Istanze I2:
-Xms6144m -Xmx6144m
- Istanze di tipo I3:
-Xms12800m -Xmx12800m
- Istanze I1v2:
-Xms6656m -Xmx6656m
- Istanze I2v2:
-Xms14848m -Xmx14848m
- Istanze I3v2:
-Xms30720m -Xmx30720m
Quando si ottimizzano le impostazioni dell'heap dell'applicazione, esaminare i dettagli del piano di servizio app. Prendere in considerazione le esigenze di più applicazioni e slot di distribuzione per trovare l'allocazione ottimale della memoria.
Attivare i Web Socket
Attivare il supporto per web socket nel portale di Azure nelle impostazioni dell'applicazione per l'applicazione. È necessario riavviare l'applicazione per rendere effettiva l'impostazione.
Attivare il supporto web socket usando l'interfaccia della riga di comando di Azure con il comando seguente:
az webapp config set --name <app-name> --resource-group <resource-group-name> --web-sockets-enabled true
Riavviare quindi l'applicazione:
az webapp stop --name <app-name> --resource-group <resource-group-name>
az webapp start --name <app-name> --resource-group <resource-group-name>
Impostare la codifica dei caratteri predefinita
Nel portale di Azure, in Impostazioni applicazione per l'app Web, creare una nuova impostazione dell'app denominata JAVA_OPTS
con valore -Dfile.encoding=UTF-8
.
In alternativa, è possibile configurare l'impostazione dell'app usando il plug-in Maven del servizio app. Aggiungere i tag del nome dell'impostazione e del valore nella configurazione del plug-in:
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Dfile.encoding=UTF-8</value>
</property>
</appSettings>
Precompilare i file JSP
Per migliorare le prestazioni delle applicazioni Tomcat, è possibile compilare i file JSP prima della distribuzione nel Servizio app di Azure. È possibile usare il plug-in Maven fornito da Apache Sling o usare questo file di compilazione Ant.
Ignorare il messaggio robots933456 nei log
Nei log del contenitore potrebbe essere visualizzato il messaggio seguente:
2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"
Questo messaggio può tranquillamente essere ignorato.
/robots933456.txt
è un percorso URL fittizio usato dal servizio app per verificare se il contenitore è in grado di gestire le richieste. Una risposta 404 indica che il percorso non esiste e segnala al servizio app che il contenitore è integro e pronto per rispondere alle richieste.
Scegliere una versione di runtime Java
Il servizio app consente agli utenti di scegliere la versione principale della JVM, ad esempio Java 8 o Java 11, e la versione della patch, ad esempio 1.8.0_232 o 11.0.5. È anche possibile scegliere di aggiornare automaticamente la versione della patch man mano che diventano disponibili nuove versioni secondarie. Nella maggior parte dei casi, le app di produzione devono usare versioni JVM patch aggiunte, che impediscono interruzioni impreviste durante l'aggiornamento automatico di una versione patch. Tutte le app Web Java usano JVM a 64 bit e non sono configurabili.
Se si usa Tomcat, è possibile scegliere di aggiungere la versione patch di Tomcat. In Windows è possibile aggiungere le versioni patch di JVM e Tomcat in modo indipendente. In Linux è possibile aggiungere la versione patch di Tomcat. Anche la versione patch della JVM viene bloccata ma non è configurabile separatamente.
Se si sceglie di aggiungere la versione secondaria, è necessario aggiornare periodicamente la versione secondaria di JVM nell'app. Per assicurarsi che l'applicazione venga eseguita nella versione secondaria più recente, creare uno slot di staging e incrementare la versione secondaria nello slot di staging. Dopo aver verificato che l'applicazione funzioni correttamente nella nuova versione secondaria, è possibile scambiare gli slot di staging e produzione.
Eseguire l'interfaccia della riga di comando di JBoss
Nella sessione SSH dell'app JBoss EAP è possibile eseguire l'interfaccia della riga di comando di JBoss con il comando seguente:
$JBOSS_HOME/bin/jboss-cli.sh --connect
A seconda della posizione in cui JBoss EAP si trova nel ciclo di vita del server, potrebbe non essere possibile connettersi. Attendere alcuni minuti e riprovare. Questo approccio è utile per i controlli rapidi dello stato del server corrente, ad esempio per verificare se un'origine dati è configurata correttamente.
Inoltre, le modifiche apportate al server con l'interfaccia della riga di comando di JBoss nella sessione SSH non vengono mantenute dopo il riavvio dell'app. Ogni volta che l'app viene avviata, il server JBoss EAP inizia con un'installazione pulita. Durante il ciclo di vita di avvio, il servizio app crea le configurazioni del server necessarie e distribuisce l'app. Per apportare modifiche persistenti nel server JBoss EAP, usare uno script di avvio personalizzato o un comando di avvio. Per un esempio end-to-end, vedere Configurare le origini dati per un'app Java SE, Tomcat o JBoss EAP nel servizio app di Azure.
In alternativa, è possibile configurare manualmente servizio app per eseguire qualsiasi file all'avvio. Ad esempio:
az webapp config set --resource-group <group-name> --name <app-name> --startup-file /home/site/scripts/foo.sh
Per altre informazioni sui comandi dell'interfaccia della riga di comando che è possibile eseguire, vedere:
Raggruppamento
Il servizio app supporta il clustering per JBoss EAP versioni 7.4.1 e successive. Per abilitare il clustering, l'app Web deve essere integrata con una rete virtuale. Quando l'app Web è integrata con una rete virtuale, viene riavviata e l'installazione di JBoss EAP viene avviata automaticamente con una configurazione in cluster. Quando si eseguono più istanze con scalabilità automatica, le istanze JBoss EAP comunicano tra loro tramite la subnet specificata nell'integrazione della rete virtuale. È possibile disabilitare il clustering creando un'impostazione dell'app denominata WEBSITE_DISABLE_CLUSTERING
con qualsiasi valore.
Nota
Se abiliti l'integrazione della rete virtuale con un modello ARM, è necessario impostare manualmente la proprietà vnetPrivatePorts
su un valore di 2
. Se si abilita l'integrazione della rete virtuale dall'interfaccia della riga di comando o dal portale, questa proprietà viene impostata automaticamente.
Quando il clustering è abilitato, le istanze JBoss EAP usano il FILE_PING
protocollo di individuazione JGroups per individuare nuove istanze e rendere persistenti le informazioni sul cluster, ad esempio i membri del cluster, i relativi identificatori e i relativi indirizzi IP. Nel servizio app questi file si trovano in /home/clusterinfo/
. La prima istanza EAP da avviare ottiene le autorizzazioni di lettura/scrittura nel file di appartenenza al cluster. Altre istanze leggono il file, trovano il nodo primario e si coordinano con quel nodo per essere incluse nel cluster e aggiunte al file.
Nota
Puoi evitare i timeout di clustering di JBoss EAP eliminando i file di individuazione obsoleti durante l'avvio dell'applicazione.
I tipi di piano di servizio app Premium V3 e Isolato V2 possono essere distribuiti facoltativamente tra le zone di disponibilità per migliorare la resilienza e l'affidabilità per i carichi di lavoro critici per l'azienda. Questa architettura è nota anche come ridondanza della zona. La funzionalità di clustering JBoss EAP è compatibile con la funzionalità di ridondanza della zona.
Regole di scalabilità automatica
Quando si configurano regole di scalabilità automatica per il ridimensionamento orizzontale, è importante rimuovere le istanze in modo incrementale (una alla volta) per assicurarsi che ogni istanza rimossa possa trasferire l'attività (ad esempio la gestione di una transazione di database) a un altro membro del cluster. Quando si configurano le regole di scalabilità automatica nel portale per ridurre le prestazioni, usare le opzioni seguenti:
- Operazione: "Diminuisci il conteggio di"
- Raffreddamento: "5 minuti" o superiore
- Numero di istanze: 1
Non è necessario aggiungere istanze progressivamente (scalare orizzontalmente). È possibile aggiungere più istanze al cluster alla volta.
Piani del servizio app
JBoss EAP è disponibile nei piani tariffari seguenti: F1, P0v3, P1mv3, P2mv3, P3mv3, P4mv3 e P5mv3.
Ciclo di vita del server JBoss EAP
Un'app JBoss EAP nel servizio app passa attraverso cinque fasi distinte prima di avviare il server:
- Fase di configurazione dell'ambiente
- Fase di avvio del server
- Fase di configurazione del server
- Fase di distribuzione dell'app
- Fase di ricaricamento del server
Vedere le sezioni seguenti per informazioni dettagliate e opportunità di personalizzazione, ad esempio tramite le impostazioni dell'app.
1. Fase di configurazione dell'ambiente
- Il servizio SSH viene avviato per abilitare sessioni SSH sicure con il contenitore.
- L'archivio chiavi di runtime Java viene aggiornato con tutti i certificati pubblici e privati definiti nel portale di Azure.
- I certificati pubblici vengono forniti dalla piattaforma nella
/var/ssl/certs
directory e vengono caricati in$JRE_HOME/lib/security/cacerts
. - I certificati privati vengono forniti dalla piattaforma nella
/var/ssl/private
directory e vengono caricati in$JRE_HOME/lib/security/client.jks
.
- I certificati pubblici vengono forniti dalla piattaforma nella
- Se in questo passaggio vengono caricati certificati nell'archivio chiavi Java, le proprietà
javax.net.ssl.keyStore
,javax.net.ssl.keyStorePassword
ejavax.net.ssl.keyStoreType
vengono aggiunte allaJAVA_OPTS
variabile di ambiente. - Viene determinata una configurazione JVM iniziale, ad esempio le directory di registrazione e i parametri dell'heap della memoria Java:
- Se fornisci i flag
–Xms
o–Xmx
per la memoria nell'impostazioneJAVA_OPTS
, questi valori sostituiscono quelli forniti dalla piattaforma. - Se si configura l'impostazione
WEBSITES_CONTAINER_STOP_TIME_LIMIT
dell'app , il valore viene passato alla proprietàorg.wildfly.sigterm.suspend.timeout
di runtime , che controlla il tempo di attesa massimo di arresto (in secondi) quando JBoss EAP viene arrestato.
- Se fornisci i flag
- Se l'app è integrata con una rete virtuale, il runtime del servizio app passa un elenco di porte da usare per la comunicazione tra server nella variabile
WEBSITE_PRIVATE_PORTS
di ambiente e avvia JBoss EAP usando laclustering
configurazione. In caso contrario, viene usata lastandalone
configurazione.- Per la
clustering
configurazione, viene usato il filestandalone-azure-full-ha.xml
di configurazione del server. - Per la
standalone
configurazione, viene usato il filestandalone-full.xml
di configurazione del server.
- Per la
2. Fase di avvio del server
- Se JBoss EAP viene avviato nella
clustering
configurazione:- Ogni istanza di JBoss EAP riceve un identificatore interno compreso tra 0 e il numero di istanze in cui viene ridimensionata l'app.
- Se alcuni file vengono trovati nel percorso dell'archivio transazioni per questa istanza del server (usando il relativo identificatore interno), significa che questa istanza del server sta prendendo il posto di un'istanza del servizio identica. L'altra istanza del servizio si era bloccata in precedenza e aveva lasciato transazioni non confermate. Il server è configurato per riprendere il lavoro su queste transazioni.
- Indipendentemente dal fatto che JBoss EAP venga avviato nella
clustering
configurazione ostandalone
, se la versione del server è 7.4 o successiva e il runtime usa Java 17, la configurazione viene aggiornata per abilitare il sottosistema Elytron per la sicurezza. - Se si configura l'impostazione
WEBSITE_JBOSS_OPTS
dell'app , il valore viene passato allo script di avvio di JBoss. Questa impostazione può essere usata per fornire percorsi ai file di proprietà e altri flag che influenzano l'avvio di JBoss EAP.
3. Fase di configurazione del server
All'inizio di questa fase, il servizio app attende innanzitutto che il server JBoss EAP e l'interfaccia di amministrazione siano pronti per ricevere le richieste prima di continuare. Questo processo può richiedere alcuni secondi se Application Insights è abilitato.
Quando sia il server JBoss EAP che l'interfaccia di amministrazione sono pronti, il servizio app esegue le azioni seguenti:
- Aggiunge il modulo
azure.appservice
JBoss EAP , che fornisce classi di utilità per la registrazione e l'integrazione con il servizio app. - Aggiorna il logger della console per usare una modalità senza colore, in modo che i file di log non siano pieni di sequenze di escape dei colori.
- Configura l'integrazione con i log di Monitoraggio di Azure.
- Aggiorna gli indirizzi IP di associazione delle interfacce WSDL (Web Services Description Language) e delle interfacce di gestione.
- Aggiunge il modulo JBoss EAP per l'integrazione con l'autenticazione di App Service e Microsoft Entra ID.
- Aggiorna la configurazione di registrazione dei log di accesso e il nome e la rotazione del file di log del server principale.
- Aggiunge il modulo
A meno che l'impostazione
WEBSITE_SKIP_AUTOCONFIGURE_DATABASE
dell'app non sia definita, App Service rileva automaticamente gli URL JDBC (Java Database Connectivity) nelle impostazioni dell'app. Se esistono URL JDBC validi per PostgreSQL, MySQL, MariaDB, Oracle, SQL Server o database SQL di Azure, aggiunge i driver corrispondenti al server, aggiunge un'origine dati per ogni URL JDBC e imposta il nome JDBC (Java Naming and Directory Interface) per ogni origine dati sujava:jboss/env/jdbc/<app-setting-name>_DS
, dove<app-setting-name>
è il nome dell'impostazione dell'app.Se la
clustering
configurazione è abilitata, viene controllato il logger della console da configurare.Se sono presenti file JAR distribuiti nella
/home/site/libs
directory, viene creato un nuovo modulo globale con tutti questi file JAR.Alla fine della fase, App Service esegue lo script di avvio personalizzato, se presente. La logica di ricerca per lo script di avvio personalizzato è definita come segue:
- Se è stato configurato un comando di avvio (ad esempio, tramite il portale di Azure o l'interfaccia della riga di comando di Azure), eseguirlo; altrimenti
- Se il percorso
/home/site/scripts/startup.sh
esiste, usarlo; in caso contrario, - Se il percorso
/home/startup.sh
esiste, usarlo.
Il comando di avvio personalizzato o lo script viene eseguito come utente radice (non è necessario sudo
), in modo da poter installare pacchetti Linux o avviare l'interfaccia della riga di comando di JBoss per eseguire più comandi di installazione/personalizzazione di JBoss EAP, ad esempio la creazione di origini dati e l'installazione di adattatori di risorse. Per informazioni sui comandi di gestione dei pacchetti Ubuntu, vedere la documentazione di Ubuntu Server. Per i comandi CLI di JBoss, vedere la Guida alla gestione CLI di JBoss.
4. Fase di distribuzione dell'app
Lo script di avvio distribuisce le app in JBoss EAP esaminando le posizioni seguenti, in ordine di precedenza:
- Se configuri l'impostazione dell'app
WEBSITE_JAVA_WAR_FILE_NAME
, distribuisci il file designato da tale impostazione. - Se
/home/site/wwwroot/app.war
esiste, impiegalo. - Se esistono altri file EAR e WAR in
/home/site/wwwroot
, distribuirli. - Se
/home/site/wwwroot/webapps
esiste, distribuire i file e le directory in esso contenuti. I file WAR vengono impiegati come applicazioni autonome, e le directory vengono distribuite come applicazioni web scompresse. - Se esistono pagine JSP autonome in
/home/site/wwwroot
, copiarle nella radice del server Web e distribuirle come un'unica app Web. - Se non vengono trovati file distribuibili, distribuire la pagina iniziale predefinita (pagina di parcheggio) nel contesto radice.
5. Fase di ricaricamento del server
- Al termine della procedura di distribuzione, il server JBoss EAP viene ricaricato per applicare eventuali modifiche che richiedono un ricaricamento del server.
- Dopo il ricaricamento del server, le applicazioni distribuite nel server JBoss EAP devono essere pronte per rispondere alle richieste.
- Il server viene eseguito fino a quando l'app del servizio app non viene arrestata o riavviata. È possibile arrestare o riavviare manualmente l'App Service oppure attivare un riavvio quando si distribuiscono file o si apportano modifiche di configurazione all'App Service.
- Se il server JBoss EAP viene chiuso in modo anomalo nella
clustering
configurazione, viene eseguita una funzione finale denominataemit_alert_tx_store_not_empty
. La funzione controlla se il processo JBoss EAP ha lasciato un file di memorizzazione delle transazioni non vuoto su disco. In tal caso, viene registrato un errore nella console:Error: finishing server with non-empty store for node XXXX
. Quando viene avviata una nuova istanza del server, cerca questi file di archivio transazioni non netti per riprendere il lavoro (vedere 2. Fase di avvio del server).
Configurazione di base di Tomcat
Nota
Questa sezione si applica solo a Linux.
Gli sviluppatori Java possono personalizzare le impostazioni del server, risolvere i problemi e distribuire applicazioni in Tomcat con sicurezza se conoscono i dettagli di configurazione e file server.xml di Tomcat. Le possibili personalizzazioni includono:
- Personalizzazione della configurazione di Tomcat: quando si comprende il file di server.xml e i dettagli di configurazione di Tomcat, è possibile ottimizzare le impostazioni del server in base alle esigenze delle applicazioni.
- Debug: quando un'applicazione viene distribuita in un server Tomcat, gli sviluppatori devono conoscere la configurazione del server per eseguire il debug di eventuali problemi che potrebbero verificarsi. Questo processo include il controllo dei log del server, l'analisi dei file di configurazione e l'identificazione di eventuali errori che potrebbero verificarsi.
- Risoluzione dei problemi di Tomcat: inevitabilmente, gli sviluppatori Java riscontrano problemi con il server Tomcat, ad esempio problemi di prestazioni o errori di configurazione. Quando si comprende il file di server.xml e i dettagli di configurazione di Tomcat, gli sviluppatori possono diagnosticare e risolvere rapidamente questi problemi, risparmiando tempo e fatica.
- Distribuzione di applicazioni in Tomcat: per distribuire un'applicazione Web Java in Tomcat, gli sviluppatori devono sapere come configurare il file server.xml e altre impostazioni Tomcat. È necessario comprendere questi dettagli per distribuire correttamente le applicazioni e assicurarsi che vengano eseguite senza problemi nel server.
Quando si crea un'app con Tomcat predefinito per ospitare il carico di lavoro Java (un file WAR o un file JAR), sono disponibili alcune impostazioni predefinite per la configurazione di Tomcat. È possibile fare riferimento alla documentazione ufficiale di Apache Tomcat per informazioni dettagliate, inclusa la configurazione predefinita per Il server Web Tomcat.
Inoltre, all'avvio vengono applicate alcune trasformazioni aggiuntive al file server.xml per la distribuzione di Tomcat. Queste trasformazioni includono modifiche alle impostazioni Connettore, Host e Valvola .
Le versioni più recenti di Tomcat hanno server.xml (8.5.58 e 9.0.38 e versioni successive). Le versioni precedenti di Tomcat non usano trasformazioni e potrebbero avere un comportamento diverso.
Connettore
<Connector port="${port.http}" address="127.0.0.1" maxHttpHeaderSize="16384" compression="on" URIEncoding="UTF-8" connectionTimeout="${site.connectionTimeout}" maxThreads="${catalina.maxThreads}" maxConnections="${catalina.maxConnections}" protocol="HTTP/1.1" redirectPort="8443"/>
-
maxHttpHeaderSize
è impostato su16384
. -
URIEncoding
è impostato suUTF-8
. -
connectionTimeout
è impostato suWEBSITE_TOMCAT_CONNECTION_TIMEOUT
, che per impostazione predefinita è240000
. -
maxThreads
è impostato suWEBSITE_CATALINA_MAXTHREADS
, che per impostazione predefinita è200
. -
maxConnections
è impostato suWEBSITE_CATALINA_MAXCONNECTIONS
, che per impostazione predefinita è10000
.
Nota
Le connectionTimeout
impostazioni , maxThreads
e maxConnections
possono essere ottimizzate con le impostazioni dell'app.
Di seguito sono riportati i comandi dell'interfaccia della riga di comando di esempio che è possibile usare per modificare i valori di connectionTimeout
, maxThreads
o maxConnections
:
az webapp config appsettings set --resource-group myResourceGroup --name myApp --settings WEBSITE_TOMCAT_CONNECTION_TIMEOUT=120000
az webapp config appsettings set --resource-group myResourceGroup --name myApp --settings WEBSITE_CATALINA_MAXTHREADS=100
az webapp config appsettings set --resource-group myResourceGroup --name myApp --settings WEBSITE_CATALINA_MAXCONNECTIONS=5000
Il connettore usa l'indirizzo del contenitore anziché 127.0.0.1.
Padrone di casa / Ospitante / Conduttore (depending on the intended context)
<Host appBase="${site.appbase}" xmlBase="${site.xmlbase}" unpackWARs="${site.unpackwars}" workDir="${site.tempdir}" errorReportValveClass="com.microsoft.azure.appservice.AppServiceErrorReportValve" name="localhost" autoDeploy="true">
-
appBase
è impostato suAZURE_SITE_APP_BASE
, che per impostazione predefinita è localeWebappsLocalPath
. -
xmlBase
è impostato suAZURE_SITE_HOME
, che per impostazione predefinita è/site/wwwroot
. -
unpackWARs
è impostato suAZURE_UNPACK_WARS
, che per impostazione predefinita ètrue
. -
workDir
è impostato suJAVA_TMP_DIR
, che impostaTMP
come impostazione predefinita. -
errorReportValveClass
utilizza la nostra valvola personalizzata per la segnalazione degli errori.
Valvola
<Valve prefix="site_access_log.${catalina.instance.name}" pattern="%h %l %u %t "%r" %s %b %D %{x-arr-log-id}i" directory="${site.logdir}/http/RawLogs" maxDays="${site.logRetentionDays}" className="org.apache.catalina.valves.AccessLogValve" suffix=".txt"/>
-
directory
è impostato suAZURE_LOGGING_DIR
, che per impostazione predefinita èhome\logFiles
. -
maxDays
è impostato suWEBSITE_HTTPLOGGING_RETENTION_DAYS
, che per impostazione predefinita è7
. Questo valore è allineato all'impostazione predefinita della piattaforma di registrazione delle applicazioni.
In Linux ha tutte le stesse personalizzazioni e aggiunge alcune pagine di errore e segnalazione alla valvola:
<xsl:attribute name="appServiceErrorPage">
<xsl:value-of select="'${appService.valves.appServiceErrorPage}'"/>
</xsl:attribute>
<xsl:attribute name="showReport">
<xsl:value-of select="'${catalina.valves.showReport}'"/>
</xsl:attribute>
<xsl:attribute name="showServerInfo">
<xsl:value-of select="'${catalina.valves.showServerInfo}'"/>
</xsl:attribute>
Contenuti correlati
Visitare il Centro Azure per sviluppatori Java per trovare guide rapide, esercitazioni e documentazione di riferimento su Java di Azure.