Distribuire e configurare un'app Tomcat, JBoss o Java SE nel servizio app di Azure
Questo articolo illustra la configurazione di distribuzione e runtime più comune per le app Java nel servizio app. Se il servizio app di Azure non è mai stato usato, è necessario leggere prima la guida introduttiva Java. Le domande generali sull'uso del servizio app non specifiche per lo sviluppo Java sono disponibili nelle domande frequenti sul servizio app.
Il servizio app di Azure esegue applicazioni Web Java in un servizio completamente gestito in tre varianti:
- Java SE: può eseguire un'app distribuita come pacchetto JAR che contiene un server incorporato (ad esempio Spring Boot, Dropwizard, Quarkus o uno con un server Tomcat o Jetty incorporato).
- Tomcat: il server Tomcat predefinito può eseguire un'app distribuita come pacchetto WAR.
- JBoss EAP: supportato per le app Linux solo nei piani tariffari Gratuito, Premium v3 e Isolato v2. Il server JBoss EAP predefinito può eseguire un'app distribuita come pacchetto WAR o EAR.
Nota
Per le applicazioni Spring, è consigliabile usare Azure Spring Apps. Tuttavia, è comunque possibile usare il Servizio app di Azure come destinazione. Per consigli, vedere Indicazioni sulla destinazione del carico di lavoro Java.
Visualizzare la versione Java
Per visualizzare la versione corrente di Java, eseguire il comando seguente in Cloud Shell:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion
Per visualizzare tutte le versioni di Java supportate, eseguire il comando seguente in Cloud Shell:
az webapp list-runtimes --os linux | grep "JAVA\|TOMCAT\|JBOSSEAP"
Per altre informazioni sul supporto della versione, vedere Criteri di supporto del runtime del linguaggio del servizio app.
Distribuzione dell'app
Build Tools
Maven
Con il plug-in Maven per App Web di Azure, è possibile preparare facilmente il progetto Java Maven per App Web di Azure con un comando nella radice del progetto:
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:config
Questo comando aggiunge un plug-in azure-webapp-maven-plugin
e la configurazione correlata richiedendo di selezionare un'app Web di Azure esistente o 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 con 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. Di seguito è riportato un esempio di configurazione. 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 negli IDE Java più diffusi, 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 con IntelliJ
- Eclipse:Creare un'app Web Hello World per il servizio app di Azure con Eclipse
API Kudu
Per distribuire file JAR 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 consentire al servizio app di identificare ed eseguire l'applicazione. Il plug-in Maven esegue automaticamente questa operazione 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 con estensione war in Tomcat, usare l'endpoint /api/wardeploy/
per eseguire il comando POST per il file di archivio. Per altre informazioni su questa API, vedere questa documentazione.
Per distribuire file con estensione WAR in JBoss, usare l'endpoint /api/wardeploy/
per PUBBLICARE il file di archivio. Per altre informazioni su questa API, vedere questa documentazione.
Per distribuire file con estensione EAR, usare 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 si vuole che l'app Web venga servita nel percorso radice, assicurarsi che l'app imposti la radice del contesto sul percorso radice: <context-root>/</context-root>
. Per altre informazioni, vedere Impostazione della radice del contesto di un'applicazione Web.
Non distribuire il file con estensione 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 l'URL
Per riscrivere o reindirizzare l'URL, usare uno dei rewriter URL disponibili, ad esempio UrlRewriteFilter.
Tomcat fornisce anche una valvola di riscrittura.
JBoss 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 altre informazioni, vedere Panoramica approfondita della diagnostica del Servizio app di Azure.
Eseguire lo streaming dei log di diagnostica
È possibile accedere ai log della console generati dall'interno del contenitore.
Prima di tutto attivare la registrazione del contenitore eseguendo questo comando:
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 valori appropriati per l'app Web.
Dopo che la registrazione del contenitore è attivata, eseguire il comando seguente per visualizzare il flusso di registrazione:
az webapp log tail --name <app-name> --resource-group <resource-group-name>
Se i log di console non sono immediatamente visibili, controllare nuovamente dopo 30 secondi.
Per interrompere lo streaming dei log in qualsiasi momento, premere CTRL+C.
È anche possibile ispezionare i file di log in un browser all'indirizzo https://<app-name>.scm.azurewebsites.net/api/logs/docker
.
Per altre informazioni, vedere Eseguire lo streaming dei 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
Le eventuali modifiche apportate all'esterno della directory /home vengono archiviate nel contenitore stesso e non persistono oltre il 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 integrate sono basate sul sistema operativo Alpine Linux. Usare la gestione pacchetti apk
per installare gli strumenti o i comandi per la risoluzione dei problemi.
Java Profiler
Tutti i runtime Java nel servizio app di Azure sono dotati di JDK Flight Recorder per la profilatura di carichi di lavoro Java. È possibile usarlo per registrare eventi di JVM, sistema e applicazioni e risolvere i problemi nelle applicazioni.
Per altre informazioni su Java Profiler, vedere la documentazione di Azure Application Insights.
Flight Recorder
Tutti i runtime Java nel servizio app sono dotati di Java Flight Recorder. È possibile usarli per registrare eventi di JVM, sistema e applicazioni e risolvere i problemi nelle applicazioni Java.
Eseguire SSH nel servizio app ed eseguire il comando jcmd
per visualizzare un elenco di tutti i processi Java in esecuzione. Oltre a jcmd
se stesso, dovrebbe essere visualizzata l'applicazione Java in esecuzione con un numero 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 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 dell'interfaccia della riga di comando di Azure seguente per creare un'impostazione dell'app denominata JAVA_OPTS con la configurazione necessaria. Il contenuto dell'impostazione dell'app JAVA_OPTS viene trasmesso al comando java
quando l'app viene avviata.
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 comando JFR.dump
.
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. Per istruzioni su Java Mission Control, vedere la documentazione di JMC e le istruzioni di installazione.
Registrazione dell'app
Abilitare la registrazione dell'applicazione tramite il portale di Azure o l'interfaccia della riga di comando di Azure per configurare il servizio app per scrivere l'output della console standard dell'applicazione e i flussi di errori della console standard nel file system locale o in Archiviazione BLOB di Azure. Se è necessario un periodo di conservazione più lungo, configurare l'applicazione per scrivere l'output in un contenitore di archiviazione BLOB.
I log delle app Java e Tomcat sono reperibili nella directory /home/LogFiles/Application/.
La registrazione di Archivio BLOB di Azure per le app basate su Linux può essere configurata solo usando Monitoraggio di Azure.
Se l'applicazione usa Logback o Log4j per la traccia, è possibile inoltrare queste tracce per la revisione ad Azure Application Insights usando le istruzioni di configurazione del framework di registrazione illustrate in Esplorare i log di traccia Java in Application Insights.
Nota
A causa della vulnerabilità nota CVE-2021-44228, assicurarsi di usare Log4j versione 2.16 o successiva.
Personalizzazione e ottimizzazione
Il servizio app di Azure supporta l'ottimizzazione e la personalizzazione predefinite tramite il portale di Azure e l'interfaccia della riga di comando. Per la configurazione delle app Web non specifiche di Java, vedere gli articoli seguenti:
- Configurare le impostazioni dell'app
- Configurare un nome di dominio
- Configurare le associazioni TLS/SSL
- Aggiungere una rete CDN
- Configurare il sito di 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 I3:
-Xms12800m -Xmx12800m
- Istanze I1v2:
-Xms6656m -Xmx6656m
- Istanze I2v2:
-Xms14848m -Xmx14848m
- Istanze I3v2:
-Xms30720m -Xmx30720m
Quando si ottimizzano le impostazioni heap delle applicazioni, esaminare i dettagli del piano di servizio app e tenere 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 i Web Socket nel portale di Azure in Impostazioni applicazione per l'applicazione. È necessario riavviare l'applicazione per rendere effettiva l'impostazione.
Attivare il supporto per i 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, sotto Impostazioni applicazione per l'app Web creare una nuova impostazione dell'app denominata JAVA_OPTS
con il valore -Dfile.encoding=UTF-8
.
In alternativa, è possibile configurare l'impostazione dell'app usando il plug-in Maven del servizio app. Aggiungere i tag name e value dell'impostazione nella configurazione del plug-in:
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Dfile.encoding=UTF-8</value>
</property>
</appSettings>
Pre-compilare 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 questo file di compilazione Ant.
robots933456 nei log
È possibile che nei log del contenitore venga 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 semplicemente che il percorso non esiste, ma consente al servizio app di capire che il contenitore è integro e pronto per rispondere alle richieste.
Scelta di 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 con patch aggiunte. In questo modo si evitano 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 aggiunta 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 venga eseguita correttamente nella nuova versione secondaria, è possibile scambiare gli slot di gestione temporanea e di produzione.
Eseguire l'interfaccia della riga di comando di JBoss
Nella sessione SSH dell'app JBoss è 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 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, servizio app rende necessarie le configurazioni del server e distribuisce l'app. Per apportare modifiche persistenti nel server JBoss, 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 Tomcat, JBoss o Java SE in app Azure Service.
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:
Cluster
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 si abilita l'integrazione della rete virtuale con un modello di Resource Manager, è 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 protocollo di individuazione FILE_PING JGroups per individuare nuove istanze e rendere persistenti le informazioni del 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 il nodo da includere nel cluster e aggiunte al file.
Nota
È possibile evitare timeout di clustering JBoss pulendo i file di individuazione obsoleti durante l'avvio dell'app.
I tipi di piano di servizio app Premium V3 e Isolated V2 possono essere distribuiti facoltativamente tra 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: "Riduci conteggio per"
- Disattivazione: "5 minuti" o superiore
- Numero di istanze: 1
Non è necessario aggiungere istanze in modo incrementale (aumento del numero di istanze), è 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
Un'app JBoss EAP in servizio app passa attraverso cinque fasi distinte prima di avviare effettivamente il server.
- 1. Fase di configurazione dell'ambiente
- 2. Fase di avvio del server
- 3. Fase di configurazione del server
- 4. Fase di distribuzione dell'app
- 5. Fase di ricaricamento del server
Vedere le rispettive sezioni di seguito per informazioni dettagliate e opportunità di personalizzarla( 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 del runtime Java viene aggiornato con tutti i certificati pubblici e privati definiti in portale di Azure.
- I certificati pubblici vengono forniti dalla piattaforma nella directory /var/ssl/certs e vengono caricati in $JRE_HOME/lib/security/cacerts.
- I certificati privati vengono forniti dalla piattaforma nella directory /var/ssl/private e vengono caricati in $JRE_HOME/lib/security/client.jks.
- 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_TOOL_OPTIONS
variabile di ambiente. - Alcune configurazioni JVM iniziali vengono determinate, ad esempio le directory di registrazione e i parametri dell'heap della memoria Java:
- Se fornisci i flag o
–Xmx
per la–Xms
memoria nell'impostazioneJAVA_OPTS
dell'app , 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 viene arrestato.
- Se fornisci i flag o
- Se l'app è integrata con una rete virtuale, il runtime servizio app passa un elenco di porte da usare per la comunicazione tra server nella variabile
WEBSITE_PRIVATE_PORTS
di ambiente e avviare JBoss usando laclustering
configurazione. In caso contrario, viene usata lastandalone
configurazione.- Per la
clustering
configurazione, viene usato il file di configurazione del server standalone-azure-full-ha.xml . - Per la
standalone
configurazione, viene usato il file di configurazione del server standalone-full.xml .
- Per la
2. Fase di avvio del server
- Se JBoss viene avviato nella
clustering
configurazione:- Ogni istanza di JBoss riceve un identificatore interno compreso tra 0 e il numero di istanze a 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 che si è arrestata in modo anomalo in precedenza e ha lasciato le transazioni di cui non è stato eseguito il commit. Il server è configurato per riprendere il lavoro su queste transazioni.
- Indipendentemente dal fatto che JBoss 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.
3. Fase di configurazione del server
- All'inizio di questa fase, servizio app prima attende che il server JBoss e l'interfaccia di amministrazione siano pronti per ricevere le richieste prima di continuare. Questa operazione può richiedere alcuni secondi se Application Insights è abilitato.
- Quando sia JBoss Server che l'interfaccia di amministrazione sono pronti, servizio app esegue le operazioni seguenti:
- Aggiunge il modulo
azure.appservice
JBoss , che fornisce classi di utilità per la registrazione e l'integrazione con servizio app. - Aggiorna il logger della console per usare una modalità senza colori 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 e di gestione.
- Aggiunge il modulo
azure.appservice.easyauth
JBoss per l'integrazione con l'autenticazione servizio app e l'ID Microsoft Entra. - 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, servizio app gli URL JDBC rilevati automaticamente nelle impostazioni dell'app servizio app. Se esistono URL JDBC validi per PostgreSQL, MySQL, MariaDB, Oracle, SQL Server o database SQL di Azure, aggiunge i driver corrispondenti al server e aggiunge un'origine dati per ogni URL JDBC e imposta il nome JNDI 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 directory /home/site/libs , viene creato un nuovo modulo globale con tutti questi file JAR.
- Alla fine della fase, servizio app esegue lo script di avvio personalizzato, se presente. La logica di ricerca per lo script di avvio personalizzato è la seguente:
- Se è stato configurato un comando di avvio (nel portale di Azure, con l'interfaccia della riga di comando di Azure e così via), eseguirlo; in caso contrario,
- 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 (creazione di origini dati, installazione di adattatori di risorse) e così via. Per informazioni sui comandi di gestione dei pacchetti Ubuntu, vedere la documentazione di Ubuntu Server. Per i comandi dell'interfaccia della riga di comando di JBoss, vedere la Guida all'interfaccia della riga di comando di gestione di JBoss.
4. Fase di distribuzione dell'app
Lo script di avvio distribuisce le app in JBoss esaminando le posizioni seguenti, in ordine di precedenza:
- Se è stata configurata l'impostazione
WEBSITE_JAVA_WAR_FILE_NAME
dell'app , distribuire il file designato da esso. - Se /home/site/wwwroot/app.war esiste, distribuirlo.
- 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 distribuiti come applicazioni stesse e le directory vengono distribuite come app Web "esplose" (non compresse).
- Se esistono pagine JSP autonome in /home/site/wwwroot, copiarle nella radice del server Web e distribuirle come un'app Web.
- Se non vengono ancora trovati file distribuibili, distribuire la pagina iniziale predefinita (pagina di parcheggio) nel contesto radice.
5. Fase di ricaricamento del server
- Al termine dei passaggi di distribuzione, il server JBoss viene ricaricato per applicare le 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 servizio app non viene arrestata o riavviata. È possibile arrestare o riavviare manualmente l'app servizio app oppure attivare un riavvio quando si distribuiscono i file o si apportano modifiche di configurazione all'app servizio app.
- Se il server JBoss 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 ha lasciato un file di archivio transazioni non interrotto 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 della baseline 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: comprendendo i dettagli di configurazione di server.xml e 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. Sono inclusi 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. Comprendendo i dettagli di configurazione del file di server.xml e 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. Comprendere questi dettagli è essenziale per distribuire correttamente le applicazioni e garantire 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.
Esistono inoltre alcune trasformazioni che vengono ulteriormente applicate al server.xml per la distribuzione Tomcat all'avvio. Si tratta di trasformazioni per le 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.
Connector
<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 impostazioni connectionTimeout, 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
Host
<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 èWebappsLocalPath
localexmlBase
è 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 per impostazione predefinita èTMP
errorReportValveClass
usa la valvola di segnalazione degli errori personalizzata
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
WEBSITE_HTTPLOGGING_RETENTION_DAYS
è , che per impostazione predefinita è7
. Questo comportamento è allineato all'impostazione predefinita della piattaforma di registrazione applicazioni
In Linux include tutte le stesse personalizzazioni, oltre a:
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>
Passaggi successivi
Per trovare guide introduttive di Azure, esercitazioni e documentazione di riferimento su Java, visitare la pagina Azure per sviluppatori Java.