使用 Elastic Beanstalk Tomcat 平台 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Elastic Beanstalk Tomcat 平台

重要

Amazon Elastic Beanstalk 从适用于 Amazon Linux 1 和 Amazon Linux 2 的 Tomcat 平台中的 Amazon Linux 默认程序包存储库安装 Log4j。Amazon Linux 1 和 Amazon Linux 2 存储库中可用的 Log4j 版本在其原定设置配置中不受 CVE-2021-44228CVE-2021-45046 的影响。

如果您对应用程序使用的 log4j 进行了配置更改,或者安装了 log4j 的更新版本,我们建议您采取措施更新应用程序的代码以缓解此问题。

出于谨慎考虑,Elastic Beanstalk 在 2021 年 12 月 21 日的 Amazon Linux 平台版本中发布了使用最新 Amazon Linux 默认程序包存储库的新平台版本,其中包括 Log4j 热补丁 JDK。如果您已将 log4j 安装自定义为应用程序依赖项,我们建议您升级到最新的 Elastic Beanstalk 平台版本,以缓解 CVE-2021-44228 或 CVE-2021-45046 问题。根据常规更新实践,您还可以启用自动化的托管式更新。

有关适用于 Amazon Linux 的安全相关软件更新的更多信息,请访问 Amazon Linux 安全中心

Amazon Elastic Beanstalk Tomcat 平台是一组平台版本,用于可以在 Tomcat Web 容器中运行的 Java Web 应用程序。Tomcat 在 nginx 代理服务器后面运行。每个平台分支都对应于 Tomcat 的一个主要版本(如 Java 8 with Tomcat 8)。

Elastic Beanstalk 控制台中提供了配置选项,可用于修改运行环境的配置。要避免在终止环境时丢失环境配置,可以使用保存的配置来保存您的设置,并在以后将这些设置应用到其他环境。

要保存源代码中的设置,您可以包含配置文件。在您每次创建环境或部署应用程序时,会应用配置文件中的设置。您还可在部署期间使用配置文件来安装程序包、运行脚本以及执行其他实例自定义操作。

Elastic Beanstalk Tomcat 平台包括一个可将请求转发到应用程序的反向代理。您可以使用配置选项将代理服务器配置为从您的源代码中的某个文件夹的静态资产提供服务,以减少应用程序的负载。有关高级方案,您可以在源包中包括您自己的 .conf 文件,以扩展 Elastic Beanstalk 代理配置或完全重写它。

注意

Elastic Beanstalk 支持将 nginx(默认)和 Apache HTTP Server 作为 Tomcat 平台上的代理服务器。如果您的 Elastic Beanstalk Tomcat 环境使用 Amazon Linux AMI 平台分支(在 Amazon Linux 2 之前),则您还可以选择使用 Apache HTTP Server 2.2 版。Apache(最新版本)是这些较旧平台分支上的默认版本。

2022 年 7 月 18 日,Elastic Beanstalk 将基于 Amazon Linux AMI(AL1)的所有平台分支的状态设置为已停用有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息,请参阅 将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2

您必须在具有特定结构的 Web 应用程序存档 (WAR) 文件中打包 Java 应用程序。有关所需结构及其如何与项目目录结构相关的信息,请参阅项目文件夹结构设置

要在同一 Web 服务器上运行多个应用程序,您可以将多个 WAR 文件捆绑到同一个源包中。多 WAR 源包中的每个应用程序在根路径运行 (ROOT.warmyapp.elasticbeanstalk.com/ 运行),或者在根路径的直接下级路径运行 (app2.warmyapp.elasticbeanstalk.com/app2/ 运行),具体通过 WAR 的名称确定。在单 WAR 源包中,应用程序始终在根路径运行。

在 Elastic Beanstalk 控制台中应用的设置会覆盖配置文件中的相同设置(如果存在)。这让您可以在配置文件中包含默认设置,并使用控制台中的特定环境设置加以覆盖。有关优先顺序和其他设置更改方法的更多信息,请参阅配置选项

有关扩展 Elastic Beanstalk 基于 Linux 的平台的各种方法的详细信息,请参阅扩展 Elastic Beanstalk Linux 平台

配置 Tomcat 环境

Elastic Beanstalk Tomcat 平台除了提供所有平台都具有的标准选项之外,还提供了一些特定于平台的选项。这些选项可用于配置在环境的 Web 服务器上运行的 Java 虚拟机 (JVM),以及定义向应用程序提供信息配置字符串的系统属性。

您可以使用 Elastic Beanstalk 控制台启用到 Amazon S3 的日志轮换,并配置应用程序可从环境中读取的变量。

在 Elastic Beanstalk 控制台中配置 Tomcat 环境
  1. 打开 Elastic Beanstalk 控制台,然后在 Regions(区域)列表中选择您的 Amazon Web Services 区域。

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在导航窗格中,选择 Configuration(配置)。

  4. Updates, monitoring, and logging(更新、监控和日志记录)配置类别中,选择 Edit(编辑)。

容器选项

您可以指定以下特定于平台的选项:

  • Proxy server(代理服务器)– 要在环境实例上使用的代理服务器。默认情况下,使用 nginx。

JVM 容器选项

Java 虚拟机 (JVM) 中的堆大小决定了在垃圾收集发生之前,您的应用程序中多少个对象可以在内存中创建。您可以修改初始 JVM 堆大小 (-Xms option) 和最大 JVM 堆大小 (-Xmx) 选项。初始堆大小越大,垃圾收集发生之前可以创建的对象就越多,但这也意味着垃圾收集器将花更长的时间去压缩堆。最大堆大小指定了在占用大量内存的活动期间扩展堆时,JVM 可分配的最大内存量。

注意

可用内存取决于 Amazon EC2 实例类型。有关可用于您的 Elastic Beanstalk 环境的 EC2 实例类型的更多信息,请参阅适用于 Linux 实例的 Amazon Elastic Compute Cloud 用户指南 中的实例类型

持久代 是 JVM 堆的一部分,可存储类定义和关联的元数据。要修改持久代的大小,请在最大 JVM PermGen 大小 (-XX:MaxPermSize) 选项中键入新的大小。此设置仅适用于 Java 7 和更低版本。该选项已在 JDK 8 中弃用,并由 MaxMetaspace 大小 (-XX:MaxMetaspaceSize) 选项所取代。

重要

JDK 17 不再支持 Java -XX:MaxPermSize 选项。在 Elastic Beanstalk 平台分支(带 Corretto 17)上运行的环境中使用该选项会导致错误。Elastic Beanstalk 于 2023 年 7 月 13 日发布了首个运行 Tomcat 的平台分支(带 Corretto 17)。

有关详细信息,请参阅以下资源:

有关 Elastic Beanstalk 平台及其组件的更多信息,请参阅《Amazon Elastic Beanstalk 平台指南》中的支持的平台

日志选项

日志选项部分有两个设置:

  • Instance profile(实例配置文件)– 指定有权访问与应用程序关联的 Amazon S3 存储桶的实例配置文件。

  • Enable log file rotation to Amazon S3(启用到 Amazon S3 的日志轮换)– 指定是否将应用程序的 Amazon EC2 实例的日志文件复制到与应用程序关联的 Amazon S3 存储桶。

静态文件

为了提高性能,您可以使用 Static files(静态文件)部分配置代理服务器,以便从 Web 应用程序内的一组目录提供静态文件(例如 HTML 或图像)。对于每个目录,您都将虚拟路径设置为目录映射。当代理服务器收到对指定路径下的某个文件的请求时,它将直接提供此文件,而不是将请求路由至您的应用程序。

有关使用配置文件或 Elastic Beanstalk 控制台配置静态文件的详细信息,请参阅 提供静态文件

环境属性

Environment Properties(环境属性)部分中,您可以在运行应用程序的 Amazon EC2 实例上指定环境配置设置。环境属性会以密钥值对的形式传递到应用程序。

Tomcat 平台为 Tomcat 环境定义了一个名为 JDBC_CONNECTION_STRING 的占位符属性,用于传递连接外部数据库的连接字符串。

注意

如果您将 RDS 数据库实例附加到您的环境,请根据 Elastic Beanstalk 提供的 Amazon Relational Database Service (Amazon RDS) 环境属性动态构造 JDBC 连接字符串。JDBC_CONNECTION_STRING 只适用于不是使用 Elastic Beanstalk 预配置的数据库实例。

有关配合使用 Amazon RDS 和 Java 应用程序的更多信息,请参阅向 Java 应用程序环境中添加 Amazon RDS 数据库实例

在运行于 Elastic Beanstalk 中的 Tomcat 环境内,可通过使用 System.getProperty() 访问环境变量。例如,可以使用以下代码将名为 API_ENDPOINT 的属性读取到某个变量。

String endpoint = System.getProperty("API_ENDPOINT");

参阅 环境属性和其他软件设置 了解更多信息。

Tomcat 配置命名空间

您可以使用配置文件设置配置选项并在部署期间执行其他实例配置。配置选项可以通过您使用的 Elastic Beanstalk 服务或平台定义并组织到命名空间 中。

除了所有 Elastic Beanstalk 环境支持的选项之外,Tomcat 平台还支持以下命名空间中的选项:

  • aws:elasticbeanstalk:container:tomcat:jvmoptions – 修改 JVM 设置。此命名空间中的选项对应于管理控制台中的选项,如下所示:

    • XmsJVM 命令行选项

    • JVM OptionsJVM 命令行选项

  • aws:elasticbeanstalk:environment:proxy – 选择环境的代理服务器。

以下示例配置文件演示了特定于 Tomcat 的配置选项的使用。

例 .ebextensions/tomcat-settings.config
option_settings: aws:elasticbeanstalk:container:tomcat:jvmoptions: Xms: 512m JVM Options: '-Xmn128m' aws:elasticbeanstalk:application:environment: API_ENDPOINT: mywebapi.zkpexsjtmd.us-west-2.elasticbeanstalk.com aws:elasticbeanstalk:environment:proxy: ProxyServer: apache

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外,您还可使用控制台、保存的配置、EB CLI 或 Amazon CLI 来配置选项。参阅 配置选项 了解更多信息。

如果您的 Elastic Beanstalk Tomcat 环境使用 Amazon Linux AMI 平台版本(在 Amazon Linux 2 之前),请阅读本节中的其他信息。

注意

Tomcat Amazon Linux AMI 平台支持以下命名空间中的附加选项:

  • aws:elasticbeanstalk:container:tomcat:jvmoptions – 除了本页前面提到的这个命名空间的选项之外,较旧的 Amazon Linux AMI 平台版本还支持:

    • XX:MaxPermSize最大 JVM 持久生成大小

  • aws:elasticbeanstalk:environment:proxy – 除了选择代理服务器之外,还配置响应压缩。

以下示例配置文件展示了代理命名空间配置选项的使用。

例 .ebextensions/tomcat-settings.config
option_settings: aws:elasticbeanstalk:environment:proxy: GzipCompression: 'true' ProxyServer: nginx

要部署 .ebextensions 配置文件,请将其包含在您的应用程序源中。对于单个应用程序,将通过运行以下命令将 .ebextensions 添加到压缩的 WAR 文件:

zip -ur your_application.war .ebextensions

对于需要多个 WAR 文件的应用程序,如需更多说明,请参阅捆绑用于 Tomcat 环境的多个 WAR 文件