

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

# 使用 Elastic Beanstalk Tomcat 平台
<a name="java-tomcat-platform"></a>

本主题介绍如何配置、构建和运行在 Elastic Beanstalk Tomcat 平台上运行的 Java 应用程序。

 AWS Elastic Beanstalk Tomcat 平台是一组可以在 Tomcat Web 容器中运行的 Java Web 应用程序的[平台版本](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.java)。Tomcat 在 nginx 代理服务器后面运行。每个平台分支对应 Tomcat 的一个主要版本。

Elastic Beanstalk 控制台中提供了配置选项，可用于[修改运行环境的配置](environment-configuration-methods-after.md)。要避免在终止环境时丢失环境配置，可以使用[保存的配置](environment-configuration-savedconfig.md)来保存您的设置，并在以后将这些设置应用到其他环境。

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

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

**注意**  
Elastic Beanstalk 支持将 [nginx](https://www.nginx.com/)（默认）和 [Apache HTTP Server](https://httpd.apache.org/) 作为 Tomcat 平台上的代理服务器。如果您的 Elastic Beanstalk Tomcat 环境使用 Amazon Linux AMI 平台分支（在 Amazon Linux 2 之前），则您还可以选择使用 [Apache HTTP Server 2.2 版](https://httpd.apache.org/docs/2.2/)。Apache（最新版本）是这些较旧平台分支上的默认版本。  
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

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

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

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

有关扩展 Elastic Beanstalk 基于 Linux 的平台的各种方法的详细信息，请参阅[扩展 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。

**Topics**
+ [配置 Tomcat 环境](#java-tomcat-options)
+ [Tomcat 配置命名空间](#java-tomcat-namespaces)
+ [捆绑用于 Tomcat 环境的多个 WAR 文件](java-tomcat-multiple-war-files.md)
+ [项目文件夹结构设置](java-tomcat-platform-directorystructure.md)
+ [配置代理服务器](java-tomcat-proxy.md)

## 配置 Tomcat 环境
<a name="java-tomcat-options"></a>

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

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

**在 Elastic Beanstalk 控制台中配置 Tomcat 环境**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration**（配置）。

1. 在 **Updates, monitoring, and logging**（更新、监控和日志记录）配置类别中，选择 **Edit**（编辑）。

### 容器选项
<a name="java-tomcat-options-container"></a>

您可以指定以下特定于平台的选项：
+ **Proxy server**（代理服务器）– 要在环境实例上使用的代理服务器。默认情况下，使用 nginx。

### JVM 容器选项
<a name="java-tomcat-options-jvm"></a>

Java 虚拟机 (JVM) 中的堆大小决定了在*[垃圾收集](https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/introduction.html)*发生之前，您的应用程序中多少个对象可以在内存中创建。您可以修改**初始 JVM 堆大小** (`-Xms option`) 和**最大 JVM 堆大小** (`-Xmx`) 选项。初始堆大小越大，垃圾收集发生之前可以创建的对象就越多，但这也意味着垃圾收集器将花更长的时间去压缩堆。最大堆大小指定了在占用大量内存的活动期间扩展堆时，JVM 可分配的最大内存量。

**注意**  
可用内存取决于 Amazon EC2 实例类型。有关可用于您的 Elastic Beanstalk 环境的 EC2 实例类型的更多信息，请参阅*适用于 Linux 实例的 Amazon Elastic Compute Cloud 用户指南* 中的[实例类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。

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

**重要**  
JDK 17 不再支持 Java `-XX:MaxPermSize` 选项。在 Elastic Beanstalk 平台分支（带 Corretto 17）上运行的环境中使用该选项会导致错误。Elastic Beanstalk 于 [2023 年 7 月 13 日](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2023-07-13-al2023.html)发布了首个运行 Tomcat 的平台分支（带 Corretto 17）。  
有关详细信息，请参阅以下资源：  
Oracle Java 文档网站：[移除的 Java 选项](https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html#removed-java-options) 
Oracle Java 文档网站：[其他注意事项](https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html)中的*类元数据*部分

有关 Elastic Beanstalk 平台及其组件的更多信息，请参阅《AWS Elastic Beanstalk 平台指南》**中的[支持的平台](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html)。

### 日志选项
<a name="java-tomcat-options-logs"></a>

**日志选项**部分有两个设置：
+ **Instance profile**（实例配置文件）– 指定有权访问与应用程序关联的 Amazon S3 存储桶的实例配置文件。
+ **Enable log file rotation to Amazon S3**（启用到 Amazon S3 的日志轮换）– 指定是否将应用程序的 Amazon EC2 实例的日志文件复制到与应用程序关联的 Amazon S3 存储桶。

### 静态文件
<a name="java-tomcat-options-staticfiles"></a>

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

有关使用配置文件或 Elastic Beanstalk 控制台配置静态文件的详细信息，请参阅 [提供静态文件](environment-cfg-staticfiles.md)。

### 环境属性
<a name="java-tomcat-options-properties"></a>

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

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

**注意**  
如果您将 RDS 数据库实例附加到您的环境，请根据 Elastic Beanstalk 提供的 Amazon Relational Database Service (Amazon RDS) 环境属性动态构造 JDBC 连接字符串。JDBC\$1CONNECTION\$1STRING 只适用于不是使用 Elastic Beanstalk 预配置的数据库实例。  
有关配合使用 Amazon RDS 和 Java 应用程序的更多信息，请参阅[将 Amazon RDS DB 实例添加到 Java Elastic Beanstalk 环境](java-rds.md)。

对于在 [2025 年 3 月 26 日](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2025-03-26-windows.html)之前发布的 Tomcat 平台版本，可以使用 `System.getProperty()` 访问环境变量。例如，可以使用以下代码从某个变量读取名为 `API_ENDPOINT` 的属性。

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

[2025 年 3 月 26 日](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2025-03-26-windows.html)或之后发布的 Tomcat 平台版本也可以使用 `System.getenv` 来访问纯文本环境变量。您可以继续使用 `System.getProperty` 访问纯文本环境变量。但是，[作为密钥存储的环境变量](AWSHowTo.secrets.env-vars.md)只能使用 `System.getenv` 获取。例如，可以使用以下代码读取名为 `API_KEY` 的环境变量。

```
String apiKey = System.getenv("API_KEY");
```

**重要**  
在 [2025 年 3 月 26 日](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2025-03-26-windows.html)或之后发布的 Tomcat 平台版本中增加了对环境变量的 `System.getenv()` 访问权限，在环境变量优先于 Java 系统属性的应用程序中或在明确地从 `System.getProperty()` 切换为 `System.getenv()` 时，这可能会导致意外行为。  
由于系统属性（通过命令行传递）需要对特殊字符进行 Shell 转义，而环境变量则不需要，因此在使用环境变量而非 Java 系统属性时，值的解析方式可能会有所不同。  
如果您的应用程序受到影响，请考虑：  
在使用 `System.getenv()` 时从环境属性值中移除转义字符
将您的应用程序配置为明确使用 `System.getProperty()`
在升级时对应用程序进行全面测试，以确保行为一致

参阅 [环境变量和其他软件设置](environments-cfg-softwaresettings.md) 了解更多信息。

## Tomcat 配置命名空间
<a name="java-tomcat-namespaces"></a>

您可以使用[配置文件](ebextensions.md)设置配置选项并在部署期间执行其他实例配置。配置选项可以[特定于平台](command-options-specific.md)，也可以应用于整个 Elastic Beanstalk 服务中的[所有平台](command-options-general.md)。配置选项被组织到*命名空间*中。

除了[所有 Elastic Beanstalk 环境支持的选项](command-options-general.md)之外，Tomcat 平台还支持以下命名空间中的选项：
+ `aws:elasticbeanstalk:container:tomcat:jvmoptions` – 修改 JVM 设置。此命名空间中的选项对应于管理控制台中的选项，如下所示：
  + `Xms` – **JVM 命令行选项**
  + `JVM Options` – **JVM 命令行选项**
+ `aws:elasticbeanstalk:environment:proxy` – 选择环境的代理服务器。

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

**Example .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 或 AWS CLI来配置选项。参阅 [配置选项](command-options.md) 了解更多信息。

## Amazon Linux AMI（在 Amazon Linux 2 之前）的 Tomcat 平台
<a name="tomcat.alami"></a>

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

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### Tomcat 配置命名空间 — 亚马逊 Linux AMI () AL1
<a name="tomcat.alami.namespaces"></a>

Tomcat Amazon Linux AMI 平台支持以下命名空间中的附加选项：
+ `aws:elasticbeanstalk:container:tomcat:jvmoptions` – 除了本页前面提到的这个命名空间的选项之外，较旧的 Amazon Linux AMI 平台版本还支持：
  + `XX:MaxPermSize` – **最大 JVM 持久生成大小**
+ `aws:elasticbeanstalk:environment:proxy` – 除了选择代理服务器之外，还配置响应压缩。

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

**Example .ebextensions/tomcat-settings.config**  

```
option_settings:
  aws:elasticbeanstalk:environment:proxy:
    GzipCompression: 'true'
    ProxyServer: nginx
```

### 包括 Elastic Beanstalk 配置文件 — 亚马逊 Linux AMI () AL1
<a name="java-tomcat-ebextensions"></a>

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

**Example**  

```
zip -ur your_application.war .ebextensions
```

对于需要多个 WAR 文件的应用程序，如需更多说明，请参阅[捆绑用于 Tomcat 环境的多个 WAR 文件](java-tomcat-multiple-war-files.md)。