在 Azure 应用服务中部署和配置 Java SE、Tomcat 或 JBoss EAP 应用

本文介绍 Azure 应用服务中 Java 应用的最常见部署和运行时配置。 如果是第一次使用 Azure 应用服务,则应首先阅读 Java 快速入门。 可以在 应用服务常见问题解答中找到有关使用应用服务(不特定于 Java 开发)的一般问题的解答。

Azure 应用服务以三种形式在完全托管的服务上运行 Java Web 应用程序:

  • Java Standard Edition (SE):可以运行部署为 Java 存档 (JAR) 包的应用,其中包含嵌入式服务器(例如 Spring Boot、Quarkus、Dropwizard 或具有嵌入式 Tomcat 或 Jetty 服务器的应用)。
  • Tomcat:内置 Tomcat 服务器可以运行部署为 Web 应用程序存档(WAR)包的应用。
  • JBoss Enterprise 应用程序平台(EAP):内置的 JBoss EAP 服务器可以运行部署为 WAR 或企业存档(EAR)包的应用。 在一组定价层(包括免费、高级 v3 和独立 v2.gti)中支持 Linux 应用

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

有关版本支持的详细信息,请参阅应用服务语言运行时支持策略

应用服务中的过时运行时将如何处理?

过时的运行时被维护组织弃用,或者被发现存在重大漏洞。 因此,将从门户中的创建和配置页面中删除它们。 当门户中隐藏了过时的运行时后,任何仍使用该运行时的应用程序都会继续运行。

如果要创建具有门户上不再显示的过时运行时版本的应用,请使用 Azure CLI、ARM 模板或 Bicep。 通过这些部署替代方法,可以创建已在门户中移除的但仍受支持的弃用运行时。

如果从应用服务平台完全删除运行时,Azure 订阅所有者会在删除之前收到电子邮件通知。

部署应用

构建工具

行家

通过使用 适用于 Azure Web 应用的 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. 通过将适用于 Azure Web 应用的 Gradle 插件添加到 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 应用服务开发体验,包括:

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 文件。 这不会像使用部署 API(如 WarDeploy)时看到的那样放置在 /home/site/wwwroot/webapps 目录下。 为了避免文件结构冲突的任何问题,建议只使用一种或其他部署类型。

若要将 WAR 文件部署到 JBoss EAP,请参阅 本文档。 使用 OneDeploy 时,这会自动将 WAR 文件重命名为 app.war 并放置在其中 /home/site/wwwroot

若要部署 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 应用的最佳选项。

重写或重定向 URL

若要重写或重定向 URL,请使用某个可用的 URL 重写程序,例如 UrlRewriteFilter

Tomcat 还提供重写阀

JBoss EAP 还提供 重写阀

日志记录和调试应用

可以通过 Azure 门户对每个应用使用性能报告、流量可视化和运行状况检查。 有关详细信息,请参阅 Azure 应用服务诊断概述

流式传输诊断日志

可以访问在容器中生成的控制台日志。

若要打开容器日志记录,请运行以下命令:

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

<app-name><resource-group-name>替换为适合您 Web 应用的名称。

启用容器日志记录后,运行以下命令以查看日志流:

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

如果未立即显示控制台日志,请在 30 秒内再次检查。

若要随时停止日志流式处理,请选择 Ctrl+C

也可通过浏览器在 https://<app-name>.scm.azurewebsites.net/api/logs/docker 中检查日志文件。 对于最近创建的应用,请使用 https://<app-name>-<random-hash>.scm.<region>.azurewebsites.net/

有关详细信息,请参阅在 Cloud Shell 中流式传输日志

Linux 中的 SSH 控制台访问

若要打开与容器的直接 SSH 会话,应用应正在运行。

将以下 URL 粘贴到浏览器中,并将应用名称<替换为>应用名称:

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

如果尚未进行身份验证,则需通过要连接的 Azure 订阅进行身份验证。 完成身份验证以后,可以看到一个浏览器内 shell,可以在其中的容器中运行命令。

SSH 连接

注意

在目录外部 /home 所做的任何更改都存储在容器本身中,并且不会在应用重启之后保留。

若要从本地计算机打开远程 SSH 会话,请参阅从远程 shell 打开 SSH 会话

Linux 故障排除工具

内置的 Java 映像建立在 Alpine Linux 操作系统上。 使用 apk 包管理器安装任何故障排除工具或命令。

Java 分析器

Azure 应用服务上的所有 Java 运行时都附带 Java 开发工具包 (JDK) 飞行记录器,用于分析 Java 工作负载。 可以使用它来记录 Java 虚拟机(JVM)、系统和应用程序事件,以及排查应用程序中的问题。

若要了解有关 Java 探查器的详细信息,请访问 Azure Application Insights 文档

Java 飞行记录器

应用服务上的所有 Java 运行时都自带 Java Flight Recorder。 可以使用它记录 JVM、系统和应用程序事件,以及解决 Java 应用程序中的问题。

通过 SSH 连接到应用服务并运行 jcmd 命令以查看运行的所有 Java 进程的列表。 除了 jcmd 本身,你还会看到正在运行的 Java 应用程序以及进程 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

执行以下命令以启动 JVM 的 30 秒录制。 它会分析JVM,并在主目录中创建一个名为jfr_example.jfr的Java飞行记录器(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 文档安装说明

应用日志记录

若要将应用服务配置为将应用程序的标准控制台输出和标准控制台错误流写入本地文件系统或 Azure Blob 存储,请执行以下作。 通过 Azure 门户或 Azure CLI 启用应用程序日志记录。 如果需要更长的保留期,请将应用程序配置为将输出写入 Blob 存储容器。

可以在目录中找到 /home/LogFiles/Application/ Java 和 Tomcat 应用日志。

只能使用 Azure Monitor 配置基于 Linux 的应用的 Azure Blob 存储日志记录。

如果应用程序使用 LogbackLog4j 进行跟踪,则可以将这些跟踪转发到 Azure Application Insights 中以供查看。 使用日志记录框架配置说明,参考Application Insights 中的探索 Java 跟踪日志

注意

由于已知漏洞 CVE-2021-44228,请务必使用 Log4j 版本 2.16 或更高版本。

自定义和优化

Azure 应用服务原生支持通过 Azure 门户和 Azure CLI 进行优化和自定义。 请查看以下文章了解非特定于 Java 的 Web 应用配置:

在本地复制应用内容

将应用设置 JAVA_COPY_ALL 设为 true,以便将应用内容从共享文件系统复制到本地工作节点。 此设置有助于解决文件锁定问题。

设置 Java 运行时选项

若要设置分配的内存或其他 JVM 运行时选项,请使用这些选项创建名为 JAVA_OPTS。 应用服务在启动时,会将此设置作为环境变量传递给 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 服务上使用 Tomcat 时,无需创建 web.config 文件。

默认情况下,应用服务会将 JVM 最大堆大小设置为应用服务计划可用的总内存的 70%。 若要禁用默认设置,可以使用应用设置WEBSITE_DISABLE_JAVA_HEAP_CONFIGURATION=“true”。

增强应用程序在平台上的性能可能涉及调整堆大小,以更好地满足特定需求。 优化应用程序堆设置时,请查看应用服务计划详细信息,并考虑多个应用程序和部署槽的要求来查找最佳内存分配。

启用 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 的新应用设置。

或者,可以使用应用服务 Maven 插件配置应用设置。 在插件配置中添加设置名称和值标记:

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

预编译 JSP 文件

要提高 Tomcat 应用程序的性能,可以先编译 JSP 文件,再部署到应用服务。 可以使用 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 路径,应用服务使用它来检查容器能否为请求提供服务。 404 响应指示路径不存在,它向应用服务发出信号,表明容器正常运行并已准备好响应请求。

选择 Java 运行时版本

应用服务允许用户选择 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 服务器都会以干净安装开始。 在启动生命周期期间,应用服务会进行必要的服务器配置并部署应用。 若要在 JBoss EAP 服务器中进行任何持久更改,请使用 自定义启动脚本或启动命令。 有关端到端示例,请参阅 在 Azure 应用服务中为 Java SE、Tomcat 或 JBoss EAP 应用配置数据源

也可手动配置应用服务,以在启动时运行任何文件。 例如:

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

有关可以运行的 CLI 命令的详细信息,请参阅:

群集

应用服务支持 JBoss EAP 7.4.1 及更高版本的群集。 若要启用群集,Web 应用必须与虚拟网络集成。 当 Web 应用与虚拟网络集成时,它会重启,JBoss EAP 安装会以集群配置自动启动。 运行具有自动缩放功能的多个实例时,JBoss EAP 实例会通过虚拟网络集成中指定的子网相互通信。 可以通过创建名为 WEBSITE_DISABLE_CLUSTERING 的具有任何值的应用设置来禁用群集。

展示一个集成了虚拟网络的 JBoss EAP 应用服务应用的关系图,该应用扩展至三个实例。

注意

如果要启用与 ARM 模板的虚拟网络集成,需要手动将属性 vnetPrivatePorts 设置为值 2。 如果从 CLI 或门户启用虚拟网络集成,则会自动设置此属性。

启用群集后,JBoss EAP 实例使用 FILE_PING JGroups 发现协议发现新实例并保留群集信息(例如:群集成员、其标识符及其 IP 地址)。 在应用服务上,这些文件位于 /home/clusterinfo/ 下。 要启动的第一个 EAP 实例会获取对群集成员身份文件的读/写权限。 其他实例会读取文件,查找主节点,并与要包含在群集中并添加到文件中的节点进行协调。

注意

通过在 应用启动期间清理过时的发现文件,可以避免 JBoss EAP 群集超时。

高级 V3、高级 V4 和独立 V2 应用服务计划类型可以选择分布在可用性区域,以提高业务关键型工作负荷的复原和可靠性。 此体系结构也称为区域冗余。 JBoss EAP 群集功能与区域冗余功能兼容。

自动缩放规则

为水平缩放配置自动缩放规则时,请务必以增量方式(一次一个)删除实例,以确保每个已删除的实例都可以将其活动(例如处理数据库事务)传输到群集的另一个成员。 在门户中配置自动缩放规则以缩减时,请使用以下选项:

  • 操作:“计数递减量”
  • 冷却:“5 分钟”或更长时间
  • 实例计数:1

无需以增量方式添加实例(横向扩展)。 一次可以向群集添加多个实例。

应用服务计划

JBoss EAP 在以下定价层中可用:F1P0v3P1mv3P2mv3P3mv3P4mv3P5mv3P0v4P1mv4P2mv4P3mv4P4mv4P5mv4

JBoss EAP 服务器生命周期

应用服务中的 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.keyStorePassword以及javax.net.ssl.keyStoreType添加到JAVA_OPTS环境变量中。
  • 确定一些初始 JVM 配置,例如日志记录目录和 Java 内存堆参数:
    • 如果在应用设置 –Xms 中为内存提供 –XmxJAVA_OPTS 标志,则这些值会替代平台提供的值。
    • 如果配置应用设置 WEBSITES_CONTAINER_STOP_TIME_LIMIT,该值将传递给运行时属性,该属性 org.wildfly.sigterm.suspend.timeout控制 JBoss EAP 停止时的最大关闭等待时间(以秒为单位)。
  • 如果应用与虚拟网络集成,应用服务运行时将传递一个端口列表,用于环境变量 WEBSITE_PRIVATE_PORTS 中的服务器间通信,并使用 clustering 配置启动 JBoss EAP。 否则,将会使用 standalone 配置。
    • 对于clustering配置,将使用服务器配置文件standalone-azure-full-ha.xml
    • 对于standalone配置,将使用服务器配置文件standalone-full.xml

2.服务器启动阶段

  • clustering 配置中启动 JBoss EAP 时:
    • 每个 JBoss EAP 实例接收一个介于 0 和应用横向扩展到的实例数之间的内部标识符。
    • 如果在此服务器实例的事务存储路径中找到某些文件(使用其内部标识符),则表示此服务器实例正在取代相同的服务实例。 另一个服务实例以前崩溃过,并将未提交的事务抛在脑后。 服务器配置为继续在这些事务上进行的工作。
  • 无论 JBoss EAP 是否在配置中clusteringstandalone启动,如果服务器版本为 7.4 或更高版本,并且运行时使用 Java 17,则会更新配置以启用 Elytron 子系统以实现安全性。
  • 如果配置应用设置 WEBSITE_JBOSS_OPTS,该值将传递给 JBoss 启动器脚本。 此设置可用于提供属性文件的路径以及影响 JBoss EAP 启动的更多标志。

3.服务器配置阶段

  • 在此阶段开始时,应用服务首先等待 JBoss EAP 服务器和管理员接口准备好接收请求,然后再继续。 如果启用了 Application Insights,此过程可能需要几秒钟时间。

  • 当 JBoss EAP 服务器和管理员界面都准备就绪时,应用服务将执行以下作:

    • 添加 JBoss EAP 模块,该模块 azure.appservice提供用于日志记录和与应用服务集成的实用工具类。
    • 更新控制台记录器以使用无色模式,使日志文件不会充满颜色转义序列。
    • 设置与 Azure Monitor 日志的集成。
    • 更新 Web 服务描述语言(WSDL)和管理接口的绑定 IP 地址。
    • 添加 JBoss EAP 模块azure.appservice.easyauth,以便与应用服务身份验证集成,并与 Microsoft Entra ID。
    • 更新访问日志的日志记录配置以及主服务器日志文件的名称和轮换。
  • 除非定义了应用设置 WEBSITE_SKIP_AUTOCONFIGURE_DATABASE ,否则应用服务会自动检测应用服务应用设置中的 Java 数据库连接 (JDBC) URL。 如果 PostgreSQL、MySQL、MariaDB、Oracle、SQL Server 或 Azure SQL 数据库存在有效的 JDBC URL,则将相应的驱动程序添加到服务器,为每个 JDBC URL 添加数据源,并将每个数据源的 Java 命名和目录接口(JNDI)名称设置为 java:jboss/env/jdbc/<app-setting-name>_DS其中 <app-setting-name> 应用设置的名称。

  • 如果启用了 clustering 配置,则会检查要配置的控制台记录器。

  • 如果已将 JAR 文件部署到 /home/site/libs 目录,则会使用所有这些 JAR 文件创建新的全局模块。

  • 在该阶段结束时,应用服务会运行自定义启动脚本(如果存在)。 自定义启动脚本的搜索逻辑定义如下:

    • 如果配置了启动命令(例如,通过 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 服务器根目录,并将其部署为一个 Web 应用。
  • 如果未找到可部署的文件,请在根上下文中部署默认欢迎页(停车页)。

5.服务器重新加载阶段

  • 部署步骤完成后,将重新加载 JBoss EAP 服务器以应用需要服务器重新加载的任何更改。
  • 服务器重新加载后,部署到 JBoss EAP 服务器的应用程序应准备好响应请求。
  • 服务器会一直运行,直到应用服务应用停止或重启。 可以手动停止或重启应用服务应用,也可以在部署文件或对应用服务应用进行配置更改时触发重启。
  • 如果 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 开发人员了解 server.xml 文件和 Tomcat 的配置详细信息,他们就可以自信地自定义服务器设置、排查问题并将应用程序部署到 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 Web 服务器的默认配置。

此外,在启动 Tomcat 发行版时,还会在 server.xml 之上进一步应用某些转换。 这些转换包括 连接器主机阀门 设置的更改。

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设置。

以下是一些示例 CLI 命令,您可以用于更改 connectionTimeoutmaxThreadsmaxConnections 的值:

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 参考文档。