

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

本主題說明如何設定、建置和執行在 Elastic Beanstalk Tomcat 平台上執行的 Java 應用程式。

 AWS Elastic Beanstalk Tomcat 平台是一組適用於 Java Web 應用程式的[平台版本](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.java)，可在 Tomcat Web 容器中執行。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 伺服器](https://httpd.apache.org/)作為 Tomcat 平台上的代理伺服器。如果您的 Elastic Beanstalk Tomcat 環境使用 Amazon Linux AMI 平台分支 (Amazon Linux 2 之前)，您也可以選擇使用 [Apache HTTP 伺服器版本 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 會根據 Amazon Linux AMI (AL1) 將所有平台分支的狀態設定為**已淘汰**。如需有關遷移至完全支援的目前 Amazon Linux 2023 平台分支的詳細資訊，請參閱 [將您的 Elastic Beanstalk Linux 應用程式遷移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

您必須使用特定的架構，來將 Java 應用程式的套件，打包為 Web 應用程式封裝 (WAR) 格式的檔案。關於所需的架構，以及該架構與您專案目錄架構之間的關係，詳細資訊請參閱[建構您的專案資料夾](java-tomcat-platform-directorystructure.md)。

若要在同一個 Web 伺服器上執行多個應用程式，您可以[將多個 WAR 檔案打包](java-tomcat-multiple-war-files.md)為單一原始碼套件。在包含多個 WAR 原始碼的套件中，取決於 WAR 的名稱，每個應用程式會在根路徑 (`ROOT.war` 在 `myapp.elasticbeanstalk.com/` 中執行) 或根路徑之下直屬的路徑 (`app2.war` 在 `myapp.elasticbeanstalk.com/app2/` 中執行) 執行。在單一 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. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在導覽窗格中，選擇**組態**。

1. 在**更新、監控和日誌記錄**組態類別中，選擇**編輯**。

### 容器選項
<a name="java-tomcat-options-container"></a>

您可以指定這些平台特有的選項：
+ **代理伺服器** – 要在您的環境執行個體上使用的代理伺服器。預設使用 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`) 選項中輸入新的大小。此設定僅適用於 Java 7 和較舊的版本。此選項已在 JDK 8 中棄用，並由 **MaxMetaspace Size** (`-XX:MaxMetaspaceSize`) 選項取代。

**重要**  
JDK 17 移除了對 Java `-XX:MaxPermSize` 選項的支援。將此選項與具有 Corretto 17 的 Elastic Beanstalk 平台分支上執行的環境搭配使用將導致錯誤。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>

**Log Options (日誌選項)** 區段有兩個設定：
+ **執行個體設定檔** – 指定有權存取與您應用程式相關的 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 連線字串。對於非使用 Elastic Beanstalk 佈建的資料庫執行個體，請只使用 JDBC\$1CONNECTION\$1STRING。  
關於使用 Amazon RDS 與您的 Java 應用程式的詳細資訊，請參閱[將 Amazon RDS 資料庫執行個體新增至 Java Elastic Beanstalk 環境](java-rds.md)。

對於 2[025 年 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");
```

2[025 年 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 command line options (JVM 命令列選項**
  + `JVM Options` - **JVM command line 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 之前)，請閱讀本節中的其他資訊。

**備註**  
本主題中的資訊僅適用於以 Amazon 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 會根據 Amazon Linux AMI (AL1) 將所有平台分支的狀態設定為**已淘汰**。如需有關遷移至完全支援的目前 Amazon Linux 2023 平台分支的詳細資訊，請參閱 [將您的 Elastic Beanstalk Linux 應用程式遷移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### Tomcat 組態命名空間 — Amazon Linux AMI (AL1)
<a name="tomcat.alami.namespaces"></a>

Tomcat Amazon Linux AMI 平台在下列命名空間中支援其他選項：
+ `aws:elasticbeanstalk:container:tomcat:jvmoptions` - 除了此命名空間之前在此頁面上提到的選項之外，較舊的 Amazon Linux AMI 平台版本也支援：
  + `XX:MaxPermSize` - **Maximum JVM permanent generation size (JVM 永久保存區大小上限**
+ `aws:elasticbeanstalk:environment:proxy` - 除了選擇代理伺服器之外，還會設定回應壓縮。

下列組態檔案範例展示了使用代理命名空間組態選項。

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

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

### 包括 Elastic Beanstalk 組態檔案 — Amazon 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) 的詳細說明。