針對 Azure App Service 設定 Java 應用程式

注意

針對 Spring 應用程式,我們建議使用 Azure Spring 應用程式。 不過,您仍然可以使用 Azure App Service 作為目的地。

Azure App Service 可讓 Java 開發人員在完全受控的服務上,快速建置、部署及調整其 Java SE、Tomcat 和 JBoss EAP Web 應用程式。 從命令列或編輯器 (例如 IntelliJ、Eclipse 或 Visual Studio Code),使用 Maven 外掛程式部署應用程式。

本指南會為 Java 開發人員提供有關使用 App Service 的重要概念和指示。 如果您從未使用過 Azure App Service,則請先閱讀 Java 快速入門App Service 常見問題集中回答了非 Java 開發特定的一般 App Service 使用問題。

顯示 Java 版本

若要顯示目前的 Java 版本,請在 Cloud Shell 中執行下列命令:

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

若要顯示所有支援的 Java 版本,請在 Cloud Shell 中執行下列命令:

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

若要顯示目前的 Java 版本,請在 Cloud Shell 中執行下列命令:

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

若要顯示所有支援的 Java 版本,請在 Cloud Shell 中執行下列命令:

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

如需版本支援的詳細資訊,請參閱 App Service 語言執行階段支援原則

部署應用程式

建置工具

Maven

透過適用於 Azure Web Apps 的 Maven 外掛程式,您只要在專案根目錄中使用一個命令,就能輕鬆地讓 Maven Java 專案準備好使用 Azure Web Apps:

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

此命令會提示您選取現有的 Azure Web 應用程式或新建應用程式,以新增 azure-webapp-maven-plugin 外掛程式和相關組態。 接著,可以使用下列命令將您的 Java 應用程式部署至 Azure:

mvn package azure-webapp:deploy

以下是 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. 將此外掛程式新增至 build.gradle,以設定適用於 Azure Web Apps 的 Gradle 外掛程式

    plugins {
      id "com.microsoft.azure.azurewebapp" version "1.7.1"
    }
    
  2. 設定 Web 應用程式詳細數據。 如果 Azure 資源不存在,則會建立對應的 Azure 資源。 範例組態在此,如需詳細資訊,請參閱此文件

    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. 使用一個命令進行部署。

    gradle azureWebAppDeploy
    

IDE

Azure 在熱門的 Java IDE 中提供了順暢的 Java App Service 開發體驗,包括:

Kudu API

Java SE

若要將 .jar 檔案部署到 Java SE,請使用 Kudu 網站的 /api/publish/ 端點。 如需有關此 API 的詳細資訊,請參閱這份文件

注意

您的 .jar 應用程式必須命名為 app.jar,App Service 才能識別並執行您的應用程式。 Maven 外掛程式會在部署期間自動為您執行此動作。 如果您不想要將 JAR 重新命名為 app.jar,則可以使用命令上傳殼層指令碼來執行 .jar 應用程式。 在入口網站的 [設定] 區段中,將此指令碼的絕對路徑貼到 [啟動檔案] 文字方塊中。 啟動指令碼不會從其放置所在的目錄來執行。 因此,請一律使用絕對路徑在啟動指令碼中參考檔案 (例如: java -jar /home/myapp/myapp.jar)。

Tomcat

若要將 .war 檔案部署至 Tomcat,請使用 /api/wardeploy/ 端點透過 POST 張貼您的封存檔案。 如需有關此 API 的詳細資訊,請參閱這份文件

JBoss EAP

若要將 .war 檔案部署至 JBoss,請使用 /api/wardeploy/ 端點透過 POST 張貼您的封存檔案。 如需有關此 API 的詳細資訊,請參閱這份文件

若要部署 .ear 檔案,請使用 FTP。 您的 .ear 應用程式會部署到應用程式組態中定義的內容根目錄。 例如,如果應用程式的內容根目錄是 <context-root>myapp</context-root>,則您可以在 /myapp 路徑瀏覽網站:http://my-app-name.azurewebsites.net/myapp。 如果您想要在根目錄路徑提供 Web 應用程式,請確定應用程式已將內容根目錄設定為根目錄路徑:<context-root>/</context-root>。 如需詳細資訊,請參閱設定 Web 應用程式的內容根目錄

請勿使用 FTP 來部署 .war 或 .jar。 FTP 工具是為上傳啟動指令碼、相依性或其他執行階段檔案而設計的。 其不是部署 Web 應用程式的最佳選擇。

記錄和偵錯應用程式

透過 Azure 入口網站,可以取得每個應用程式的效能報表、流量視覺化和健康狀態檢查。 如需詳細資訊,請參閱 Azure App Service 診斷概觀

資料流診斷記錄

若要存取 App Service 中應用程式程式碼內部產生的主控台記錄,請在 Cloud Shell 中執行下列命令,以開啟診斷記錄功能:

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

--level 的可能值為:ErrorWarningInfoVerbose。 後續的每個層級都包含上一個層級。 例如:Error 只包含錯誤訊息,而 Verbose 包含所有訊息。

開啟診斷記錄後,請執行下列命令來查看記錄資料流:

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

如果您沒有立即看到主控台記錄,請在 30 秒後再查看。

注意

您也可以在瀏覽器中的 https://<app-name>.scm.azurewebsites.net/api/logs/docker 檢查記錄檔。

若要隨時停止記錄資料流,請輸入 Ctrl+C

您可以存取從容器產生的主控台記錄。

請先執行下列命令來開啟容器記錄:

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

以適合您 Web 應用程式的名稱取代 <app-name><resource-group-name>

開啟容器記錄後,請執行下列命令來查看記錄資料流:

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

如果您沒有立即看到主控台記錄,請在 30 秒後再查看。

若要隨時停止記錄資料流,請輸入 Ctrl+C

您也可以在瀏覽器中的 https://<app-name>.scm.azurewebsites.net/api/logs/docker 檢查記錄檔。

如需詳細資訊,請參閱 Cloud Shell 中的串流處理記錄

SSH 主控台存取

若要透過容器直接開啟 SSH 工作階段,您的應用程式應在執行中。

在瀏覽器中貼入下列 URL,並以您的應用程式名稱取代 <app-name>

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

如果您尚未經過驗證,必須向您的 Azure 訂用帳戶進行驗證才能連線。 驗證之後,您會看到瀏覽器中的殼層,您可以在其中執行您容器內的命令。

SSH 連線

注意

您在 /home 目錄以外進行的任何變更都會儲存在容器中,在應用程式重新啟動之後便不會保存。

若要從本機電腦開啟遠端 SSH 工作階段,請參閱從遠端殼層開啟 SSH 工作階段

疑難排解工具

內建的 JAVA 映像是以 Alpine Linux 作業系統為基礎。 使用 apk 套件管理員來安裝疑難排解工具或命令。

Java Profiler

Azure App Service 上的所有 Java 執行階段都隨附 JDK 發行小眾測試版錄製器,可用來分析 Java 工作負載。 您可以使用它來記錄 JVM、系統和應用程式事件,以及針對應用程式中的問題進行疑難解答。

若要深入了解 Java 分析工具,請瀏覽 Azure Application Insights 文件

飛行記錄器

App Service 上的所有 Java 運行時間都隨附 Java Flight Recorder。 您可以使用它來記錄 JVM、系統和應用程式事件,以及針對 Java 應用程式中的問題進行疑難解答。

計時錄製

若要進行計時錄製,您需要 Java 應用程式的 PID(進程識別元)。 若要尋找 PID,請在 開啟瀏覽器至 Web 應用程式的 SCM 網站 https://<your-site-name>.scm.azurewebsites.net/ProcessExplorer/。 這個頁面會顯示 Web 應用程式中的執行中進程。 在數據表中尋找名為 「java」 的進程,並複製對應的 PID (進程識別元)。

接下來,在 SCM 網站頂端工具列中開啟 [偵錯控制台 ],然後執行下列命令。 將取代 <pid> 為您稍早複製的進程識別碼。 此命令會啟動 Java 應用程式的 30 秒分析工具錄製,並在目錄中產生名為 timed_recording_example.jfrC:\home 檔案。

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

透過 SSH 連線到您的 App Service 並執行 jcmd 命令,以查看所有執行中的 Java 進程清單。 除了 jcmd 本身,您應該會看到 Java 應用程式以進程識別碼 (pid) 執行。

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

執行下列命令以啟動 JVM 的 30 秒記錄。 它會分析 JVM,並在主目錄中建立名為 jfr_example.jfr 的 JFR 檔案。 (以 Java 應用程式的 pid 取代 116。

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

在 30 秒間隔期間,您可以執行 jcmd 116 JFR.check來驗證錄製是否已進行。 此命令會顯示指定 Java 程式的所有錄製。

連續錄製

您可以使用 Java Flight Recorder 來持續分析 Java 應用程式,對運行時間效能的影響最小。 若要這樣做,請執行下列 Azure CLI 命令,以使用必要的設定建立名為 JAVA_OPTS 的應用程式設定。 當您的應用程式啟動時,JAVA_OPTS應用程式設定的內容會傳遞至 java 命令。

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

錄製開始之後,您可以隨時使用 JFR.dump 命令傾印目前的錄製數據。

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

分析 .jfr 檔案

使用 FTPS 將 JFR 檔案下載到本機電腦。 若要分析 JFR 檔案,請下載並安裝 Java Mission Control。 如需 Java Mission Control 的指示,請參閱 JMC 檔和安裝指示

應用程式記錄

透過 Azure 入口網站或 Azure CLI 啟用應用程式記錄,設定 App Service 將應用程式的標準主控台輸出和標準主控台錯誤資料流寫入至本機檔案系統或 Azure Blob 儲存體。 設定後的 12 個小時會將記錄至本機 App Service 檔案系統執行個體的功能停用。 如果您需要較長的保留期,則請設定應用程式將輸出寫入至 Blob 儲存體容器。 JAVA 和 Tomcat 應用程式記錄可以在 /home/LogFiles/Application/ 目錄中找到。

透過 Azure 入口網站或 Azure CLI 啟用應用程式記錄,設定 App Service 將應用程式的標準主控台輸出和標準主控台錯誤資料流寫入至本機檔案系統或 Azure Blob 儲存體。 如果您需要較長的保留期,則請設定應用程式將輸出寫入至 Blob 儲存體容器。 JAVA 和 Tomcat 應用程式記錄可以在 /home/LogFiles/Application/ 目錄中找到。

Azure Blob 儲存體 Linux 型應用程式的記錄只能使用 來設定Azure 監視器

如果您的應用程式使用 LogbackLog4j 追蹤,則您可以使用在 Application Insights 中探索 Java 追蹤記錄中的記錄架構設定指示,將這些要檢閱的追蹤轉送至 Azure Application Insights。

注意

由於已知的弱點 CVE-2021-44228,請務必使用 Log4j 2.16 版或更新版本。

自訂和調整

Azure App Service 支援透過 Azure 入口網站和 CLI 的預設調整和自訂。 請檢閱下列非 Java 特定 Web 應用程式設定的文章:

在本機複製應用程式內容

將應用程式設定 JAVA_COPY_ALL 設為 true,以從共用檔案系統將應用程式內容複製到本機背景工作角色。 此設定有助於解決檔案鎖定問題。

設定 Java 執行階段選項

若要設定配置的記憶體或其他 JVM 執行階段選項,請使用選項建立名為 JAVA_OPTS應用程式設定。 App Service 會在啟動時將此設定當成環境變數傳遞至 Java 執行階段。

在 Azure 入口網站中,於 Web 應用程式的 [應用程式設定] 下,建立名為 JAVA_OPTS (若為 Java SE) 或 CATALINA_OPTS (若為 Tomcat) 且包含其他設定 (例如 -Xms512m -Xmx1204m) 的新應用程式設定。

若要從 Maven 外掛程式設定應用程式設定,請在 Azure 外掛程式區段中新增設定/值標籤。 下列範例設定特定最小和最大 Java 堆積大小:

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

注意

在 Windows App Service 上使用 Tomcat 時,您不需要建立 web.config 檔案。

執行具有其 App Service 方案中某個部署位置的單一應用程式開發人員,可以使用下列選項:

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

調整應用程式堆積設定時,請檢閱 App Service 方案詳細資料,並考慮多個應用程式和部署位置需求以尋找最佳的記憶體配置。

開啟 Web 通訊端

在應用程式的 [應用程式設定] 中,開啟 Azure 入口網站中的 Web 通訊端支援。 您必須重新啟動應用程式,設定才會生效。

搭配使用 Azure CLI 與下列命令,以開啟 Web 通訊端支援:

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

然後重新啟動您的應用程式:

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

設定預設字元編碼

在 Azure 入口網站中,於 Web 應用程式的 [應用程式設定] 下,建立名為 JAVA_OPTS 且值為 -Dfile.encoding=UTF-8 的新應用程式設定。

或者,您可以使用 App Service Maven 外掛程式來設定應用程式設定。 在外掛程式設定中新增設定名稱和值標籤:

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

預先編譯 JSP 檔案

若要改善 Tomcat 應用程式的效能,您可以先編譯 JSP 檔案,再部署至 App Service。 您可以使用 Apache Sling 所提供的 Maven 外掛程式,或使用此 Ant 組建檔案

保護應用程式

在 App Service 中執行的 Java 應用程式會有一組與其他應用程式相同的安全性最佳做法

驗證使用者 (簡單驗證)

使用 [驗證與授權] 選項,設定 Azure 入口網站中的應用程式驗證。 從該處,您可以使用 Microsoft Entra ID 或社交登入 (例如 Facebook、Google 或 GitHub) 來啟用驗證。 只有在設定單一驗證提供者時,Azure 入口網站設定才會運作。 如需詳細資訊,請參閱設定 App Service 應用程式使用 Azure Microsoft Entra 登入,以及其他識別提供者的相關文章。 如果您需要啟用多個登入提供者,請遵循自定義登入和註銷中的指示。

Java SE

Spring Boot 開發人員可以使用 Microsoft Entra Spring Boot 簡易版,以利用熟悉的 Spring Security 註釋和 API 來保護應用程式。 請務必要在 application.properties 檔案中增加標頭大小上限。 建議值為 16384

Tomcat

Tomcat 應用程式可以藉由將 Principal 物件轉換成 Map 物件,直接從 servlet 存取使用者的宣告。 物件會將 Map 每個宣告類型對應至該類型的宣告集合。 在下列程式代碼範例中, request 是的 HttpServletRequest實例。

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

現在您可以檢查 Map 物件是否有任何特定的宣告。 例如,下列程式碼片段會逐一查看所有宣告類型,並列印每個集合的內容。

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);
            }
        }
    }

若要登出使用者,請使用 /.auth/ext/logout 路徑。 若要執行其他動作,請參閱關於自訂登入和登出的文件。 另外,您也可以參閱有關 Tomcat HttpServletRequest 介面及其方法的官方文件。 下列 servlet 方法也是根據 App Service 設定來更新:

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

若要停用此功能,請建立名為 WEBSITE_AUTH_SKIP_PRINCIPAL 的應用程式設定,其值為 1。 若要停用 App Service 新增的所有 servlet 篩選條件,請建立名為 WEBSITE_SKIP_FILTERS 的設定,其值為 1

設定 TLS/SSL

若要上傳現有的 TLS/SSL 憑證,並將其系結至應用程式的功能變數名稱,請遵循在 Azure App 服務 中使用 TLS/SSL 系結保護自定義 DNS 名稱中的指示。 您也可以將應用程式設定為強制執行 TLS/SSL。

使用 KeyVault 參考

Azure KeyVault 透過存取原則和稽核歷程記錄提供集中式祕密管理。 您可以在 KeyVault 中儲存秘密 (例如密碼或連接字串),並透過環境變數在應用程式中存取這些秘密。

首先,請依照說明授與應用程式對金鑰保存庫的存取權限,並在應用程式設定中建立對祕密的 KeyVault 參考。 您可以在遠端存取 App Service 終端機時,列印環境變數,來驗證參考是否會解析為秘密。

若要將這些秘密插入 Spring 或 Tomcat 設定檔中,請使用環境變數插入語法 (${MY_ENV_VAR})。 如需 Spring 設定檔,請參閱有關外部化設定的文件。

使用 Java 金鑰存放區

根據預設,上傳至 App Service Linux 的任何公用或私人憑證會在容器啟動時載入個別的 Java 金鑰存放區。 上傳憑證後,您必須重新啟動 App Service,才能將其載入 Java 金鑰存放區。 系統會將公開憑證載入位於 $JRE_HOME/lib/security/cacerts 的金鑰存放區,而私人憑證則儲存在 $JRE_HOME/lib/security/client.jks 中。

使用 Java 金鑰存放區中的憑證加密 JDBC 連線時,可能需要進行更多設定。 請參閱您所選 JDBC 驅動程式的文件。

初始化 Java 金鑰存放區

若要初始化 import java.security.KeyStore 物件,請使用密碼載入金鑰儲存區檔案。 這兩個金鑰存放區的預設密碼為 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());

手動載入金鑰存放區

您可以手動將憑證載入金鑰存放區。 建立應用程式設定 SKIP_JAVA_KEYSTORE_LOAD,並將值設為 1,以停用 App Service 自動將憑證載入金鑰存放區。 透過 Azure 入口網站上傳至 App Service 的所有公開憑證都會儲存在 /var/ssl/certs/。 私人憑證會儲存在 /var/ssl/private/ 下。

您可以開啟 App Service 的 SSH 連線,然後執行命令 keytool,來互動或偵錯 JAVA 金鑰工具。 如需命令清單,請參閱金鑰工具文件。 如需金鑰儲存區 API 的詳細資訊,請參閱官方文件

設定 APM 平台

本節說明如何將部署在 Azure App Service 上的 Java 應用程式,與 Azure 監視器 Application Insights、NewRelic 和 AppDynamics 應用程式效能監視 (APM) 平台連線。

設定 Application Insights

Azure 監視器 Application Insights 是雲端原生的應用程式監視服務,可讓客戶觀察失敗、瓶頸和使用模式,以改善應用程式效能,並減少平均解決時間 (MTTR)。 只要按幾下滑鼠或透過幾個 CLI 命令,就可以監視 Node.js 或 Java 應用程式;自動收集記錄、計量和分散式追蹤;不需要在應用程式中納入 SDK。 如需可用於設定代理程式的應用程式設定詳細資訊,請參閱 Application Insights 文件

Azure 入口網站

若要從 Azure 入口網站啟用 Application Insights,請移至左側功能表上的 [Application Insights],然後選取 [開啟 Application Insights]。 根據預設,會使用與 Web 應用程式同名的新 Application Insights 資源。 您可以選擇使用現有的 Application Insights 資源,或變更名稱。 選取底部的 [ 套用 ]。

Azure CLI

若要透過 Azure CLI 啟用,您必須建立 Application Insights 資源,並在 Azure 入口網站 上設定幾個應用程式設定,以將 Application Insights 連線到您的 Web 應用程式。

  1. 啟用 Applications Insights 延伸模組

    az extension add -n application-insights
    
  2. 使用下列 CLI 命令建立 Application Insights 資源。 使用所需的資源名稱和群組來取代預留位置。

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

    請記下 connectionStringinstrumentationKey 的值,下一個步驟中會需要這些值。

    若要擷取其他位置的清單,請執行 az account list-locations

  1. 將檢測金鑰、連接字串和監視代理程式版本設定為 Web 應用程式上的應用程式設定。 以先前步驟中的值取代 <instrumentationKey><connectionString>

    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. 將檢測金鑰、連接字串和監視代理程式版本設定為 Web 應用程式上的應用程式設定。 以先前步驟中的值取代 <instrumentationKey><connectionString>

    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"
    

設定 NewRelic

  1. NewRelic.com 建立 NewRelic 帳戶

  2. 從 NewRelic 下載 Java 代理程式。 其檔名類似於 newrelic-java-x.x.x.zip

  3. 複製您的授權金鑰,您稍後需要它來設定代理程式。

  4. 透過 SSH 連線到您的 App Service 執行個體,然後建立新目錄 /home/site/wwwroot/apm

  5. 將解壓縮的 NewRelic Java 代理程式檔案上傳至 /home/site/wwwroot/apm 之下的目錄。 代理程式檔案應位於 /home/site/wwwroot/apm/newrelic 中。

  6. /home/site/wwwroot/apm/newrelic/newrelic.yml 修改 YAML 檔案,並將預留位置授權值取代為您自己的授權金鑰。

  7. 在 Azure 入口網站中,瀏覽至您在 App Service 中的應用程式,並建立新的應用程式設定。

    • 針對 Java SE 應用程式,請使用 -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar 這個值建立名為 JAVA_OPTS 的環境變數。
    • 針對 Tomcat,請使用 -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar 這個值建立名為 CATALINA_OPTS 的環境變數。
  1. NewRelic.com 建立 NewRelic 帳戶

  2. 從 NewRelic 下載 Java 代理程式。 其檔名類似於 newrelic-java-x.x.x.zip

  3. 複製您的授權金鑰,以供稍後設定代理程式時使用。

  4. 透過 SSH 連線到您的 App Service 執行個體,然後建立新目錄 /home/site/wwwroot/apm

  5. 將解壓縮的 NewRelic Java 代理程式檔案上傳至 /home/site/wwwroot/apm 之下的目錄。 代理程式檔案應位於 /home/site/wwwroot/apm/newrelic 中。

  6. /home/site/wwwroot/apm/newrelic/newrelic.yml 修改 YAML 檔案,並將預留位置授權值取代為您自己的授權金鑰。

  7. 在 Azure 入口網站中,瀏覽至您在 App Service 中的應用程式,並建立新的應用程式設定。

    • 針對 Java SE 應用程式,請使用 -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar 這個值建立名為 JAVA_OPTS 的環境變數。
    • 針對 Tomcat,請使用 -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar 這個值建立名為 CATALINA_OPTS 的環境變數。

如果您已經有 JAVA_OPTSCATALINA_OPTS 的環境變數,請將 -javaagent:/... 選項附加至目前值的結尾。

設定 AppDynamics

  1. AppDynamics.com 建立 AppDynamics 帳戶

  2. 從 AppDynamics 網站下載 Java 代理程式。 檔名類似於 AppServerAgent-x.x.x.xxxxx.zip

  3. 使用 Kudu 主控台來建立新的目錄 /home/site/wwwroot/apm

  4. 將 Java 代理程式檔案上傳至 /home/site/wwwroot/apm 下的目錄。 代理程式檔案應位於 /home/site/wwwroot/apm/appdynamics 中。

  5. 在 Azure 入口網站中,瀏覽至您在 App Service 中的應用程式,並建立新的應用程式設定。

    • 針對 Java SE 應用程式,請使用 -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> 這個值建立名為 JAVA_OPTS 的環境變數,其中 <app-name> 是您的 App Service 名稱。
    • 針對 Tomcat 應用程式,請使用 -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> 這個值建立名為 CATALINA_OPTS 的環境變數,其中 <app-name> 是您的 App Service 名稱。
  1. AppDynamics.com 建立 AppDynamics 帳戶

  2. 從 AppDynamics 網站下載 Java 代理程式。 檔名類似於 AppServerAgent-x.x.x.xxxxx.zip

  3. 透過 SSH 連線到您的 App Service 執行個體,然後建立新目錄 /home/site/wwwroot/apm

  4. 將 Java 代理程式檔案上傳至 /home/site/wwwroot/apm 下的目錄。 代理程式檔案應位於 /home/site/wwwroot/apm/appdynamics 中。

  5. 在 Azure 入口網站中,瀏覽至您在 App Service 中的應用程式,並建立新的應用程式設定。

    • 針對 Java SE 應用程式,請使用 -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> 這個值建立名為 JAVA_OPTS 的環境變數,其中 <app-name> 是您的 App Service 名稱。
    • 針對 Tomcat 應用程式,請使用 -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> 這個值建立名為 CATALINA_OPTS 的環境變數,其中 <app-name> 是您的 App Service 名稱。

注意

如果您已經有 JAVA_OPTSCATALINA_OPTS 的環境變數,請將 -javaagent:/... 選項附加至目前值的結尾。

設定資料來源

Java SE

若要連接到 Spring Boot 應用程式中的資料來源,建議您建立連接字串,並將其插入 application.properties 檔案。

  1. 在 App Service 頁面的 [設定] 區段中,設定字串的名稱,在 [值] 欄位中貼上 JDBC 連接字串,並將類型設定為 [自訂]。 您可以選擇將此連接字串設定為位置設定。

    此連接字串可以名為 CUSTOMCONNSTR_<your-string-name> 的環境變數提供應用程式存取。 例如: CUSTOMCONNSTR_exampledb

  2. application.properties 檔案中,使用環境變數名稱來參考此連接字串。 在我們的範例中,我們會使用下列內容。

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

如需詳細資訊,請參閱有關資料存取的 Spring Boot 文件外部化設定

Tomcat

這些指示適用於所有資料庫連線。 您必須將所選取資料庫的驅動程式類別名稱和 JAR 檔案填入佔位元。 下表提供常見資料庫的類別名稱和驅動程式下載。

Database 驅動程式類別名稱 JDBC 驅動程式
PostgreSQL org.postgresql.Driver 下載
MySQL com.mysql.jdbc.Driver 下載 (請選取 [Platform Independent] \(不受平台影響\))
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver 下載

若要設定讓 Tomcat 使用「Java 資料庫連線」(JDBC) 或「Java 保存 API」(JPA),請先自訂 Tomcat 在啟動時所讀入的 CATALINA_OPTS 環境變數。 請透過 App Service Maven 外掛程式中的應用程式設定來設定這些值:

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

或是在 Azure 入口網站的 [設定]>[應用程式設定] 頁面中設定環境變數。

接著,決定資料來源應僅供在 Tomcat Servlet 上執行的一個應用程式還是所有應用程式使用。

應用程式層級資料來源

  1. 在專案的 META-INF/ 目錄中,建立 context.xml 檔案。 建立 META-INF/ 目錄 (如果此目錄不存在)。

  2. context.xml 中,新增 Context 元素以將資料來源連結至 JNDI 位址。 以上表中您驅動程式的類別名稱取代 driverClassName 預留位置。

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. 更新您應用程式的 web.xml,以使用您應用程式中的資料來源。

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

共用伺服器層級資源

在 Windows 上安裝於 App Service 的 Tomcat 存在於 App Service 方案上的共用空間內。 您無法直接修改 Tomcat 安裝來進行全伺服器的設定。 若要針對 Tomcat 安裝來變更伺服器層級的設定,您必須將 Tomcat 複製到本機資料夾,以在其中修改 Tomcat 的設定。

在應用程式啟動時自動建立自訂 Tomcat

您可以使用啟動指令碼,以便先執行動作再啟動 Web 應用程式。 用於自訂 Tomcat 的啟動指令碼必須完成下列步驟:

  1. 檢查 Tomcat 是否已複製到本機並進行設定。 如果是,啟動指令碼會在這裡結束。
  2. 將 Tomcat 複製到本機。
  3. 變更所需的設定。
  4. 指出設定已順利完成。

針對 Windows 應用程式,請在目錄中建立名為 startup.cmdstartup.ps1wwwroot 檔案。 此檔案會在 Tomcat 伺服器啟動時自動執行。

以下是完成了這些步驟的 PowerShell 指令碼:

    # 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
轉換

用於自訂 Tomcat 版本的常見使用案例是修改 server.xmlcontext.xmlweb.xml Tomcat 設定檔。 App Service 已修改這些檔案以提供平台功能。 若要繼續使用這些功能,請務必先保留這些檔案的內容,再變更這些檔案。 若要達成此目的,建議您使用 XSL 轉換 (XSLT)。 使用 XSL 轉換來變更 XML 檔案,同時保留檔案的原始內容。

範例 XSLT 檔案

這個範例轉換會將新的連接器節點新增至 server.xml。 請注意身分識別轉換,這會保留檔案的原始內容。

    <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>
XSL 轉換的函式

PowerShell 具有內建工具,可使用 XSL 轉換來轉換 XML 檔案。 下列指令碼是可在 startup.ps1 中用來執行轉換的範例函式:

    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
    }
應用程式設定

平台也需要知道您自訂 Tomcat 版本的安裝位置。 您可以在 CATALINA_BASE 應用程式設定中設定安裝的位置。

您可以使用 Azure CLI 來變更此設定:

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

或者,您也可以在 Azure 入口網站中手動變更設定:

  1. 移至 [設定]>[設定]>[應用程式設定]
  2. 選取 [新增應用程式設定]。
  3. 使用下列值來建立設定:
    1. 名稱CATALINA_BASE
    2. "%LOCAL_EXPANDED%\tomcat"
範例 startup.ps1

下列範例指令碼會將自訂 Tomcat 複製到本機資料夾、執行 XSL 轉換,並指出轉換成功:

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

完成設定

最後,您會將驅動程式 JAR 放在 Tomcat 類別路徑中,然後重新啟動 App Service。 請確定 Tomcat classloader 可以使用 JDBC 驅動程式檔案,方法是將它們放在 [/home/site/lib] 目錄中。 在 Cloud Shell 中,為每個驅動程式 JAR 執行 az webapp deploy --type=lib

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

Tomcat

這些指示適用於所有資料庫連線。 您必須將所選取資料庫的驅動程式類別名稱和 JAR 檔案填入佔位元。 下表提供常見資料庫的類別名稱和驅動程式下載。

Database 驅動程式類別名稱 JDBC 驅動程式
PostgreSQL org.postgresql.Driver 下載
MySQL com.mysql.jdbc.Driver 下載 (請選取 [Platform Independent] \(不受平台影響\))
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver 下載

若要設定讓 Tomcat 使用「Java 資料庫連線」(JDBC) 或「Java 保存 API」(JPA),請先自訂 Tomcat 在啟動時所讀入的 CATALINA_OPTS 環境變數。 請透過 App Service Maven 外掛程式中的應用程式設定來設定這些值:

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

或是在 Azure 入口網站的 [設定]>[應用程式設定] 頁面中設定環境變數。

接著,決定資料來源應僅供在 Tomcat Servlet 上執行的一個應用程式還是所有應用程式使用。

應用程式層級資料來源

  1. 在專案的 META-INF/ 目錄中,建立 context.xml 檔案。 建立 META-INF/ 目錄 (如果此目錄不存在)。

  2. context.xml 中,新增 Context 元素以將資料來源連結至 JNDI 位址。 以上表中您驅動程式的類別名稱取代 driverClassName 預留位置。

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. 更新您應用程式的 web.xml,以使用您應用程式中的資料來源。

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

共用伺服器層級資源

新增共享的伺服器層級數據源需要您編輯 Tomcat 的server.xml。 首先,上傳啟動指令碼,並在 [設定]>[啟動命令] 中設定指令碼的路徑。 您可以使用 FTP 上傳啟動指令碼。

啟動指令碼會對 server .xml 檔案進行 xsl 轉換,並將產生的 xml 檔案輸出至 /usr/local/tomcat/conf/server.xml。 啟動指令碼會透過 apk 安裝 libxslt。 您可以透過 FTP 上傳 xsl 檔案和啟動指令碼。 以下是啟動指令碼範例。

# 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

下列範例 XSL 檔案會將新的連接器節點新增至 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>

完成設定

最後,將驅動程式 JAR 放在 Tomcat 類別路徑中,然後重新啟動您的 App Service。

  1. 請確定 Tomcat classloader 可以使用 JDBC 驅動程式檔案,方法是將它們放在 [/home/site/lib] 目錄中。 在 Cloud Shell 中,為每個驅動程式 JAR 執行 az webapp deploy --type=lib
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

如果您已建立伺服器層級的資料來源,請重新啟動 App Service Linux 應用程式。 Tomcat 會將 CATALINA_BASE 重設為 /home/tomcat,並使用已更新的設定。

JBoss EAP 資料來源

使用 JBoss EAP 註冊資料來源時有三個核心步驟:上傳 JDBC 驅動程式、將 JDBC 驅動程式新增為模組,以及註冊模組。 App Service 是無狀態裝載服務,因此用於新增和註冊資料來源模組的設定命令,必須編寫到指令碼並於容器啟動時套用。

  1. 取得資料庫的 JDBC 驅動程式。

  2. 建立 JDBC 驅動程式的 XML 模組定義檔案。 下列範例顯示 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. 將您的 JBoss CLI 命令放入名為 jboss-cli-commands.cli 的檔案中。 JBoss 命令必須新增模組,並將其註冊為資料來源。 下列範例顯示 PostgreSQL 的 JBoss CLI 命令。

    #!/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. 建立啟動指令碼 startup_script.sh 以呼叫 JBoss CLI 命令。 下列範例示範如何呼叫 。jboss-cli-commands.cli 稍後,您將設定 App Service 在容器啟動時執行此腳本。

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
    
  5. 使用您選擇的 FTP 用戶端,將 JDBC 驅動程式 jboss-cli-commands.clistartup_script.sh 和模組定義上傳至 /site/deployments/tools/

  6. 設定您的網站,使其在容器啟動時執行 startup_script.sh。 在 Azure 入口網站中,瀏覽至 [設定]>[一般設定]>[啟動命令]。 將啟動命令欄位設定為 /home/site/deployments/tools/startup_script.sh儲存您的變更。

若要確認資料來源已新增至 JBoss 伺服器,請透過 SSH 連線到您的 Webapp 並執行 $JBOSS_HOME/bin/jboss-cli.sh --connect。 線上到 JBoss 之後,請執行 /subsystem=datasources:read-resource 以列印資料來源的清單。

記錄中的 robots933456

您可能會在容器記錄中看到下列訊息:

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

您可以放心忽略這個訊息。 /robots933456.txt 是一個虛擬 URL 路徑,App Service 會使用該路徑來檢查容器是否可以處理要求。 404 回應只是指出路徑不存在,但其可讓 App Service 知道容器狀況良好,並已準備好回應要求。

選擇 Java 執行階段版本

App Service 可讓使用者選擇 JVM 的主要版本 (例如 Java 8 或 Java 11) 和修補檔版本 (例如 1.8.0_232 或 11.0.5)。 您也可以選擇在有新的次要版本可供使用時自動更新修補檔版本。 在大部分情況下,生產應用程式應該使用固定的修補程式 JVM 版本。 這可防止修補程式版本自動更新期間發生未預期的中斷。 所有 Java Web 應用程式都會使用 64 位的 VM,而且無法設定。

如果您使用 Tomcat,則可以選擇釘選 Tomcat 的修補檔版本。 在 Windows 上,您可以獨立固定 JVM 和 Tomcat 的修補檔版本。 在 Linux 上,您可以釘選 Tomcat 的修補程式版本;JVM 的修補程式版本也會固定,但無法個別設定。

如果您選擇釘選次要版本,您必須定期更新應用程式上的 JVM 次要版本。 為了確保您的應用程式在較新的次要版本上執行,請建立預備位置,並在預備位置上遞增次要版本。 確認應用程式在新次要版本上正確執行之後,您就可以交換預備和生產位置。

JBoss EAP

JBoss EAP 中的叢集功能

App Service 可針對 JBoss EAP 7.4.1 版和更新版本來支援叢集功能。 若要啟用叢集功能,您的 Web 應用程式必須與虛擬網路整合。 當 Web 應用程式與虛擬網路整合時,它會重新啟動,且 JBoss EAP 安裝會自動啟動叢集設定。 JBoss EAP 實例會使用運行時間環境變數中顯示的 WEBSITES_PRIVATE_PORTS 埠,透過虛擬網路整合中指定的子網進行通訊。 您可以使用任何值建立名為 WEBSITE_DISABLE_CLUSTERING 的應用程式設定,以停用叢集功能。

注意

如果您要啟用與 ARM 範本的虛擬網路整合,您必須手動將 屬性 vnetPrivatePorts 設定為的值 2。 如果您從 CLI 或入口網站啟用虛擬網路整合,則會自動為您設定此屬性。

啟用叢集功能時,JBoss EAP 執行個體會使用 FILE_PING JGroups 探索通訊協定來探索新的執行個體,並保存叢集資訊,例如叢集成員、其識別碼及其 IP 位址。 在 App Service 上,這些檔案位於 /home/clusterinfo/ 底下。 要開始的第一個 EAP 實例會取得叢集成員資格檔案的讀取/寫入許可權。 其他實例會讀取檔案、尋找主要節點,並與要包含在叢集中的該節點協調,並新增至檔案。

進階 V3 和隔離 V2 App Service 方案類型可以選擇性地分散到可用性區域,以改善業務關鍵工作負載的復原能力和可靠性。 此架構也稱為區域備援。 JBoss EAP 叢集功能可與區域備援功能相容。

自動調整規則

設定水平調整的自動調整規則時,請務必以累加的方式移除執行個體 (一次移除一個執行個體),以確保每個移除的執行個體都可以將其活動 (例如處理資料庫交易) 傳送給叢集的另一個成員。 在入口網站中設定自動調整規則以調降規模時,請使用下列選項:

  • 作業:「將計數減少」
  • 冷卻時間:「5 分鐘」或更久
  • 執行個體計數:1

您不需要以累加的方式新增執行個體 (擴增),您可以一次將多個執行個體新增至叢集。

JBoss EAP App Service 方案

JBoss EAP 僅適用於進階 v3 和隔離 v2 App Service 方案類型。 在公開預覽期間於不同階層上建立 JBoss EAP 網站的客戶,應擴大為進階或隔離硬體層,以免發生非預期的行為。

App Services 上的 Tomcat 基準設定

如果 Java 開發人員知道 Tomcat 的server.xml檔案和組態詳細數據,可以自定義伺服器設定、疑難解答問題,以及將應用程式部署至 Tomcat。 可能的自訂專案包括:

  • 自定義 Tomcat 組態:藉由瞭解server.xml檔案和 Tomcat 的組態詳細數據,您可以微調伺服器設定,以符合其應用程式的需求。
  • 偵錯:當應用程式部署在 Tomcat 伺服器上時,開發人員必須知道伺服器組態,才能偵錯任何可能發生的問題。 這包括檢查伺服器記錄、檢查組態檔,以及識別可能發生的任何錯誤。
  • 針對 Tomcat 問題進行疑難解答:Java 開發人員不可避免地遇到其 Tomcat 伺服器的問題,例如效能問題或設定錯誤。 藉由瞭解server.xml檔案和 Tomcat 的組態詳細數據,開發人員可以快速診斷和疑難解答這些問題,以節省時間和精力。
  • 將應用程式部署至 Tomcat:若要將 Java Web 應用程式部署至 Tomcat,開發人員必須知道如何設定server.xml檔案和其他 Tomcat 設定。 瞭解這些詳細數據對於成功部署應用程式以及確保應用程式在伺服器上順利執行至關重要。

當您使用內建 Tomcat 建立應用程式來裝載 Java 工作負載時(WAR 檔案或 JAR 檔案),有一些設定可供您開始使用 Tomcat 設定。 如需詳細資訊,請參閱 官方 Apache Tomcat 檔 ,包括 Tomcat 網頁伺服器的預設組態。

此外,某些轉換會在啟動時進一步套用至 Tomcat 散發server.xml。 這些是 連線 或主機和閥設定的轉換。

請注意,Tomcat 的最新版本具有 server.xml (8.5.58 和 9.0.38 及 9.0.38)。 舊版 Tomcat 不會使用轉換,因此可能會有不同的行為。

連接器

<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 設定為 16384
  • URIEncoding 設定為 UTF-8
  • conectionTimeout 設定為 WEBSITE_TOMCAT_CONNECTION_TIMEOUT,預設為 240000
  • maxThreads 設定為 WEBSITE_CATALINA_MAXTHREADS,預設為 200
  • maxConnections 設定為 WEBSITE_CATALINA_MAXCONNECTIONS,預設為 10000

注意

connectionTimeout、maxThreads 和 max 連線 ions 設定可以使用應用程式設定來微調

以下是可用來改變 conectionTimeout、maxThreads 或 max 連線 ions 值的 CLI 命令範例:

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
  • 連線 or 會使用容器的位址,而不是 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 設定為 AZURE_SITE_APP_BASE,預設為local WebappsLocalPath
  • xmlBase 設定為 AZURE_SITE_HOME,預設為 /site/wwwroot
  • unpackWARs 設定為 AZURE_UNPACK_WARS,預設為 true
  • workDir 設定為 JAVA_TMP_DIR,預設值 TMP
  • errorReportValveClass 使用我們的自定義錯誤報告閥

<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 設定為 AZURE_LOGGING_DIR,預設為 home\logFiles
  • maxDays 是 , WEBSITE_HTTPLOGGING_RETENTION_DAYS預設為 0 [永遠]

在 Linux 上,其具有所有相同的自定義專案,再加上:

  • 將錯誤和報告頁面新增至閥:
               <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>

下一步

瀏覽適用於 Java 開發人員的 Azure 中心,以找出 Azure 快速入門、教學課程和 Java 參考文件。