共用方式為


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

本文說明 Azure App Service 中 Java 應用程式的最常見部署和運行時間設定。 如果您是第一次使用 Azure App Service,您應該先閱讀 Java 快速入門。 您可以在 App Service 常見問題中找到使用 App Service 並非專屬於 Java 開發的一般問題的解答。

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

  • Java Standard Edition (SE):可以執行部署為 Java Archive (JAR) 套件的應用程式,其中包含內嵌伺服器(例如 Spring Boot、Quarkus、Dropwizard 或具有內嵌 Tomcat 或 Jetty 伺服器的應用程式)。
  • Tomcat:內建 Tomcat 伺服器可以執行部署為 Web 應用程式封存 (WAR) 套件的應用程式。
  • JBoss 企業應用程式平臺 (EAP):內建的 JBoss EAP 伺服器可以執行部署為 WAR 或企業封存 (EAR) 套件的應用程式。 支援 Linux 應用程式中包括免費、進階 v3 和隔離式方案 v2.gti 的一系列價格層。

顯示 Java 版本

若要顯示目前的 Java 版本,請在 Azure 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"

在 Linux 容器中取得 Java 版本

如需 Linux 容器中更詳細的版本資訊,請啟動容器的 SSH 連線。 以下是您可以執行的一些範例。

若要在 SSH 工作階段中檢視 Java 版本:

java -version

若要在 SSH 工作階段中檢視 Tomcat 伺服器版本:

sh /usr/local/tomcat/version.sh

或者,若是您的 Tomcat 伺服器位於自訂位置,請使用以下方式尋找:version.sh

find / -name "version.sh"

若要在 SSH 工作階段中檢視 JBoss EAP 伺服器版本:

$JBOSS_HOME/bin/jboss-cli.sh --connect --commands=:product-info

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

App Service 中過期的運行時間會發生什麼事?

維護組織已不再支持過期的執行環境,或是發現它們存在重大弱點。 因此,它們會從門戶中的建立和設定頁面中移除。 當入口網站隱藏過期的運行時間時,仍在使用該運行時間的任何應用程式會繼續執行。

如果您想要使用不再顯示在入口網站上過期的運行時間版本來建立應用程式,請使用 Azure CLI、ARM 範本或 Bicep。 這些部署替代方案可讓您建立已在主控台中移除但仍受到支援的已過時運行時間。

如果從 App Service 平臺完全移除運行時間,您的 Azure 訂用帳戶擁有者會在移除之前收到電子郵件通知。

部署應用程式

建置工具

專家

藉由使用 適用於 Azure Web Apps 的 Maven 外掛程式,您可以輕鬆地在專案根目錄中使用一個命令來準備專案:

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> 

格拉德爾

  1. 將此外掛程式新增至 ,以設定build.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 集成開發環境中提供順暢的 Java App Service 開發體驗,包括:

Kudu 和 OneDeploy API

部署用戶端,例如使用 Maven 外掛程式azure/webapps-deploy@v3 及更新版本的 GitHub Actions 或 az webapp deploy 命令,會使用 OneDeploy,這是透過在 Kudu 網站的背景系統中呼叫 /api/publish 端點來觸發。 如需有關此 API 的詳細資訊,請參閱這份文件

使用這些部署方法時,它們會自動在部署程式期間將提供的 JAR 檔案重新命名為 app.jar 。 這會放於/home/site/wwwwroot之下。 若要將 JAR 檔案部署至 Java SE,請參閱 此檔

附註

如果您使用 FTP 或舊版 ZipDeploy API 之類的替代方法,將不會叫用重新命名所提供 JAR 檔案的這個方法。 如果您在入口網站的 組態 區段中使用 啟動檔案 文本框來明確調用您的 JAR 檔案,請注意這一點。

您可以按照此文件,將 WAR 檔案部署至 Tomcat 應用程式。 使用這些上述部署方法時,它們會自動在部署過程中將提供的 War 檔案重新命名為 app.war 。 這會置於 底下 /home/site/wwwwroot ,且預設僅支援在 底下 wwwroot部署一個WAR 檔案。 此內容不會像使用 WarDeploy 等部署 API 時那樣放置在 目錄下。 為了避免檔案結構衝突發生任何問題,建議只使用一種或其他部署類型。

若要將 WAR 檔案部署至 JBoss EAP,請參閱 此檔。 使用 OneDeploy 時,這會自動將 WAR 檔案重新命名為 app.war ,並置於之下 /home/site/wwwroot

若要部署 EAR 檔案, 請使用 FTP。 您的 EAR 應用程式會部署到應用程式配置中定義的上下文根目錄。 如果您想要在根目錄路徑提供 Web 應用程式,請確定應用程式已將內容根目錄設定為根目錄路徑:<context-root>/</context-root>。 如需詳細資訊,請參閱設定 Web 應用程式的內容根目錄

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

重寫或重新導向 URL

若要重寫或重新導向 URL,請使用其中一個可用的 URL 重寫器,例如 UrlRewriteFilter

Tomcat 也提供 重寫閥

JBoss EAP 也提供 重寫閥

記錄和偵錯應用程式

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

資料流診斷記錄

您可以存取從容器產生的控制台日誌。

若要開啟容器記錄,請執行下列命令:

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

<app-name><resource-group-name>替換為適合您的網路應用程式的名稱。

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

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

如果主控台記錄未立即出現,請在30秒後再次檢查。

若要隨時停止記錄串流,請選取 Ctrl+C

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

Linux 中的 SSH 主控台存取

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

使用 az webapp ssh 命令。

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

SSH 連線

附註

您在目錄外部 /home 所做的任何變更會儲存在容器本身,且不會在應用程式重新啟動之後保存。

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

Linux 疑難排解工具

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

Java Profiler

Azure App Service 上所有 Java 運行時間都隨附 Java 開發工具包 (JDK) Flight Recorder 來分析 Java 工作負載。 您可以使用它來記錄 Java 虛擬機(JVM)、系統和應用程式事件,以及針對應用程式中的問題進行疑難解答。

若要深入瞭解 Java 分析工具,請流覽 Azure Application Insights 檔

Java 飛行紀錄器

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

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

執行下列命令,以啟動 30 秒的 JVM 錄製。 它會分析 JVM,並在主目錄中建立名為 jfr_example.jfr 的 Java Flight Recorder (JFR) 檔案。 將 116 換成您的 Java 應用程式的 PID。

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 (JMC) 。 如需如何使用 Java Mission Control 的指示,請參閱 JMC 檔和安裝指示

應用程式記錄

若要將App Service 設定為將應用程式的標準控制台輸出和標準控制台錯誤串流寫入本機檔系統或 Azure Blob 記憶體,請執行下列動作。 透過 Azure 入口網站或 Azure CLI 啟用應用程式記錄。 如果您需要較長的保留期,請將應用程式設定為將輸出寫入 Blob 記憶體容器。

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

Linux 型應用程式的 Azure Blob 記憶體記錄只能使用 Azure 監視器進行設定

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

附註

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

自訂和調整

Azure App Service 支援透過 Azure 入口網站和 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 會將 JVM 最大堆積大小設定為 App Service 方案可用記憶體總數的 70%。 若要停用預設設定,您可以使用應用程式設定WEBSITE_DISABLE_JAVA_HEAP_CONFIGURATION=“true”。

增強您應用程式在平臺上的效能,可能涉及調整堆積大小,以更符合您的特定需求。 調整應用程式堆積設定時,請檢閱您的 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 次要版本。 若要確保應用程式會在較新的次要版本上執行,請建立預備位置,並在預備位置上遞增次要版本。 確認應用程式在新的次要版本上正確執行之後,便可以交換預備位置和生產位置。

執行 JBoss CLI

在 JBoss EAP 應用程式的 SSH 工作階段中,您可以使用下列命令執行 JBoss CLI:

$JBOSS_HOME/bin/jboss-cli.sh --connect

視 JBoss EAP 在伺服器生命週期中的位置而定,您可能無法連線。 請等候幾分鐘後再試。 這種方法對於您目前伺服器狀態的快速檢查很有用(例如,若要查看數據源是否已正確設定)。

此外,您在 SSH 會話中使用 JBoss CLI 對伺服器所做的變更,在應用程式重新啟動之後不會保存。 每次應用程式啟動時,JBoss EAP 伺服器都會從全新安裝開始。 在 啟動生命周期期間,App Service 會進行必要的伺服器設定並部署應用程式。 若要在 JBoss EAP 伺服器中進行任何持續性變更,請使用 自定義啟動腳本或啟動命令。 如需端對端範例,請參閱 在 Azure App Service 中設定 Java SE、Tomcat 或 JBoss EAP 應用程式的數據源

或者,您可以手動設定 App Service 在啟動時執行任何檔案。 例如:

az webapp config set --resource-group <group-name> --name <app-name> --startup-file /home/site/scripts/foo.sh

如需您可以執行之 CLI 命令的詳細資訊,請參閱:

叢集

App Service 可針對 JBoss EAP 7.4.1 版和更新版本來支援叢集功能。 若要啟用叢集功能,您的 Web 應用程式必須與虛擬網路整合。 Web 應用程式在與虛擬網路整合時會重新啟動,而且 JBoss EAP 安裝會自動以叢集設定來啟動。 當您 使用自動調整執行多個實例時,JBoss EAP 實例會透過虛擬網路整合中指定的子網彼此通訊。 您可以使用任何值建立名為 WEBSITE_DISABLE_CLUSTERING 的應用程式設定,以停用叢集功能。

顯示虛擬網路整合 JBoss EAP App Service 應用程式的圖表,已擴增為三個執行個體。

附註

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

啟用叢集時,JBoss EAP 實例會使用 FILE_PING JGroups 探索通訊協定來探索新的實例並保存叢集資訊(例如:叢集成員、其標識碼和 IP 位址)。 在 App Service 上,這些檔案位於 /home/clusterinfo/ 底下。 第一個啟動的 EAP 執行個體會獲得叢集成員檔案的讀寫權限。 其他執行個體則會讀取檔案、尋找主要節點,並與要納入叢集中並新增至檔案的該節點協調。

附註

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

高級 V3、高級 V4 和獨立的 V2 App Service 計劃類型可以選擇性地跨可用性區域分佈,以提升對您關鍵業務工作負載的復原能力和可靠性。 此架構也稱為區域備援。 JBoss EAP 叢集功能可與區域備援功能相容。

自動調整規則

當您設定水平擴展的自動調整規則時,請務必逐步移除實例(一個接一個),以確保每個被移除的實例都可以將其活動(例如處理資料庫交易)轉移至叢集的另一個成員。 在入口網站中設定自動調整規則以調降規模時,請使用下列選項:

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

您不需要以累加方式新增實例(擴展)。 您可以一次將多個實例新增至叢集。

App Service 方案

JBoss EAP 適用於下列定價層:F1P0v3P1mv3P2mv3P3mv3P4mv3P5mv3P0v4P1mv4P2mv4P3mv4P4mv4P5mv4

JBoss EAP 伺服器生命週期

App Service 中的 JBoss EAP 應用程式在啟動伺服器之前會經歷五個不同的階段:

  1. 環境設定階段
  2. 伺服器啟動階段
  3. 伺服器設定階段
  4. 應用程式部署階段
  5. 伺服器重載階段

如需自定義的詳細數據和機會,請參閱下列各節(例如透過 應用程式設定)。

1.環境設定階段

  • SSH 服務已啟動,使用容器啟用安全 SSH 工作階段
  • Java 執行時間金鑰存放區會使用 Azure 入口網站中定義的任何公用和私人憑證來更新。
    • 公開憑證是由 目錄中的平臺 /var/ssl/certs 提供,而且會載入至 $JRE_HOME/lib/security/cacerts
    • 私人憑證是由 /var/ssl/private 目錄中的平台提供,而且會載入至 $JRE_HOME/lib/security/client.jks
  • 如果此步驟中 Java 金鑰存放區中載入任何憑證,則會將 屬性 javax.net.ssl.keyStorejavax.net.ssl.keyStorePasswordjavax.net.ssl.keyStoreType 新增至 JAVA_OPTS 環境變數。
  • 決定一些初始 JVM 組態,例如記錄目錄和 Java 記憶體堆積參數:
    • 如果您在應用程式設定 –Xms 中提供記憶體的 –XmxJAVA_OPTS 旗標,這些值會覆寫平台所提供的值。
    • 如果您設定應用程式設定 WEBSITES_CONTAINER_STOP_TIME_LIMIT,則會將值傳遞至運行時間屬性 org.wildfly.sigterm.suspend.timeout,以控制 JBoss EAP 停止時的最大關機等候時間(以秒為單位)。
  • 如果應用程式與虛擬網路整合,App Service 運行時會將一個可用於伺服器間通訊的埠清單傳遞到環境變數 WEBSITE_PRIVATE_PORTS 中,並使用 clustering 組態來啟動 JBoss EAP。 否則會使用 standalone 設定。
    • 對於 clustering 組態,將使用伺服器組態檔案 standalone-azure-full-ha.xml
    • 對於 standalone 組態,將使用伺服器組態檔案 standalone-full.xml

2.伺服器啟動階段

  • 如果 JBoss EAP 在 clustering 組態中啟動:
    • 每個 JBoss EAP 實例都會收到介於 0 與應用程式相應放大的實例數目之間的內部識別碼。
    • 如果在此伺服器實例的交易存放區路徑中找到某些檔案(使用其內部識別符),表示此伺服器實例正在取代相同的服務實例。 其他服務執行個體先前已當機,並留下未認可的交易。 伺服器已設定為繼續這些交易的工作。
  • 無論 JBoss EAP 是在clusteringstandalone組態中啟動,如果伺服器版本為 7.4 或更新版本,且運行時使用 Java 17,則會更新組態以啟用使用 Elytron 的安全子系統。
  • 如果您設定應用程式設定 WEBSITE_JBOSS_OPTS,該值會傳遞至 JBoss 啟動器文稿。 此設定可用來提供屬性檔案的路徑,以及影響 JBoss EAP 啟動的更多旗標。

3.伺服器設定階段

  • 在這個階段開始時,App Service 會先等候 JBoss EAP 伺服器和系統管理介面準備好接收要求,然後再繼續。 如果已啟用 Application Insights,此過程可能需要多花幾秒鐘的時間。

  • 當 JBoss EAP Server 和系統管理介面都就緒時,App Service 會採取下列動作:

    • 新增 JBoss EAP 模組 azure.appservice,其提供公用程式類別來記錄和與 App Service 整合。
    • 更新主控台記錄器以使用無色模式,讓記錄檔不會滿是色彩逸出序列。
    • 設定與 Azure 監視器記錄的整合。
    • 更新 Web 服務描述語言 (WSDL) 和管理介面的系結IP位址。
    • 新增 JBoss EAP 模組 azure.appservice.easyauth ,以便與 App Service 驗證 和Microsoft Entra 識別元整合。
    • 更新存取記錄的記錄組態,以及主伺服器記錄檔的名稱和輪替。
  • 除非定義應用程式設定 WEBSITE_SKIP_AUTOCONFIGURE_DATABASE ,否則 App Service 會在 App Service 應用程式設定中自動偵測 Java 資料庫連線能力 (JDBC) URL。 如果 PostgreSQL、MySQL、MariaDB、Oracle、SQL Server 或 Azure SQL Database 存在有效的 JDBC URL,它會將對應的驅動程式新增至伺服器、為每個 JDBC URL 新增數據源,並將每個數據源的 Java 命名和目錄介面 (JNDI) 名稱設定為 java:jboss/env/jdbc/<app-setting-name>_DS,其中 <app-setting-name> 是應用程式設定的名稱。

  • 如果已啟用 clustering 組態,則會檢查待設定的主控台記錄器。

  • 如果有 JAR 檔案部署至 /home/site/libs 目錄,則會使用所有這些 JAR 檔案來建立新的全域模組。

  • 在階段結束時,如果存在,App Service 就會執行自定義啟動腳本。 自訂啟動文稿的搜尋邏輯定義如下:

    • 如果您已設定啟動命令(例如,透過 Azure 入口網站或 Azure CLI),請執行它;否則
    • 如果路徑 /home/site/scripts/startup.sh 存在,請使用它,否則為
    • 如果路徑 /home/startup.sh 存在,請使用它。

自定義啟動命令或腳本會以 root 使用者身分執行(不需要 sudo),因此他們可以安裝 Linux 套件或啟動 JBoss CLI 以執行更多 JBoss EAP 的安裝和自訂命令,例如建立資料來源和安裝資源適配器。 如需Ubuntu套件管理命令的相關信息,請參閱 Ubuntu Server 檔。 如需 JBoss CLI 命令,請參閱 JBoss 管理 CLI 指南

4.應用程式部署階段

啟動文稿會依優先順序查看下列位置,將應用程式部署至 JBoss EAP:

  • 如果您已設定應用程式設定 WEBSITE_JAVA_WAR_FILE_NAME,請部署它所指定的檔案。
  • 如果 /home/site/wwwroot/app.war 存在,請加以部署。
  • 如果 中 /home/site/wwwroot存在任何其他 EAR 和 WAR 檔案,請部署它們。
  • 如果 /home/site/wwwroot/webapps 存在,請部署其中檔案和目錄。 WAR 檔案會部署為應用程式本身,而目錄會部署為「已展開」(未壓縮) Web 應用程式。
  • 如果 中 /home/site/wwwroot有任何獨立 JSP 頁面存在,請將它們複製到網頁伺服器根目錄,並將其部署為一個 Web 應用程式。
  • 如果找不到可部署的檔案,請在根內容中部署默認歡迎頁面(停車頁面)。

5.伺服器重載階段

  • 部署步驟完成後,會重載 JBoss EAP 伺服器以套用任何需要伺服器重載的變更。
  • 在伺服器重載之後,部署至 JBoss EAP 伺服器的應用程式應該已準備好回應要求。
  • 伺服器會執行,直到 App Service 應用程式停止或重新啟動為止。 您可以手動停止或重新啟動App Service應用程式,或在部署檔案或變更App Service 應用程式時觸發重新啟動。
  • 如果 JBoss EAP 伺服器在 clustering 設定中異常結束,則會執行名為 emit_alert_tx_store_not_empty 的最終函式。 函式會檢查 JBoss EAP 進程是否在磁碟留下無空交易存放區檔案。 如果是,則會在控制台中記錄錯誤: Error: finishing server with non-empty store for node XXXX。 啟動新的伺服器實例時,它會尋找這些無空交易存放區檔案以繼續工作(請參閱 2。伺服器啟動階段)。

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
  • connectionTimeout 設定為 WEBSITE_TOMCAT_CONNECTION_TIMEOUT,其預設值為 240000
  • maxThreads 設定為 WEBSITE_CATALINA_MAXTHREADS,其預設值為 200
  • maxConnections 設定為 WEBSITE_CATALINA_MAXCONNECTIONS,其預設值為 10000

附註

connectionTimeoutmaxThreadsmaxConnections 設定可以使用應用程式設定來調整。

以下是可用來改變、 connectionTimeoutmaxThreads值的 maxConnectionsCLI 命令範例:

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 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,其預設值為 7。 此值與應用程式記錄平台預設值一致。

在 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 參考文件。