Een Java-app voor Azure App Service configureren

Notitie

Voor Spring-toepassingen wordt u aangeraden Azure Spring Apps te gebruiken. U kunt echter nog steeds Azure-app Service als bestemming gebruiken. Zie de richtlijnen voor java-workloadbestemmingen voor advies.

met Azure-app Service kunnen Java-ontwikkelaars snel Java SE-, Tomcat- en JBoss EAP-webtoepassingen bouwen, implementeren en schalen op een volledig beheerde service. Toepassingen implementeren met Maven-invoegtoepassingen, vanaf de opdrachtregel of in editors zoals IntelliJ, Eclipse of Visual Studio Code.

Deze handleiding bevat belangrijke concepten en instructies voor Java-ontwikkelaars die App Service gebruiken. Als u Azure-app Service nog nooit hebt gebruikt, moet u eerst de Java-quickstart lezen. Algemene vragen over het gebruik van App Service die niet specifiek zijn voor Java-ontwikkeling, worden beantwoord in de veelgestelde vragen over App Service.

Java-versie weergeven

Als u de huidige Java-versie wilt weergeven, voert u de volgende opdracht uit in de Cloud Shell:

az webapp config show --name <app-name> --resource-group <resource-group-name> --query "[javaVersion, javaContainer, javaContainerVersion]"

Als u alle ondersteunde Java-versies wilt weergeven, voert u de volgende opdracht uit in de Cloud Shell:

az webapp list-runtimes --os windows | grep java

Als u de huidige Java-versie wilt weergeven, voert u de volgende opdracht uit in de Cloud Shell:

az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion

Als u alle ondersteunde Java-versies wilt weergeven, voert u de volgende opdracht uit in de Cloud Shell:

az webapp list-runtimes --os linux | grep "JAVA\|TOMCAT\|JBOSSEAP"

Zie het ondersteuningsbeleid voor De taalruntime van App Service voor meer informatie over versieondersteuning.

Uw app implementeren

Build Tools

Maven

Met de Maven-invoegtoepassing voor Azure Web Apps kunt u uw Maven Java-project eenvoudig voorbereiden voor Azure Web App met één opdracht in de hoofdmap van uw project:

mvn com.microsoft.azure:azure-webapp-maven-plugin:2.11.0:config

Met deze opdracht voegt u een azure-webapp-maven-plugin invoegtoepassing en gerelateerde configuratie toe door u te vragen een bestaande Azure-web-app te selecteren of een nieuwe te maken. Implementeer vervolgens uw Java-app in Azure met de volgende opdracht:

mvn package azure-webapp:deploy

Hier volgt een voorbeeldconfiguratie 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 11</javaVersion>
    </runtime>
    <deployment>
      <resources>
        <resource>
          <type>jar</type>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.jar</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin> 

Gradle

  1. Stel de Gradle-invoegtoepassing voor Azure Web Apps in door de invoegtoepassing toe te voegen aan uw build.gradle:

    plugins {
      id "com.microsoft.azure.azurewebapp" version "1.7.1"
    }
    
  2. Configureer de details van uw web-app. De bijbehorende Azure-resources worden gemaakt als ze niet bestaan. Hier volgt een voorbeeldconfiguratie voor meer informatie. Raadpleeg dit document.

    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 9.0' // or 'Java SE' if you want to run an executable jar
          javaVersion = 'Java 8'
        }
        appSettings {
            <key> = <value>
        }
        auth {
            type = 'azure_cli' // support azure_cli, oauth2, device_code and service_principal
        }
    }
    
  3. Implementeren met één opdracht.

    gradle azureWebAppDeploy
    

IDE's

Azure biedt een naadloze Java App Service-ontwikkelervaring in populaire Java IDE's, waaronder:

Kudu-API

Java SE

Als u .jar bestanden wilt implementeren in Java SE, gebruikt u het /api/publish/ eindpunt van de Kudu-site. Zie deze documentatie voor meer informatie over deze API.

Notitie

Uw .jar-toepassing moet een naam app.jar hebben voor App Service om uw toepassing te identificeren en uit te voeren. De Maven-invoegtoepassing doet dit automatisch tijdens de implementatie. Als u de naam van uw JAR niet wilt wijzigen in app.jar, kunt u een shellscript uploaden met de opdracht om uw .jar-app uit te voeren. Plak het absolute pad naar dit script in het tekstvak Opstartbestand in de sectie Configuratie van de portal. Het opstartscript wordt niet uitgevoerd vanuit de map waarin het wordt geplaatst. Gebruik daarom altijd absolute paden om te verwijzen naar bestanden in het opstartscript (bijvoorbeeld: java -jar /home/myapp/myapp.jar).

Tomcat

Als u WAR-bestanden wilt implementeren in Tomcat, gebruikt u het /api/wardeploy/ eindpunt in POST uw archiefbestand. Zie deze documentatie voor meer informatie over deze API.

JBoss EAP

Als u .war-bestanden wilt implementeren in JBoss, gebruikt u het /api/wardeploy/ eindpunt in POST uw archiefbestand. Zie deze documentatie voor meer informatie over deze API.

Als u .ear-bestanden wilt implementeren, gebruikt u FTP. Uw .ear-toepassing wordt geïmplementeerd in de contexthoofdmap die is gedefinieerd in de configuratie van uw toepassing. Als de hoofdmap van de context van uw app bijvoorbeeld is<context-root>myapp</context-root>, kunt u door de site bladeren op het /myapp pad: http://my-app-name.azurewebsites.net/myapp Als u wilt dat uw web-app wordt geleverd in het hoofdpad, moet u ervoor zorgen dat uw app de contexthoofdmap instelt op het hoofdpad: <context-root>/</context-root>. Zie De contexthoofdmap van een webtoepassing instellen voor meer informatie.

Implementeer uw .war of .jar niet met FTP. Het FTP-hulpprogramma is ontworpen voor het uploaden van opstartscripts, afhankelijkheden of andere runtimebestanden. Het is niet de optimale keuze voor het implementeren van web-apps.

Logboekregistratie en foutopsporing van apps

Prestatierapporten, verkeersvisualisaties en statuscontroles zijn beschikbaar voor elke app via Azure Portal. Zie Azure-app Overzicht van diagnostische gegevens van de service voor meer informatie.

Diagnostische logboeken streamen

Als u toegang wilt tot de consolelogboeken die worden gegenereerd binnen uw toepassingscode in de App Service, schakelt u diagnostische logboekregistratie in door de volgende opdracht in de Cloud Shell uit te voeren:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

Mogelijk waarden voor --level zijn: Error, Warning, Info en Verbose. Elk hoger niveau omvat het vorige niveau. Bijvoorbeeld: Error omvat alleen foutberichten en Verbose omvat alle berichten.

Nadat diagnostische logboekregistratie is ingeschakeld, voert u de volgende opdracht uit om de logboekstream te zien:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

Als u de consolelogboeken niet meteen ziet, probeert u het opnieuw na 30 seconden.

Notitie

U kunt ook de logboekbestanden van de browser inspecteren op https://<app-name>.scm.azurewebsites.net/api/logs/docker.

U kunt op elk gewenst moment Ctrl+C typen om te stoppen met logboekstreaming.

U hebt vanuit de container toegang tot de consolelogboeken.

Schakel eerst logboekregistratie voor containers in door de volgende opdracht uit te voeren:

az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem

Vervang <app-name> en <resource-group-name> door de namen die van toepassing zijn op uw web-app.

Zodra logboekregistratie is ingeschakeld, voert u de volgende opdracht uit om de logboekstream te zien:

az webapp log tail --name <app-name> --resource-group <resource-group-name>

Als u de consolelogboeken niet meteen ziet, probeert u het opnieuw na 30 seconden.

U kunt op elk gewenst moment stoppen met logboekstreaming door Ctrl+C te typen.

U kunt ook de logboekbestanden in een browser inspecteren op https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Zie Stream-logboeken in Cloud Shell voor meer informatie.

Toegang tot SSH-console

Als u een directe SSH-sessie opent met uw container, moet uw app worden uitgevoerd.

Plak de volgende URL in uw browser en vervang <app-name> door de naam van uw app:

https://<app-name>.scm.azurewebsites.net/webssh/host

Als u nog niet bent geverifieerd moet u zich verifiëren met uw Azure-abonnement om verbinding te maken. Nadat u bent geverifieerd, ziet u een shell in de browser waarin u opdrachten binnen uw container kunt uitvoeren.

SSH-verbinding

Notitie

Wijzigingen die u buiten de map /home aanbrengt, worden in de container zelf opgeslagen en blijven niet behouden na het opnieuw opstarten van de app.

Als u een externe SSH-sessie wilt openen vanaf uw lokale machine, raadpleegt u SSH-sessie openen vanaf een externe shell.

Hulpprogramma's voor probleemoplossing

De ingebouwde Java-installatiekopieën zijn gebaseerd op het Alpine Linux-besturingssysteem . Gebruik pakketbeheer apk om hulpprogramma's of opdrachten voor probleemoplossing te installeren.

Java Profiler

Alle Java-runtimes op Azure-app Service worden geleverd met de JDK Flight Recorder voor het profileren van Java-workloads. U kunt deze gebruiken om JVM-, systeem- en toepassingsevenementen vast te leggen en problemen in uw toepassingen op te lossen.

Ga naar de documentatie van Azure-toepassing Insights voor meer informatie over Java Profiler.

Vluchtrecorder

Alle Java-runtimes in App Service worden geleverd met de Java Flight Recorder. U kunt deze gebruiken om JVM-, systeem- en toepassingsevenementen vast te leggen en problemen in uw Java-toepassingen op te lossen.

Getimede opname

Als u een getimede opname wilt maken, hebt u de PID (proces-id) van de Java-toepassing nodig. Als u de PID wilt vinden, opent u een browser naar de SCM-site van uw web-app op https://<your-site-name>.scm.azurewebsites.net/ProcessExplorer/. Op deze pagina ziet u de actieve processen in uw web-app. Zoek het proces met de naam 'java' in de tabel en kopieer de bijbehorende PID (proces-id).

Open vervolgens de console voor foutopsporing in de bovenste werkbalk van de SCM-site en voer de volgende opdracht uit. Vervang <pid> door de proces-id die u eerder hebt gekopieerd. Met deze opdracht start u een profiler-opname van 30 seconden van uw Java-toepassing en genereert u een bestand met de naam timed_recording_example.jfr in de C:\home map.

jcmd <pid> JFR.start name=TimedRecording settings=profile duration=30s filename="C:\home\timed_recording_example.JFR"

SSH in uw App Service en voer de jcmd opdracht uit om een lijst weer te geven van alle Java-processen die worden uitgevoerd. Naast jcmd zelf ziet u dat uw Java-toepassing wordt uitgevoerd met een proces-id(pid).

078990bbcd11:/home# jcmd
Picked up JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true
147 sun.tools.jcmd.JCmd
116 /home/site/wwwroot/app.jar

Voer de volgende opdracht uit om een opname van 30 seconden van de JVM te starten. Het profiel profileert de JVM en maakt een JFR-bestand met de naam jfr_example.jfr in de basismap. (Vervang 116 door de pid van uw Java-app.)

jcmd 116 JFR.start name=MyRecording settings=profile duration=30s filename="/home/jfr_example.jfr"

Tijdens het interval van 30 seconden kunt u controleren of de opname plaatsvindt door uit te voeren jcmd 116 JFR.check. De opdracht toont alle opnamen voor het opgegeven Java-proces.

Continue opname

U kunt Java Flight Recorder gebruiken om uw Java-toepassing continu te profilen met minimale invloed op runtimeprestaties. Voer hiervoor de volgende Azure CLI-opdracht uit om een app-instelling met de naam JAVA_OPTS te maken met de benodigde configuratie. De inhoud van de JAVA_OPTS-app-instelling wordt doorgegeven aan de java opdracht wanneer uw app wordt gestart.

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

Zodra de opname is gestart, kunt u de huidige opnamegegevens op elk gewenst moment dumpen met behulp van de JFR.dump opdracht.

jcmd <pid> JFR.dump name=continuous_recording filename="/home/recording1.jfr"

Bestanden analyseren .jfr

Gebruik FTPS om uw JFR-bestand te downloaden naar uw lokale computer. Als u het JFR-bestand wilt analyseren, downloadt en installeert u Java Mission Control. Zie de JMC-documentatie en de installatie-instructies voor instructies over Java Mission Control.

App-logboekregistratie

Schakel toepassingslogboekregistratie in via Azure Portal of Azure CLI om App Service te configureren voor het schrijven van de standaardconsole-uitvoer van uw toepassing en standaardconsolefoutstromen naar het lokale bestandssysteem of Azure Blob Storage. Logboekregistratie naar het lokale exemplaar van het App Service-bestandssysteem is 12 uur nadat deze is geconfigureerd uitgeschakeld. Als u langere retentie nodig hebt, configureert u de toepassing voor het schrijven van uitvoer naar een Blob Storage-container. Uw Java- en Tomcat-app-logboeken vindt u in de map /home/LogFiles/Application/ .

Schakel toepassingslogboekregistratie in via Azure Portal of Azure CLI om App Service te configureren voor het schrijven van de standaardconsole-uitvoer van uw toepassing en standaardconsolefoutstromen naar het lokale bestandssysteem of Azure Blob Storage. Als u langere retentie nodig hebt, configureert u de toepassing voor het schrijven van uitvoer naar een Blob Storage-container. Uw Java- en Tomcat-app-logboeken vindt u in de map /home/LogFiles/Application/ .

Logboekregistratie van Azure Blob Storage voor Linux-apps kan alleen worden geconfigureerd met behulp van Azure Monitor.

Als uw toepassing gebruikmaakt van Logback of Log4j voor tracering, kunt u deze traceringen doorsturen voor controle naar Azure-toepassing Insights met behulp van de configuratie-instructies voor het logboekregistratieframework in Java-traceringslogboeken verkennen in Application Insights.

Notitie

Vanwege bekend beveiligingsprobleem CVE-2021-44228 moet u Log4j versie 2.16 of hoger gebruiken.

Aanpassing en afstemming

Azure-app Service ondersteunt out-of-the-box tuning en aanpassing via Azure Portal en CLI. Raadpleeg de volgende artikelen voor niet-Java-specifieke web-app-configuratie:

App-inhoud lokaal kopiëren

Stel de app-instelling JAVA_COPY_ALL in om true de inhoud van uw app te kopiëren naar de lokale werkrol vanuit het gedeelde bestandssysteem. Deze instelling helpt bij het oplossen van problemen met het vergrendelen van bestanden.

Java-runtimeopties instellen

Als u toegewezen geheugen of andere JVM-runtimeopties wilt instellen, maakt u een app-instelling met de naam JAVA_OPTS met de opties. App Service geeft deze instelling door als een omgevingsvariabele aan de Java-runtime wanneer deze wordt gestart.

Maak in De Azure-portal, onder Toepassing Instellingen voor de web-app, een nieuwe app-instelling met de naam JAVA_OPTS Java SE of CATALINA_OPTS voor Tomcat die andere instellingen bevat, zoals -Xms512m -Xmx1204m.

Als u de app-instelling wilt configureren vanuit de Maven-invoegtoepassing, voegt u tags voor instelling/waarde toe in de sectie van de Azure-invoegtoepassing. In het volgende voorbeeld wordt een specifieke minimale en maximale Java-heapgrootte ingesteld:

<appSettings>
    <property>
        <name>JAVA_OPTS</name>
        <value>-Xms1024m -Xmx1024m</value>
    </property>
</appSettings>

Notitie

U hoeft geen web.config-bestand te maken wanneer u Tomcat gebruikt in Windows App Service.

Ontwikkelaars die één toepassing uitvoeren met één implementatiesite in hun App Service-plan, kunnen de volgende opties gebruiken:

  • B1- en S1-exemplaren: -Xms1024m -Xmx1024m
  • B2- en S2-exemplaren: -Xms3072m -Xmx3072m
  • B3- en S3-exemplaren: -Xms6144m -Xmx6144m
  • P1v2-exemplaren: -Xms3072m -Xmx3072m
  • P2v2-exemplaren: -Xms6144m -Xmx6144m
  • P3v2-exemplaren: -Xms12800m -Xmx12800m
  • P1v3-exemplaren: -Xms6656m -Xmx6656m
  • P2v3-exemplaren: -Xms14848m -Xmx14848m
  • P3v3-exemplaren: -Xms30720m -Xmx30720m
  • I1-exemplaren: -Xms3072m -Xmx3072m
  • I2-exemplaren: -Xms6144m -Xmx6144m
  • I3-exemplaren: -Xms12800m -Xmx12800m
  • I1v2-exemplaren: -Xms6656m -Xmx6656m
  • I2v2-exemplaren: -Xms14848m -Xmx14848m
  • I3v2-exemplaren: -Xms30720m -Xmx30720m

Wanneer u de heap-instellingen van de toepassing afstemt, controleert u de details van uw App Service-plan en houdt u rekening met meerdere toepassingen en implementatiesites om de optimale toewijzing van het geheugen te vinden.

Websockets inschakelen

Schakel ondersteuning in voor websockets in Azure Portal in de toepassingsinstellingen voor de toepassing. U moet de toepassing opnieuw starten om de instelling van kracht te laten worden.

Schakel websocketondersteuning in met behulp van de Azure CLI met de volgende opdracht:

az webapp config set --name <app-name> --resource-group <resource-group-name> --web-sockets-enabled true

Start de toepassing vervolgens opnieuw op:

az webapp stop --name <app-name> --resource-group <resource-group-name>
az webapp start --name <app-name> --resource-group <resource-group-name>

Standaardtekencodering instellen

Maak in Azure Portal, onder Toepassing Instellingen voor de web-app, een nieuwe app-instelling met de naam JAVA_OPTS waarde-Dfile.encoding=UTF-8.

U kunt de app-instelling ook configureren met behulp van de App Service Maven-invoegtoepassing. Voeg de instellingsnaam en waardetags toe in de configuratie van de invoegtoepassing:

<appSettings>
    <property>
        <name>JAVA_OPTS</name>
        <value>-Dfile.encoding=UTF-8</value>
    </property>
</appSettings>

JSP-bestanden vooraf compileren

Om de prestaties van Tomcat-toepassingen te verbeteren, kunt u uw JSP-bestanden compileren voordat u implementeert in App Service. U kunt de Maven-invoegtoepassing van Apache Sling gebruiken of dit Ant-buildbestand gebruiken.

Toepassingen beveiligen

Java-toepassingen die worden uitgevoerd in App Service, hebben dezelfde set aanbevolen beveiligingsprocedures als andere toepassingen.

Gebruikers verifiëren (Easy Auth)

Stel app-verificatie in Azure Portal in met de optie Verificatie en autorisatie . Hier kunt u verificatie inschakelen met behulp van Microsoft Entra ID of sociale aanmeldingen, zoals Facebook, Google of GitHub. Azure Portal-configuratie werkt alleen bij het configureren van één verificatieprovider. Zie Uw App Service-app configureren voor het gebruik van microsoft Entra-aanmelding en de gerelateerde artikelen voor andere id-providers voor meer informatie. Als u meerdere aanmeldingsproviders wilt inschakelen, volgt u de instructies in Aanmeldingen en afmelden aanpassen.

Java SE

Spring Boot-ontwikkelaars kunnen de Microsoft Entra Spring Boot-starter gebruiken om toepassingen te beveiligen met vertrouwde Spring Security-aantekeningen en API's. Zorg ervoor dat u de maximale headergrootte in het bestand application.properties verhoogt. We stellen een waarde voor 16384.

Tomcat

Uw Tomcat-toepassing heeft rechtstreeks vanuit de servlet toegang tot de claims van de gebruiker door het principal-object naar een kaartobject te casten. Het Map object wijst elk claimtype toe aan een verzameling van de claims voor dat type. In het volgende codevoorbeeld request is dit een exemplaar van HttpServletRequest.

Map<String, Collection<String>> map = (Map<String, Collection<String>>) request.getUserPrincipal();

Nu kunt u het Map object controleren op een specifieke claim. Het volgende codefragment doorloopt bijvoorbeeld alle claimtypen en drukt de inhoud van elke verzameling af.

for (Object key : map.keySet()) {
        Object value = map.get(key);
        if (value != null && value instanceof Collection {
            Collection claims = (Collection) value;
            for (Object claim : claims) {
                System.out.println(claims);
            }
        }
    }

Als u gebruikers wilt afmelden, gebruikt u het /.auth/ext/logout pad. Zie de documentatie over aanmeldingen en afmeldingen aanpassen om andere acties uit te voeren. Er is ook officiële documentatie over de Tomcat HttpServletRequest-interface en de bijbehorende methoden. De volgende servlet-methoden worden ook gehydrateerd op basis van uw App Service-configuratie:

public boolean isSecure()
public String getRemoteAddr()
public String getRemoteHost()
public String getScheme()
public int getServerPort()

Als u deze functie wilt uitschakelen, maakt u een toepassingsinstelling met de naam WEBSITE_AUTH_SKIP_PRINCIPAL met de waarde .1 Als u alle servlet-filters wilt uitschakelen die door App Service zijn toegevoegd, maakt u een instelling met de naam WEBSITE_SKIP_FILTERS met de waarde .1

TLS/SSL configureren

Als u een bestaand TLS/SSL-certificaat wilt uploaden en dit wilt binden aan de domeinnaam van uw toepassing, volgt u de instructies in Een aangepaste DNS-naam beveiligen met een TLS/SSL-binding in Azure-app Service. U kunt de app ook configureren om TLS/SSL af te dwingen.

KeyVault-verwijzingen gebruiken

Azure KeyVault biedt gecentraliseerd geheimbeheer met toegangsbeleid en controlegeschiedenis. U kunt geheimen (zoals wachtwoorden of verbindingsreeks s) opslaan in KeyVault en deze geheimen in uw toepassing openen via omgevingsvariabelen.

Volg eerst de instructies voor het verlenen van toegang tot uw app tot een sleutelkluis en het maken van een KeyVault-verwijzing naar uw geheim in een toepassingsinstelling. U kunt controleren of de verwijzing wordt omgezet in het geheim door de omgevingsvariabele af te drukken terwijl u op afstand toegang hebt tot de App Service-terminal.

Als u deze geheimen wilt injecteren in uw Spring- of Tomcat-configuratiebestand, gebruikt u syntaxis voor omgevingsvariabeleinjectie (${MY_ENV_VAR}). Raadpleeg deze documentatie over externe configuraties voor Spring-configuratiebestanden.

Het Java-sleutelarchief gebruiken

Standaard worden openbare of persoonlijke certificaten die zijn geüpload naar App Service Linux , geladen in de respectieve Java-sleutelarchieven wanneer de container wordt gestart. Nadat u uw certificaat hebt geüpload, moet u uw App Service opnieuw starten om het in de Java Key Store te laden. Openbare certificaten worden geladen in het sleutelarchief op $JRE_HOME/lib/security/cacertsen persoonlijke certificaten worden opgeslagen in $JRE_HOME/lib/security/client.jks.

Mogelijk is er meer configuratie nodig voor het versleutelen van uw JDBC-verbinding met certificaten in het Java-sleutelarchief. Raadpleeg de documentatie voor het gekozen JDBC-stuurprogramma.

Het Java-sleutelarchief initialiseren

Als u het import java.security.KeyStore object wilt initialiseren, laadt u het sleutelarchiefbestand met het wachtwoord. Het standaardwachtwoord voor beide sleutelarchieven is changeit.

KeyStore keyStore = KeyStore.getInstance("jks");
keyStore.load(
    new FileInputStream(System.getenv("JRE_HOME")+"/lib/security/cacerts"),
    "changeit".toCharArray());

KeyStore keyStore = KeyStore.getInstance("pkcs12");
keyStore.load(
    new FileInputStream(System.getenv("JRE_HOME")+"/lib/security/client.jks"),
    "changeit".toCharArray());

Het sleutelarchief handmatig laden

U kunt certificaten handmatig laden in het sleutelarchief. Maak een app-instelling, SKIP_JAVA_KEYSTORE_LOADmet de waarde om App Service uit te schakelen voor het automatisch laden van 1 de certificaten in het sleutelarchief. Alle openbare certificaten die via Azure Portal naar App Service zijn geüpload, worden opgeslagen onder /var/ssl/certs/. Persoonlijke certificaten worden opgeslagen onder /var/ssl/private/.

U kunt interactie hebben met of fouten opsporen in het Java-sleutelprogramma door een SSH-verbinding met uw App Service te openen en de opdracht keytooluit te voeren. Raadpleeg de documentatie van het hulpprogramma voor key voor een lijst met opdrachten. Zie de officiële documentatie voor meer informatie over de KeyStore-API.

APM-platforms configureren

In deze sectie wordt beschreven hoe u Java-toepassingen verbindt die zijn geïmplementeerd op Azure-app Service met Azure Monitor Application Insights-, NewRelic- en AppDynamics-platformen (Application Performance Monitoring).

Application Insights configureren

Azure Monitor Application Insights is een cloudeigen toepassingsbewakingsservice waarmee klanten fouten, knelpunten en gebruikspatronen kunnen observeren om de prestaties van toepassingen te verbeteren en de gemiddelde tijd tot oplossing (MTTR) te verminderen. Met een paar klikken of CLI-opdrachten kunt u bewaking inschakelen voor uw Node.js- of Java-apps, het automatisch verzamelen van logboeken, metrische gegevens en gedistribueerde traceringen, waardoor u geen SDK in uw app hoeft op te nemen. Zie de Application Insights-documentatie voor meer informatie over de beschikbare app-instellingen voor het configureren van de agent.

Azure Portal

Als u Application Insights vanuit Azure Portal wilt inschakelen, gaat u naar Application Insights in het menu aan de linkerkant en selecteert u Application Insights inschakelen. Standaard wordt een nieuwe Application Insights-resource met dezelfde naam als uw web-app gebruikt. U kunt ervoor kiezen om een bestaande Application Insights-resource te gebruiken of de naam te wijzigen. Selecteer Toepassen onderaan.

Azure-CLI

Als u via de Azure CLI wilt inschakelen, moet u een Application Insights-resource maken en een aantal app-instellingen instellen in Azure Portal om Application Insights te verbinden met uw web-app.

  1. De Application Insights-extensie inschakelen

    az extension add -n application-insights
    
  2. Maak een Application Insights-resource met behulp van de volgende CLI-opdracht. Vervang de tijdelijke aanduidingen door de gewenste resourcenaam en -groep.

    az monitor app-insights component create --app <resource-name> -g <resource-group> --location westus2  --kind web --application-type web
    

    Noteer de waarden voor connectionString en instrumentationKeyu hebt deze waarden nodig in de volgende stap.

    Als u een lijst met andere locaties wilt ophalen, voert u het volgende uit az account list-locations.

  1. Stel de instrumentatiesleutel, verbindingsreeks en bewakingsagentversie in als app-instellingen in de web-app. Vervang <instrumentationKey> en <connectionString> door de waarden uit de vorige stap.

    az webapp config appsettings set -n <webapp-name> -g <resource-group> --settings "APPINSIGHTS_INSTRUMENTATIONKEY=<instrumentationKey>" "APPLICATIONINSIGHTS_CONNECTION_STRING=<connectionString>" "ApplicationInsightsAgent_EXTENSION_VERSION=~3" "XDT_MicrosoftApplicationInsights_Mode=default" "XDT_MicrosoftApplicationInsights_Java=1"
    
  1. Stel de instrumentatiesleutel, verbindingsreeks en bewakingsagentversie in als app-instellingen in de web-app. Vervang <instrumentationKey> en <connectionString> door de waarden uit de vorige stap.

    az webapp config appsettings set -n <webapp-name> -g <resource-group> --settings "APPINSIGHTS_INSTRUMENTATIONKEY=<instrumentationKey>" "APPLICATIONINSIGHTS_CONNECTION_STRING=<connectionString>" "ApplicationInsightsAgent_EXTENSION_VERSION=~3" "XDT_MicrosoftApplicationInsights_Mode=default"
    

New Relic configureren

  1. Een NewRelic-account maken op NewRelic.com

  2. Download de Java-agent van NewRelic. Het heeft een bestandsnaam die vergelijkbaar is met newrelic-java-x.x.x.zip.

  3. Kopieer uw licentiesleutel. U hebt deze nodig om de agent later te configureren.

  4. SSH in uw App Service-exemplaar en maak een nieuwe map /home/site/wwwroot/apm.

  5. Upload de uitgepakte NewRelic Java-agentbestanden naar een map onder /home/site/wwwroot/apm. De bestanden voor uw agent moeten zich in /home/site/wwwroot/apm/newrelic bevinden.

  6. Wijzig het YAML-bestand op /home/site/wwwroot/apm/newrelic/newrelic.yml en vervang de waarde van de tijdelijke aanduiding door uw eigen licentiesleutel.

  7. Blader in Azure Portal naar uw toepassing in App Service en maak een nieuwe toepassingsinstelling.

    • Voor Java SE-apps maakt u een omgevingsvariabele met de naam JAVA_OPTS met de waarde -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.
    • Maak voor Tomcat een omgevingsvariabele met de naam CATALINA_OPTS-javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.
  1. Een NewRelic-account maken op NewRelic.com

  2. Download de Java-agent van NewRelic. Het heeft een bestandsnaam die vergelijkbaar is met newrelic-java-x.x.x.zip.

  3. Kopieer uw licentiesleutel. U hebt deze nodig om de agent later te configureren.

  4. SSH in uw App Service-exemplaar en maak een nieuwe map /home/site/wwwroot/apm.

  5. Upload de uitgepakte NewRelic Java-agentbestanden naar een map onder /home/site/wwwroot/apm. De bestanden voor uw agent moeten zich in /home/site/wwwroot/apm/newrelic bevinden.

  6. Wijzig het YAML-bestand op /home/site/wwwroot/apm/newrelic/newrelic.yml en vervang de waarde van de tijdelijke aanduiding door uw eigen licentiesleutel.

  7. Blader in Azure Portal naar uw toepassing in App Service en maak een nieuwe toepassingsinstelling.

    • Voor Java SE-apps maakt u een omgevingsvariabele met de naam JAVA_OPTS met de waarde -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.
    • Maak voor Tomcat een omgevingsvariabele met de naam CATALINA_OPTS-javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.

Als u al een omgevingsvariabele voor JAVA_OPTS of CATALINA_OPTShebt, voegt u de -javaagent:/... optie toe aan het einde van de huidige waarde.

AppDynamics configureren

  1. Een AppDynamics-account maken op AppDynamics.com

  2. Download de Java-agent van de AppDynamics-website. De bestandsnaam is vergelijkbaar met AppServerAgent-x.x.x.xxxxx.zip

  3. Gebruik de Kudu-console om een nieuwe map /home/site/wwwroot/apm te maken.

  4. Upload de Java-agentbestanden naar een map onder /home/site/wwwroot/apm. De bestanden voor uw agent moeten zich in /home/site/wwwroot/apm/appdynamics bevinden.

  5. Blader in Azure Portal naar uw toepassing in App Service en maak een nieuwe toepassingsinstelling.

    • Maak voor Java SE-apps een omgevingsvariabele JAVA_OPTS met de naam -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> waar <app-name> uw App Service-naam staat.
    • Maak voor Tomcat-apps een omgevingsvariabele met de naam CATALINA_OPTS-javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> waar <app-name> uw App Service-naam staat.
  1. Een AppDynamics-account maken op AppDynamics.com

  2. Download de Java-agent van de AppDynamics-website. De bestandsnaam is vergelijkbaar met AppServerAgent-x.x.x.xxxxx.zip

  3. SSH in uw App Service-exemplaar en maak een nieuwe map /home/site/wwwroot/apm.

  4. Upload de Java-agentbestanden naar een map onder /home/site/wwwroot/apm. De bestanden voor uw agent moeten zich in /home/site/wwwroot/apm/appdynamics bevinden.

  5. Blader in Azure Portal naar uw toepassing in App Service en maak een nieuwe toepassingsinstelling.

    • Maak voor Java SE-apps een omgevingsvariabele JAVA_OPTS met de naam -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> waar <app-name> uw App Service-naam staat.
    • Maak voor Tomcat-apps een omgevingsvariabele met de naam CATALINA_OPTS-javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> waar <app-name> uw App Service-naam staat.

Notitie

Als u al een omgevingsvariabele voor JAVA_OPTS of CATALINA_OPTShebt, voegt u de -javaagent:/... optie toe aan het einde van de huidige waarde.

Gegevensbronnen configureren

Java SE

Als u verbinding wilt maken met gegevensbronnen in Spring Boot-toepassingen, raden we u aan om verbindingsreeks s te maken en deze in uw bestand application.properties te injecteren.

  1. Stel in de sectie Configuratie van de App Service-pagina een naam in voor de tekenreeks, plak uw JDBC-verbindingsreeks in het waardeveld en stel het type in op 'Aangepast'. U kunt deze verbindingsreeks desgewenst instellen als site-instelling.

    Deze verbindingsreeks is toegankelijk voor onze toepassing als een omgevingsvariabele met de naam CUSTOMCONNSTR_<your-string-name>. Bijvoorbeeld: CUSTOMCONNSTR_exampledb.

  2. Raadpleeg in het bestand application.properties deze verbindingsreeks met de naam van de omgevingsvariabele. In ons voorbeeld gebruiken we het volgende.

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Zie de Spring Boot-documentatie over gegevenstoegang en externe configuraties voor meer informatie.

Tomcat

Deze instructies zijn van toepassing op alle databaseverbindingen. U moet tijdelijke aanduidingen invullen met de stuurprogrammaklassenaam en het JAR-bestand van de gekozen database. Opgegeven is een tabel met klassenamen en stuurprogrammadownloads voor algemene databases.

Database Naam van stuurprogrammaklasse JDBC-stuurprogramma
PostgreSQL org.postgresql.Driver Downloaden
MySQL com.mysql.jdbc.Driver Downloaden (Platformonafhankelijk selecteren)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Downloaden

Als u Tomcat wilt configureren voor het gebruik van Java Database Verbinding maken ivity (JDBC) of de Java Persistence-API (JPA), past u eerst de CATALINA_OPTS omgevingsvariabele aan die wordt gelezen door Tomcat bij het opstarten. Stel deze waarden in via een app-instelling in de App Service Maven-invoegtoepassing:

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

Of stel de omgevingsvariabelen in op de pagina Configuratietoepassing>Instellingen in Azure Portal.

Bepaal vervolgens of de gegevensbron beschikbaar moet zijn voor één toepassing of voor alle toepassingen die worden uitgevoerd op de Tomcat-servlet.

Gegevensbronnen op toepassingsniveau

  1. Maak een context.xml-bestand in de META-INF/ -map van uw project. Maak de META-INF/ -map als deze niet bestaat.

  2. Voeg in context.xml een Context element toe om de gegevensbron te koppelen aan een JNDI-adres. Vervang de tijdelijke aanduiding door de driverClassName klassenaam van het stuurprogramma uit de bovenstaande tabel.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Werk de web.xml van uw toepassing bij om de gegevensbron in uw toepassing te gebruiken.

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

Gedeelde resources op serverniveau

Tomcat-installaties in App Service in Windows bevinden zich in gedeelde ruimte in het App Service-plan. U kunt een Tomcat-installatie niet rechtstreeks wijzigen voor configuratie voor de hele server. Als u configuratiewijzigingen op serverniveau wilt aanbrengen in uw Tomcat-installatie, moet u Tomcat kopiëren naar een lokale map, waarin u de configuratie van Tomcat kunt wijzigen.

Het maken van aangepaste Tomcat automatiseren bij het starten van de app

U kunt een opstartscript gebruiken om acties uit te voeren voordat een web-app wordt gestart. Het opstartscript voor het aanpassen van Tomcat moet de volgende stappen uitvoeren:

  1. Controleer of Tomcat al lokaal is gekopieerd en geconfigureerd. Als dat zo was, kan het opstartscript hier eindigen.
  2. Kopieer Tomcat lokaal.
  3. Breng de vereiste configuratiewijzigingen aan.
  4. Geef aan dat de configuratie is voltooid.

Maak voor Windows-apps een bestand met de naam startup.cmd of startup.ps1 in de wwwroot map. Dit bestand wordt automatisch uitgevoerd voordat de Tomcat-server wordt gestart.

Hier volgt een PowerShell-script waarmee deze stappen worden uitgevoerd:

    # Check for marker file indicating that config has already been done
    if(Test-Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker"){
        return 0
    }

    # Delete previous Tomcat directory if it exists
    # In case previous config isn't completed or a new config should be forcefully installed
    if(Test-Path "$Env:LOCAL_EXPANDED\tomcat"){
        Remove-Item "$Env:LOCAL_EXPANDED\tomcat" --recurse
    }

    # Copy Tomcat to local
    # Using the environment variable $AZURE_TOMCAT90_HOME uses the 'default' version of Tomcat
    Copy-Item -Path "$Env:AZURE_TOMCAT90_HOME\*" -Destination "$Env:LOCAL_EXPANDED\tomcat" -Recurse

    # Perform the required customization of Tomcat
    {... customization ...}

    # Mark that the operation was a success
    New-Item -Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker" -ItemType File
Transformaties

Een veelvoorkomend gebruiksvoorbeeld voor het aanpassen van een Tomcat-versie is het wijzigen van de server.xml, context.xmlof web.xml Tomcat-configuratiebestanden. App Service wijzigt deze bestanden al om platformfuncties te bieden. Als u deze functies wilt blijven gebruiken, is het belangrijk om de inhoud van deze bestanden te behouden wanneer u wijzigingen aanbrengt. Hiervoor raden we u aan een XSL-transformatie (XSLT) te gebruiken. Gebruik een XSL-transformatie om wijzigingen aan te brengen in de XML-bestanden met behoud van de oorspronkelijke inhoud van het bestand.

Voorbeeld van XSLT-bestand

Met deze voorbeeldtransformatie wordt een nieuw connectorknooppunt toegevoegd aan server.xml. Let op de identiteitstransformatie, die de oorspronkelijke inhoud van het bestand behoudt.

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- Identity transform: this ensures that the original contents of the file are included in the new file -->
    <!-- Ensure that your transform files include this block -->
    <xsl:template match="@* | node()" name="Copy">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="@* | node()" mode="insertConnector">
      <xsl:call-template name="Copy" />
    </xsl:template>

    <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                   contains(., '&lt;Connector') and
                                   (contains(., 'scheme=&quot;https&quot;') or
                                    contains(., &quot;scheme='https'&quot;))]">
      <xsl:value-of select="." disable-output-escaping="yes" />
    </xsl:template>

    <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                     comment()[contains(., '&lt;Connector') and
                                               (contains(., 'scheme=&quot;https&quot;') or
                                                contains(., &quot;scheme='https'&quot;))]
                                    )]
                        ">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()" mode="insertConnector" />
      </xsl:copy>
    </xsl:template>

    <!-- Add the new connector after the last existing Connnector if there's one -->
    <xsl:template match="Connector[last()]" mode="insertConnector">
      <xsl:call-template name="Copy" />

      <xsl:call-template name="AddConnector" />
    </xsl:template>

    <!-- ... or before the first Engine if there's no existing Connector -->
    <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                  mode="insertConnector">
      <xsl:call-template name="AddConnector" />

      <xsl:call-template name="Copy" />
    </xsl:template>

    <xsl:template name="AddConnector">
      <!-- Add new line -->
      <xsl:text>&#xa;</xsl:text>
      <!-- This is the new connector -->
      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
                 maxThreads="150" scheme="https" secure="true" 
                 keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
                 clientAuth="false" sslProtocol="TLS" />
    </xsl:template>

    </xsl:stylesheet>
Functie voor XSL-transformatie

PowerShell heeft ingebouwde hulpprogramma's voor het transformeren van XML-bestanden met behulp van XSL-transformaties. Het volgende script is een voorbeeldfunctie waarmee u de transformatie kunt startup.ps1 uitvoeren:

    function TransformXML{
        param ($xml, $xsl, $output)

        if (-not $xml -or -not $xsl -or -not $output)
        {
            return 0
        }

        Try
        {
            $xslt_settings = New-Object System.Xml.Xsl.XsltSettings;
            $XmlUrlResolver = New-Object System.Xml.XmlUrlResolver;
            $xslt_settings.EnableScript = 1;

            $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
            $xslt.Load($xsl,$xslt_settings,$XmlUrlResolver);
            $xslt.Transform($xml, $output);

        }

        Catch
        {
            $ErrorMessage = $_.Exception.Message
            $FailedItem = $_.Exception.ItemName
            Write-Host  'Error'$ErrorMessage':'$FailedItem':' $_.Exception;
            return 0
        }
        return 1
    }
App-instellingen

Het platform moet ook weten waar uw aangepaste versie van Tomcat is geïnstalleerd. U kunt de locatie van de installatie instellen in de CATALINA_BASE app-instelling.

U kunt de Azure CLI gebruiken om deze instelling te wijzigen:

    az webapp config appsettings set -g $MyResourceGroup -n $MyUniqueApp --settings CATALINA_BASE="%LOCAL_EXPANDED%\tomcat"

U kunt de instelling ook handmatig wijzigen in Azure Portal:

  1. Ga naar Instellingen> Configuratietoepassingsinstellingen.>
  2. Selecteer Nieuwe app-instelling.
  3. Gebruik deze waarden om de instelling te maken:
    1. Naam: CATALINA_BASE
    2. Waarde: "%LOCAL_EXPANDED%\tomcat"
Voorbeeld startup.ps1

Met het volgende voorbeeldscript wordt een aangepaste Tomcat gekopieerd naar een lokale map, een XSL-transformatie uitgevoerd en wordt aangegeven dat de transformatie is geslaagd:

    # Locations of xml and xsl files
    $target_xml="$Env:LOCAL_EXPANDED\tomcat\conf\server.xml"
    $target_xsl="$Env:HOME\site\server.xsl"

    # Define the transform function
    # Useful if transforming multiple files
    function TransformXML{
        param ($xml, $xsl, $output)

        if (-not $xml -or -not $xsl -or -not $output)
        {
            return 0
        }

        Try
        {
            $xslt_settings = New-Object System.Xml.Xsl.XsltSettings;
            $XmlUrlResolver = New-Object System.Xml.XmlUrlResolver;
            $xslt_settings.EnableScript = 1;

            $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
            $xslt.Load($xsl,$xslt_settings,$XmlUrlResolver);
            $xslt.Transform($xml, $output);
        }

        Catch
        {
            $ErrorMessage = $_.Exception.Message
            $FailedItem = $_.Exception.ItemName
            echo  'Error'$ErrorMessage':'$FailedItem':' $_.Exception;
            return 0
        }
        return 1
    }

    $success = TransformXML -xml $target_xml -xsl $target_xsl -output $target_xml

    # Check for marker file indicating that config has already been done
    if(Test-Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker"){
        return 0
    }

    # Delete previous Tomcat directory if it exists
    # In case previous config isn't completed or a new config should be forcefully installed
    if(Test-Path "$Env:LOCAL_EXPANDED\tomcat"){
        Remove-Item "$Env:LOCAL_EXPANDED\tomcat" --recurse
    }

    md -Path "$Env:LOCAL_EXPANDED\tomcat"

    # Copy Tomcat to local
    # Using the environment variable $AZURE_TOMCAT90_HOME uses the 'default' version of Tomcat
    Copy-Item -Path "$Env:AZURE_TOMCAT90_HOME\*" "$Env:LOCAL_EXPANDED\tomcat" -Recurse

    # Perform the required customization of Tomcat
    $success = TransformXML -xml $target_xml -xsl $target_xsl -output $target_xml

    # Mark that the operation was a success if successful
    if($success){
        New-Item -Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker" -ItemType File
    }

Configuratie voltooien

Ten slotte plaatst u het stuurprogramma-JAR's in het Tomcat-klassepad en start u uw App Service opnieuw op. Zorg ervoor dat de JDBC-stuurprogrammabestanden beschikbaar zijn voor de Tomcat-klasseloader door ze in de map /home/site/lib te plaatsen. Voer in Cloud Shell uit az webapp deploy --type=lib voor elk JAR-stuurprogramma:

az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --target-path <jar-name>.jar

Tomcat

Deze instructies zijn van toepassing op alle databaseverbindingen. U moet tijdelijke aanduidingen invullen met de stuurprogrammaklassenaam en het JAR-bestand van de gekozen database. Opgegeven is een tabel met klassenamen en stuurprogrammadownloads voor algemene databases.

Database Naam van stuurprogrammaklasse JDBC-stuurprogramma
PostgreSQL org.postgresql.Driver Downloaden
MySQL com.mysql.jdbc.Driver Downloaden (Platformonafhankelijk selecteren)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Downloaden

Als u Tomcat wilt configureren voor het gebruik van Java Database Verbinding maken ivity (JDBC) of de Java Persistence-API (JPA), past u eerst de CATALINA_OPTS omgevingsvariabele aan die wordt gelezen door Tomcat bij het opstarten. Stel deze waarden in via een app-instelling in de App Service Maven-invoegtoepassing:

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

Of stel de omgevingsvariabelen in op de pagina Configuratietoepassing>Instellingen in Azure Portal.

Bepaal vervolgens of de gegevensbron beschikbaar moet zijn voor één toepassing of voor alle toepassingen die worden uitgevoerd op de Tomcat-servlet.

Gegevensbronnen op toepassingsniveau

  1. Maak een context.xml-bestand in de META-INF/ -map van uw project. Maak de META-INF/ -map als deze niet bestaat.

  2. Voeg in context.xml een Context element toe om de gegevensbron te koppelen aan een JNDI-adres. Vervang de tijdelijke aanduiding door de driverClassName klassenaam van het stuurprogramma uit de bovenstaande tabel.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Werk de web.xml van uw toepassing bij om de gegevensbron in uw toepassing te gebruiken.

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

Gedeelde resources op serverniveau

Als u een gedeelde gegevensbron op serverniveau toevoegt, moet u de server.xml van Tomcat bewerken. Upload eerst een opstartscript en stel het pad in naar het script in de opdracht Opstarten van configuratie>. U kunt het opstartscript uploaden met FTP.

Uw opstartscript maakt een xsl-transformatie naar het server.xml-bestand en voert het resulterende XML-bestand uit naar /usr/local/tomcat/conf/server.xml. Het opstartscript moet libxslt installeren via apk. Het xsl-bestand en het opstartscript kunnen worden geüpload via FTP. Hieronder ziet u een voorbeeld van een opstartscript.

# Install libxslt. Also copy the transform file to /home/tomcat/conf/
apk add --update libxslt

# Usage: xsltproc --output output.xml style.xsl input.xml
xsltproc --output /home/tomcat/conf/server.xml /home/tomcat/conf/transform.xsl /usr/local/tomcat/conf/server.xml

In het volgende voorbeeld voegt het XSL-bestand een nieuw connectorknooppunt toe aan de Tomcat-server.xml.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()" name="Copy">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()" mode="insertConnector">
    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                 contains(., '&lt;Connector') and
                                 (contains(., 'scheme=&quot;https&quot;') or
                                  contains(., &quot;scheme='https'&quot;))]">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                   comment()[contains(., '&lt;Connector') and
                                             (contains(., 'scheme=&quot;https&quot;') or
                                              contains(., &quot;scheme='https'&quot;))]
                                  )]
                      ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="insertConnector" />
    </xsl:copy>
  </xsl:template>

  <!-- Add the new connector after the last existing Connnector if there's one -->
  <xsl:template match="Connector[last()]" mode="insertConnector">
    <xsl:call-template name="Copy" />

    <xsl:call-template name="AddConnector" />
  </xsl:template>

  <!-- ... or before the first Engine if there's no existing Connector -->
  <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                mode="insertConnector">
    <xsl:call-template name="AddConnector" />

    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template name="AddConnector">
    <!-- Add new line -->
    <xsl:text>&#xa;</xsl:text>
    <!-- This is the new connector -->
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
               maxThreads="150" scheme="https" secure="true" 
               keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />
  </xsl:template>

</xsl:stylesheet>

Configuratie voltooien

Plaats ten slotte het stuurprogramma-JAR's in het Tomcat-klassepad en start uw App Service opnieuw op.

  1. Zorg ervoor dat de JDBC-stuurprogrammabestanden beschikbaar zijn voor de Tomcat-klasseloader door ze in de map /home/site/lib te plaatsen. Voer in Cloud Shell uit az webapp deploy --type=lib voor elk JAR-stuurprogramma:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

Als u een gegevensbron op serverniveau hebt gemaakt, start u de App Service Linux-toepassing opnieuw. Tomcat wordt opnieuw ingesteld CATALINA_BASE op /home/tomcat en gebruikt de bijgewerkte configuratie.

JBoss EAP-gegevensbronnen

Er zijn drie belangrijke stappen bij het registreren van een gegevensbron bij JBoss EAP: het JDBC-stuurprogramma uploaden, het JDBC-stuurprogramma toevoegen als een module en de module registreren. App Service is een staatloze hostingservice, dus de configuratieopdrachten voor het toevoegen en registreren van de gegevensbronmodule moeten worden gescript en toegepast wanneer de container wordt gestart.

  1. Haal het JDBC-stuurprogramma van uw database op.

  2. Maak een XML-moduledefinitiebestand voor het JDBC-stuurprogramma. In het volgende voorbeeld ziet u een moduledefinitie voor PostgreSQL.

    <?xml version="1.0" ?>
    <module xmlns="urn:jboss:module:1.1" name="org.postgres">
        <resources>
        <!-- ***** IMPORTANT : REPLACE THIS PLACEHOLDER *******-->
        <resource-root path="/home/site/deployments/tools/postgresql-42.2.12.jar" />
        </resources>
        <dependencies>
            <module name="javax.api"/>
            <module name="javax.transaction.api"/>
        </dependencies>
    </module>
    
  3. Plaats uw JBoss CLI-opdrachten in een bestand met de naam jboss-cli-commands.cli. De JBoss-opdrachten moeten de module toevoegen en registreren als gegevensbron. In het volgende voorbeeld ziet u de JBoss CLI-opdrachten voor PostgreSQL.

    #!/usr/bin/env bash
    module add --name=org.postgres --resources=/home/site/deployments/tools/postgresql-42.2.12.jar --module-xml=/home/site/deployments/tools/postgres-module.xml
    
    /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
    
    data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
    
  4. Maak een opstartscript dat startup_script.sh de JBoss CLI-opdrachten aanroept. In het volgende voorbeeld ziet u hoe u uw jboss-cli-commands.cliaanroept. Later configureert u App Service om dit script uit te voeren wanneer de container wordt gestart.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
    
  5. Upload uw JDBC-stuurprogrammajboss-cli-commands.clistartup_script.sh, en de moduledefinitie met /site/deployments/tools/behulp van een FTP-client naar keuze.

  6. Configureer uw site om uit te voeren startup_script.sh wanneer de container wordt gestart. Navigeer in De Azure-portal naar Configuratie-algemeen>Instellingen> Startup-opdracht. Stel het opstartopdrachtveld in op /home/site/deployments/tools/startup_script.sh. Sla uw wijzigingen op.

Om te bevestigen dat de gegevensbron is toegevoegd aan de JBoss-server, SSH in uw web-app en voert u deze uit $JBOSS_HOME/bin/jboss-cli.sh --connect. Nadat u verbinding hebt gemaakt met JBoss, voert u de /subsystem=datasources:read-resource opdracht uit om een lijst met de gegevensbronnen af te drukken.

robots933456 in logboeken

U ziet mogelijk het volgende bericht in de containerlogboeken:

2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"

U kunt dit bericht veilig negeren. /robots933456.txt is een dummy-URL-pad dat App Service gebruikt om te controleren of de container aanvragen kan verwerken. Een 404-antwoord geeft alleen aan dat het pad niet bestaat, maar laat App Service wel weten dat de container in orde is en klaar is om te reageren op aanvragen.

Een Java Runtime-versie kiezen

Met App Service kunnen gebruikers de primaire versie van de JVM kiezen, zoals Java 8 of Java 11, en de patchversie, zoals 1.8.0_232 of 11.0.5. U kunt er ook voor kiezen om de patchversie automatisch te laten bijwerken naarmate er nieuwe secundaire versies beschikbaar komen. In de meeste gevallen moeten productie-apps gebruikmaken van vastgemaakte JVM-versies van patches. Dit voorkomt onverwachte storingen tijdens een automatische update van een patchversie. Alle Java-web-apps gebruiken 64-bits JVM's en kunnen niet worden geconfigureerd.

Als u Tomcat gebruikt, kunt u ervoor kiezen om de patchversie van Tomcat vast te maken. In Windows kunt u de patchversies van de JVM en Tomcat onafhankelijk vastmaken. In Linux kunt u de patchversie van Tomcat vastmaken; de patchversie van de JVM is ook vastgemaakt, maar kan niet afzonderlijk worden geconfigureerd.

Als u ervoor kiest om de secundaire versie vast te maken, moet u de secundaire JVM-versie regelmatig bijwerken in de app. Maak een staging-site en verhoog de secundaire versie van de staging-site om ervoor te zorgen dat uw toepassing wordt uitgevoerd op de nieuwere secundaire versie. Zodra u hebt bevestigd dat de toepassing correct wordt uitgevoerd op de nieuwe secundaire versie, kunt u de faserings- en productiesites wisselen.

JBoss EAP

Clustering in JBoss EAP

App Service ondersteunt clustering voor JBoss EAP-versies 7.4.1 en hoger. Als u clustering wilt inschakelen, moet uw web-app worden geïntegreerd met een virtueel netwerk. Wanneer de web-app is geïntegreerd met een virtueel netwerk, wordt deze opnieuw opgestart en wordt de JBoss EAP-installatie automatisch gestart met een geclusterde configuratie. De JBoss EAP-exemplaren communiceren via het subnet dat is opgegeven in de integratie van het virtuele netwerk, met behulp van de poorten die tijdens runtime worden weergegeven in de WEBSITES_PRIVATE_PORTS omgevingsvariabele. U kunt clustering uitschakelen door een app-instelling te maken met een willekeurige WEBSITE_DISABLE_CLUSTERING waarde.

Notitie

Als u de integratie van uw virtuele netwerk met een ARM-sjabloon inschakelt, moet u de eigenschap vnetPrivatePorts handmatig instellen op een waarde van 2. Als u integratie van virtuele netwerken vanuit de CLI of portal inschakelt, wordt deze eigenschap automatisch voor u ingesteld.

Wanneer clustering is ingeschakeld, gebruiken de JBoss EAP-exemplaren het FILE_PING JGroups-detectieprotocol om nieuwe exemplaren te detecteren en de clustergegevens, zoals de clusterleden, hun id's en hun IP-adressen, te behouden. In App Service bevinden deze bestanden zich onder /home/clusterinfo/. Het eerste EAP-exemplaar om te beginnen krijgt lees-/schrijfmachtigingen voor het clusterlidmaatschapsbestand. Andere exemplaren lezen het bestand, zoeken het primaire knooppunt en coördineren met dat knooppunt dat moet worden opgenomen in het cluster en worden toegevoegd aan het bestand.

De typen Premium V3- en Isolated V2 App Service-abonnementen kunnen desgewenst worden gedistribueerd over Beschikbaarheidszones om de tolerantie en betrouwbaarheid voor uw bedrijfskritieke workloads te verbeteren. Deze architectuur wordt ook wel zoneredundantie genoemd. De JBoss EAP-clusterfunctie is compatibel met de functie zoneredundantie.

Regels voor automatisch schalen

Wanneer u regels voor automatische schaalaanpassing configureert voor horizontaal schalen, is het belangrijk om exemplaren incrementeel (één voor één) te verwijderen om ervoor te zorgen dat elk verwijderd exemplaar de activiteit (zoals het verwerken van een databasetransactie) kan overdragen aan een ander lid van het cluster. Wanneer u uw regels voor automatische schaalaanpassing in de portal configureert om omlaag te schalen, gebruikt u de volgende opties:

  • Bewerking: 'Aantal verlagen op'
  • Afkoelen: '5 minuten' of hoger
  • Aantal exemplaren: 1

U hoeft geen exemplaren incrementeel toe te voegen (uitschalen), u kunt meerdere exemplaren tegelijk toevoegen aan het cluster.

JBoss EAP App Service-plannen

JBoss EAP is alleen beschikbaar op de typen Premium v3 en Isolated v2 App Service Plan. Klanten die tijdens de openbare preview een JBoss EAP-site op een andere laag hebben gemaakt, moeten omhoog worden geschaald naar de Premium- of Geïsoleerde hardwarelaag om onverwacht gedrag te voorkomen.

Tomcat-basislijnconfiguratie in App Services

Java-ontwikkelaars kunnen de serverinstellingen aanpassen, problemen oplossen en toepassingen met vertrouwen implementeren in Tomcat als ze weten wat de server.xml bestand- en configuratiedetails van Tomcat zijn. Mogelijke aanpassingen zijn:

  • Tomcat-configuratie aanpassen: Door inzicht te krijgen in het server.xml-bestand en de configuratiegegevens van Tomcat, kunt u de serverinstellingen aanpassen aan de behoeften van hun toepassingen.
  • Foutopsporing: wanneer een toepassing wordt geïmplementeerd op een Tomcat-server, moeten ontwikkelaars weten wat de serverconfiguratie is om eventuele problemen op te sporen. Dit omvat het controleren van de serverlogboeken, het controleren van de configuratiebestanden en het identificeren van eventuele fouten die kunnen optreden.
  • Problemen met Tomcat oplossen: Onvermijdelijk ondervinden Java-ontwikkelaars problemen met hun Tomcat-server, zoals prestatieproblemen of configuratiefouten. Door inzicht te krijgen in de configuratiegegevens van het server.xml bestand en tomcat, kunnen ontwikkelaars deze problemen snel diagnosticeren en oplossen, waardoor tijd en moeite kunnen worden bespaard.
  • Toepassingen implementeren in Tomcat: ontwikkelaars moeten weten hoe ze het server.xml-bestand en andere Tomcat-instellingen moeten configureren om een Java-webtoepassing te implementeren in Tomcat. Inzicht in deze details is essentieel voor het implementeren van toepassingen en ervoor zorgen dat ze probleemloos op de server worden uitgevoerd.

Wanneer u een app met ingebouwde Tomcat maakt om uw Java-workload (een WAR-bestand of een JAR-bestand) te hosten, zijn er bepaalde instellingen die u uit het vak voor Tomcat-configuratie haalt. Raadpleeg de officiële Documentatie voor Apache Tomcat voor gedetailleerde informatie, waaronder de standaardconfiguratie voor Tomcat-webserver.

Daarnaast zijn er bepaalde transformaties die op het begin van de server.xml voor Tomcat-distributie verder worden toegepast. Dit zijn transformaties naar de instellingen van de Verbinding maken or, host en klep.

De nieuwste versies van Tomcat hebben server.xml (8.5.58 en 9.0.38 en hoger). Oudere versies van Tomcat gebruiken geen transformaties en hebben mogelijk ander gedrag als gevolg.

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 is ingesteld op 16384
  • URIEncoding is ingesteld op UTF-8
  • conectionTimeout is ingesteld op WEBSITE_TOMCAT_CONNECTION_TIMEOUT, wat standaard is ingesteld op 240000
  • maxThreads is ingesteld op WEBSITE_CATALINA_MAXTHREADS, wat standaard is ingesteld op 200
  • maxConnections is ingesteld op WEBSITE_CATALINA_MAXCONNECTIONS, wat standaard is ingesteld op 10000

Notitie

De instellingen connectionTimeout, maxThreads en max Verbinding maken ions kunnen worden afgestemd met app-instellingen

Hieronder volgen voorbeelden van CLI-opdrachten die u kunt gebruiken om de waarden van conectionTimeout, maxThreads of max Verbinding maken ions te wijzigen:

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
  • Verbinding maken or gebruikt het adres van de container in plaats van 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 is ingesteld op AZURE_SITE_APP_BASE, wat standaard is ingesteld op lokaal WebappsLocalPath
  • xmlBase is ingesteld op AZURE_SITE_HOME, wat standaard is ingesteld op /site/wwwroot
  • unpackWARs is ingesteld op AZURE_UNPACK_WARS, wat standaard is ingesteld op true
  • workDir is ingesteld op JAVA_TMP_DIR, welke standaardwaarden TMP
  • errorReportValveClass maakt gebruik van onze aangepaste foutrapportklep

Klep

<Valve prefix="site_access_log.${catalina.instance.name}" pattern="%h %l %u %t &quot;%r&quot; %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 is ingesteld op AZURE_LOGGING_DIR, wat standaard is ingesteld op home\logFiles
  • maxDays is aan WEBSITE_HTTPLOGGING_RETENTION_DAYS, wat standaard 0 [voor altijd]

In Linux heeft het allemaal dezelfde aanpassing, plus:

  • Voegt enkele fout- en rapportagepagina's toe aan de klep:
               <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>

Volgende stappen

Ga naar het Azure voor Java-ontwikkelaarscentrum om azure-snelstartgidsen, zelfstudies en Java-referentiedocumentatie te vinden.