共用方式為


在 Azure App Service 中部署及設定 Tomcat、JBoss 或 Java SE 應用程式

本文說明 App Service 中 Java 應用程式最常見的部署和執行階段設定。 如果您從未使用過 Azure App Service,則請先閱讀 Java 快速入門App Service 常見問題集中回答了非 Java 開發特定的一般 App Service 使用問題。

Azure App Service 會以三種變體在完全受控的服務上執行 Java Web 應用程式:

  • Java SE - 可以執行部署為包含內嵌伺服器的 JAR 套件的應用程式 (例如 Spring Boot、Dropwizard、Quarkus 或具有內嵌 Tomcat 或 Jetty 伺服器的應用程式)。
  • Tomcat - 內建 Tomcat 伺服器可以執行部署為 WAR 套件的應用程式。
  • JBoss EAP - 僅支援 Premium v3 和隔離 v2 定價層中的 Linux 應用程式。 內建 JBoss EAP 伺服器可以執行部署為 WAR 或 EAR 套件的應用程式。

注意

針對 Spring 應用程式,我們建議使用 Azure Spring 應用程式。 不過,您仍然可以使用 Azure App Service 作為目的地。 如需建議,請參閱 Java 工作負載目的地指導

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

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

部署應用程式

建置工具

Maven

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

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

此命令會提示您選取現有的 Azure Web 應用程式或新建應用程式,以新增 azure-webapp-maven-plugin 外掛程式和相關組態。 在設定期間,其會嘗試偵測您的應用程式是否應該部署到 Java SE、Tomcat 或 (僅限 Linux) JBoss EAP。 接著,可以使用下列命令將您的 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 17</javaVersion>
    </runtime>
    <deployment>
      <resources>
        <resource>
          <type>jar</type>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.jar</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin> 

Gradle (英文)

  1. 將此外掛程式新增至 build.gradle,以設定適用於 Azure Web Apps 的 Gradle 外掛程式

    plugins {
      id "com.microsoft.azure.azurewebapp" version "1.10.0"
    }
    
  2. 設定 Web 應用程式詳細資料。 如果對應的 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 10.0' // or 'Java SE' if you want to run an executable jar
          javaVersion = 'Java 17'
        }
        appSettings {
            <key> = <value>
        }
        auth {
            type = 'azure_cli' // support azure_cli, oauth2, device_code and service_principal
        }
    }
    
  3. 使用一個命令進行部署。

    gradle azureWebAppDeploy
    

IDE

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

Kudu API

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

注意

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

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

若要將 .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

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

Linux 中的 SSH 主控台存取

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

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

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

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

SSH 連線

注意

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

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

Linux 疑難排解工具

內建的 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> 取代為您稍早複製的程序識別碼。 此命令會使用分析工具開始進行 30 秒的 Java 應用程式錄製工作,並在 C:\home 目錄中產生名為 timed_recording_example.jfr 的檔案。

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

分析 .jfr 檔案

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

應用程式記錄

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

JAVA 和 Tomcat 應用程式記錄可以在 /home/LogFiles/Application/ 目錄中找到。

如果您的應用程式使用 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 且包含其他設定的新應用程式設定 (例如 -Xms512m -Xmx1204m)。

在 Azure 入口網站中,於 Web 應用程式的 [應用程式設定] 下,建立名為 CATALINA_OPTS 且包含其他設定的新應用程式設定 (例如 -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 組建檔案

注意

記錄中的 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 位元的 JVM,您無法加以設定。

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

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

叢集

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 執行個體會取得叢集成員資格檔案上的讀取/寫入權限。 其他執行個體則會讀取檔案、尋找主要節點,並與要納入叢集中並新增至檔案的該節點協調。

注意

您可以在應用程式啟動期間清除過時的探索檔案,以避免 JBOSS 叢集逾時

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

自動調整規則

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

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

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

App Service 方案

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

Tomcat 基準設定

注意

本節僅適用於 Linux。

如果 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 網頁伺服器預設設定在內的詳細資訊。

此外,某些轉換會在啟動時進一步套用至 server.xml 上以便進行 Tomcat 散發。 這些是連接器、主機和閥門設定的轉換。

最新版的 Tomcat 有 server.xml (8.5.58 和 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 和 maxConnections 設定可以使用應用程式設定來微調

以下是您可以用來改變 conectionTimeout、maxThreads 或 maxConnections 值的 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
  • 連接器會使用容器的位址,而不是 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,預設值為本機 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 參考文件。