Konfigurera datakällor för en Tomcat-, JBoss- eller Java SE-app i Azure App Service

Den här artikeln visar hur du konfigurerar datakällor i en Java SE-, Tomcat- eller JBoss-app i App Service.

Azure App Service kör Java-webbprogram i tre typer på en fullständigt hanterad tjänst:

  • Java Standard Edition (SE). Java SE kan köra en app som distribueras som ett Java-arkivpaket (JAR) som innehåller en inbäddad server, till exempel Spring Boot, Quarkus, Dropwizard eller en app med en inbäddad Tomcat- eller Jetty-server.
  • Tomcat. Den inbyggda Tomcat-servern kan köra en app som distribueras som ett WAR-paket (Web Application Archive).
  • JBoss Enterprise Application Platform (EAP): Den inbyggda JBoss EAP-servern kan köra en app som distribueras som ett WAR- eller företagsarkivpaket (EAR). Det här alternativet stöds för Linux-appar i en uppsättning prisnivåer som inkluderar Kostnadsfri, Premium v3 och Isolerad v2.

Anmärkning

JBoss EAP på App Service stöder nu BYOL-fakturering (Bring Your Own License). BYOL gör det möjligt för kunder som har befintliga Red Hat-prenumerationer att tillämpa dessa licenser direkt på sina JBoss EAP-distributioner i Azure App Service. Mer information finns i BYOL-stöd för JBoss EAP på App Service.

Konfigurera datakällan

För att ansluta till datakällor i Spring Boot-program rekommenderar vi att du skapar anslutningssträng och matar in dem i filen application.properties.

  1. I den vänstra rutan på sidan App Service väljer du Inställningar>Miljövariabler. På fliken Anslutningssträngar väljer du Lägg till. Ange ett namn för strängen, klistra in JDBC-anslutningssträngen i fältet Värde och ange Typen till Anpassad. Du kan också valfritt ange anslutningssträngen som en platsinställning.

    Anslutningssträngen är tillgänglig för ditt program som en miljövariabel med namnet CUSTOMCONNSTR_<your-string-name>. Exempel: CUSTOMCONNSTR_exampledb

  2. I filen application.properties refererar du till anslutningssträngen med miljövariabelns namn. I föregående exempel använder du den här koden:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Mer information finns i Spring Boot-dokumentationen om dataåtkomst och externaliserad konfiguration.

Tips

Linux Tomcat-containrar kan automatiskt konfigurera delade datakällor på Tomcat-servern om du anger miljövariabeln WEBSITE_AUTOCONFIGURE_DATABASE till true. Det enda du kan göra är att lägga till en appinställning som innehåller en giltig JDBC-anslutningssträng till en Oracle-, SQL Server-, PostgreSQL- eller MySQL-databas (inklusive autentiseringsuppgifterna för anslutningen). App Service lägger automatiskt till motsvarande delade databas till /usr/local/tomcat/conf/context.xml, med hjälp av en lämplig drivrutin som är tillgänglig i containern. Ett scenario från slutpunkt till slutpunkt som använder den här metoden finns i Självstudie: Skapa en Tomcat-webbapp med Azure App Service i Linux och MySQL.

De här anvisningarna gäller för alla databasanslutningar. Du måste ersätta platshållarna med den valda databasens drivrutinsklassnamn och JAR-fil. Följande tabell innehåller klassnamn och drivrutinsnedladdningar för vanliga databaser.

Databas Namn på drivrutinsklass JDBC-drivrutin
PostgreSQL org.postgresql.Driver Ladda ned
MySQL (på engelska) com.mysql.jdbc.Driver Ladda ned (Välj plattformsoberoende.)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Ladda ned

Om du vill konfigurera Tomcat att använda Java Database Connectivity (JDBC) eller Java Persistence API (JPA), anpassar du först CATALINA_OPTS miljövariabeln som Tomcat läser in vid uppstart. Ange det här värdet med hjälp av en appinställning i Plugin-programmet App Service Maven:

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

Eller ange miljövariabeln på fliken Appinställningar på sidanMiljövariabler för > i Azure-portalen.

Bestäm sedan om datakällan ska vara tillgänglig för ett program eller för alla program som körs på Tomcat-servleten.

Datakällor på programnivå

Så här konfigurerar du en datakälla på programnivå:

  1. Skapa en context.xml fil i meta-INF/ -katalogen i projektet. Skapa meta-INF/-katalogen om den inte finns.

  2. I context.xml lägger du till ett Context element för att länka datakällan till en JNDI-adress. Ersätt driverClassName-platshållaren med din driverns klassnamn från tabellen som visas tidigare i den här artikeln.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Uppdatera programmets web.xml för att använda datakällan i ditt program.

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

Delade resurser på servernivå

Tips

Linux Tomcat-containrar kan automatiskt tillämpa XSLT-filer med hjälp av följande konvention för filer som kopieras till /home/site/wwwroot: Om server.xml.xsl eller server.xml.xslt finns tillämpas filerna på Tomcats server.xml. Om context.xml.xsl eller context.xml.xslt finns tillämpas filerna på Tomcats context.xml.

Om du lägger till en delad datakälla på servernivå måste du redigera Tomcats server.xml. Eftersom filändringar utanför /home katalogen är tillfälliga måste ändringar i Tomcats konfigurationsfiler tillämpas programatiskt enligt följande:

  • Ladda upp ett startskript och ange sökvägen till skriptet i Konfiguration av inställningar>. På fliken Stackinställningar lägger du till sökvägen i kommandorutan Start . Du kan ladda upp startskriptet med ftp.

Startskriptet gör en XSL-transformering till server.xml filen och matar ut den resulterande XML-filen till /usr/local/tomcat/conf/server.xml. Startskriptet bör installeras libxslt eller xlstproc, beroende på distributionen av versionen av Tomcat för webbappen, enligt kommentaren i följande exempelskript. Du kan använda FTP för att ladda upp XSL-filen och startskriptet.

# Install the libxslt package on Alpine-based images:
apk add --update libxslt

# Install the xsltproc package on Debian or Ubuntu-based images:
apt install xsltproc

# Also copy the transform file to /home/tomcat/conf/
# 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

I följande exempel lägger XSL-filen till en ny anslutningsnod i 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 connector if there is 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>

Slutför konfigurationen

Slutligen, placera drivrutins-JAR:erna i Tomcats classpath och starta om din App Service-app.

  • Kontrollera att JDBC-drivrutinsfilerna är tillgängliga för Tomcat-klassladdaren genom att placera dem i katalogen /home/site/lib . I Cloud Shell kör du az webapp deploy --type=lib för varje drivrutins-JAR:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

Om du har skapat en datakälla på servernivå startar du om App Service Linux-programmet. Tomcat återställer CATALINA_BASE till /home/tomcat och använder den uppdaterade konfigurationen.

Tips

Som standard kan Linux JBoss-containrar automatiskt konfigurera delade datakällor på JBoss-servern. Det enda du behöver göra är att lägga till en appinställning som innehåller en giltig JDBC-anslutningssträng till en Oracle-, SQL Server-, PostgreSQL- eller MySQL-databas (inklusive anslutningsautentiseringsuppgifterna) och lägga till appinställningen/miljövariabeln WEBSITE_AUTOCONFIGURE_DATABASE med värdet true. JDBC-anslutningar som skapats med tjänstekopplare stöds också. App Service lägger automatiskt till motsvarande delade datakälla (baserat på namnet på appinställningen och suffixet _DS), med hjälp av en lämplig drivrutin som är tillgänglig i containern. Ett scenario från slutpunkt till slutpunkt som använder den här metoden finns i Självstudie: Skapa en JBoss-webbapp med Azure App Service i Linux och MySQL.

Det finns tre huvudsakliga steg för att registrera en datakälla med JBoss EAP:

  1. Ladda upp JDBC-drivrutinen.
  2. Lägg till JDBC-drivrutinen som en modul.
  3. Lägg till en datakälla med modulen.

App Service är en tillståndslös värdtjänst, så du måste placera de här stegen i ett startskript och köra det varje gång JBoss-containern startar. Här är exempel på PostgreSQL, MySQL och Azure SQL Database:

Anmärkning

JBoss EAP på App Service stöder BYOL-fakturering (Bring Your Own License). BYOL gör det möjligt för kunder som har befintliga Red Hat-prenumerationer att tillämpa dessa licenser direkt på sina JBoss EAP-distributioner i Azure App Service. Mer information finns i BYOL-stöd för JBoss EAP.

  1. Placera dina JBoss CLI-kommandon i en fil med namnet jboss-cli-commands.cli. JBoss-kommandona måste lägga till modulen och registrera den som en datakälla. I följande exempel visas JBoss CLI-kommandona för att skapa en PostgreSQL-datakälla med JNDI-namnet java:jboss/datasources/postgresDS.

    module add --name=org.postgresql --resources=/home/site/libs/postgresql-42.7.4.jar
    /subsystem=datasources/jdbc-driver=postgresql:add(driver-name="postgresql",driver-module-name="org.postgresql",driver-class-name="org.postgresql.Driver",driver-xa-datasource-class-name="org.postgresql.xa.PGXADataSource")
    data-source add --name=postgresql --driver-name="postgresql" --jndi-name="java:jboss/datasources/postgresDS" --connection-url="jdbc:postgresql://\${env.DB_HOST}:5432/postgres" --user-name="\${env.DB_USERNAME}" --password="\${env.DB_PASSWORD}" --enabled=true --use-java-context=true
    

    Observera att module add kommandot använder tre miljövariabler (DB_HOST, DB_USERNAME, och DB_PASSWORD), som du måste lägga till i App Service som appinställningar. Skriptet lägger till dem utan --resolve-parameter-values flaggan så att JBoss inte sparar sina värden i klartext.

  2. Skapa ett startskript, startup.sh, som anropar JBoss CLI-kommandona. I följande exempel visas hur du anropar filen jboss-cli-commands.cli . Senare konfigurerar du App Service för att köra det här skriptet när containern startar.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss-cli-commands.cli
    
  3. Med hjälp av ett distributionsalternativ laddar du upp JDBC-drivrutinen, jboss-cli-commands.cli och startup.sh till sökvägarna som anges i respektive skript. Ladda upp startup.sh som en startfil. Till exempel:

    export RESOURCE_GROUP_NAME=<resource-group-name>
    export APP_NAME=<app-name>
    
    # The lib type uploads to /home/site/libs by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path postgresql-42.7.4.jar --target-path postgresql-42.7.4.jar --type lib
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path jboss-cli-commands.cli --target-path /home/site/scripts/jboss-cli-commands.cli --type static
    # The startup type uploads to /home/site/scripts/startup.sh by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path startup.sh --type startup
    

    Mer information finns i Distribuera filer till App Service.

För att bekräfta att datakällan har lagts till i JBoss-servern, SSH i webbappen och kör $JBOSS_HOME/bin/jboss-cli.sh --connect. När du är ansluten till JBoss, kör du /subsystem=datasources:read-resource för att visa en lista över datakällorna.

Enligt definitionen i jboss-cli-commands.cli kan du komma åt PostgreSQL-anslutningen med hjälp av JNDI-namnet java:jboss/datasources/postgresDS.