

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

# 使用 Elastic Beanstalk 部署 Java 应用程序
<a name="create_deploy_Java"></a>

本章提供有关配置和部署您的 Java 应用程序的说明 AWS Elastic Beanstalk。Elastic Beanstalk 让您能够使用 Amazon Web Services 轻松部署、管理和扩展 Java Web 应用程序。

您可以使用 Elastic Beanstalk 命令行界面（EB CLI）或 Elastic Beanstalk 控制台在几分钟内部署您的应用程序。部署 Elastic Beanstalk 应用程序后，您可以继续使用 EB CLI 来管理您的应用程序和环境，也可以使用 Elastic Beanstalk 控制台或。 AWS CLI APIs

按照 step-by-step说明[QuickStart 适用于 Java](java-quickstart.md)使用 EB CLI 创建和部署 *Hello World* Java Web 应用程序。如果您对创建简单 *Hello World* Java Java JSP 应用程序的 step-by-step说明感兴趣，以便使用 EB CLI 部署到我们基于 Tomcat 的平台，请尝试。[QuickStart 在 Tomcat 上使用 Java](tomcat-quickstart.md)

**Java 平台分支**  
AWS Elastic Beanstalk 支持两个用于 Java 应用程序的平台。
+ **Tomcat** — 一个基于 *Apache Tomcat 的平台，Apache Tomcat* 是一个开源 Web 容器，适用于使用 Java servlet 和 P JavaServer ages (JSPs) 来处理 HTTP 请求的应用程序。Tomcat 通过提供多线程、声明性安全配置和丰富的自定义功能来帮助开发 Web 应用程序。Elastic Beanstalk 为 Tomcat 当前的每个主要版本提供平台分支。有关更多信息，请参阅 [Tomcat 平台](java-tomcat-platform.md)。
+ **Java SE** — 一个用于不使用 Web 容器或不使用 Tomcat 之外的容器的应用程序的平台，例如 Jetty 或。 GlassFish您可以将应用程序使用的任何 Java Archiv JARs es () 库包含在部署到 Elastic Beanstalk 的源包中。有关更多信息，请参阅 [Java SE 平台](java-se-platform.md)。

Tomcat 和 Java SE 平台的最新分支都基于亚马逊 Linux 2 及更高版本，并使用 Cor * AWS ret* to（Java SE 发行版）。这些平台分支的名称中包含 *Corretto* 一词，而不是 *Java*。

有关当前平台版本的列表，请参阅《AWS Elastic Beanstalk 平台》**指南中的 [Tomcat](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.java) 和 [Java SE](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.javase)。

**AWS 工具**  
AWS 提供了多种用于使用 Java 和 Elastic Beanstalk 的工具。无论您选择哪个平台分支，都可以使用[AWS 适用于 Java 的 SDK](java-development-environment.md#java-development-environment-sdk) 在 Java 应用程序中使用其他 AWS 服务。 AWS 适用于 Java 的 SDK 是一组库，允许您 AWS APIs 从应用程序代码中使用，而无需从头开始编写原始 HTTP 调用。

如果您希望从命令行管理应用程序，请安装 [Elastic Beanstalk 命令行界面](eb-cli3.md)（EB CLI）并使用它来创建、监控和管理您的 Elastic Beanstalk 环境。如果您为应用程序运行多个环境，则 EB CLI 可与 Git 集成，以使您可以将每个环境与不同 Git 分支关联。

**Topics**
+ [

# QuickStart: 将 Java 应用程序部署到 Elastic Beanstalk
](java-quickstart.md)
+ [

# QuickStart: 将适用于 Tomcat 的 Java JSP Web 应用程序部署到 Elastic Beanstalk
](tomcat-quickstart.md)
+ [

# 设置 Java 开发环境
](java-development-environment.md)
+ [

# 更多适用于 Java 的 Elastic Beanstalk 示例应用程序和教程
](java-getstarted.md)
+ [

# 使用 Elastic Beanstalk Tomcat 平台
](java-tomcat-platform.md)
+ [

# 使用 Elastic Beanstalk Java SE 平台
](java-se-platform.md)
+ [

# 将 Amazon RDS DB 实例添加到 Java Elastic Beanstalk 环境
](java-rds.md)
+ [

# Java 工具和资源
](create_deploy_Java.resources.md)

# QuickStart: 将 Java 应用程序部署到 Elastic Beanstalk
<a name="java-quickstart"></a>

本 QuickStart 教程将引导您完成创建 Java 应用程序并将其部署到 AWS Elastic Beanstalk 环境的过程。

**不用于生产用途**  
示例仅用于演示。请勿在生产环境中使用示例应用程序。

**Topics**
+ [

## 你的 AWS 账户
](#java-quickstart-aws-account)
+ [

## 先决条件
](#java-quickstart-prereq)
+ [

## 步骤 1：创建 Java 应用程序
](#java-quickstart-create-app)
+ [

## 步骤 2：在本地运行应用程序
](#java-quickstart-run-local)
+ [

## 步骤 3：使用 EB CLI 部署 Java 应用程序
](#java-quickstart-deploy)
+ [

## 步骤 4：在 Elastic Beanstalk 上运行应用程序
](#java-quickstart-run-eb-ap)
+ [

## 第 5 步：清理
](#java-tutorial-cleanup)
+ [

## AWS 您的应用程序的资源
](#java-quickstart-eb-resources)
+ [

## 后续步骤
](#java-quickstart-next-steps)
+ [

## 使用 Elastic Beanstalk 控制台进行部署
](#java-quickstart-console)

## 你的 AWS 账户
<a name="java-quickstart-aws-account"></a>

如果您还不是 AWS 客户，则需要创建一个 AWS 帐户。注册后，您就可以访问 Elastic Beanstalk AWS 和其他所需的服务。

如果您已经有一个 AWS 帐户，则可以继续前进[先决条件](#java-quickstart-prereq)。

### 创建一个 AWS 账户
<a name="java-quickstart-aws-account-procedure"></a>

#### 注册获取 AWS 账户
<a name="sign-up-for-aws"></a>

如果您没有 AWS 账户，请完成以下步骤来创建一个。

**报名参加 AWS 账户**

1. 打开[https://portal.aws.amazon.com/billing/注册。](https://portal.aws.amazon.com/billing/signup)

1. 按照屏幕上的说明操作。

   在注册时，将接到电话或收到短信，要求使用电话键盘输入一个验证码。

   当您注册时 AWS 账户，就会创建*AWS 账户根用户*一个。根用户有权访问该账户中的所有 AWS 服务 和资源。作为最佳安全实践，请为用户分配管理访问权限，并且只使用根用户来执行[需要根用户访问权限的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

AWS 注册过程完成后会向您发送一封确认电子邮件。您可以随时前往 [https://aws.amazon.com/](https://aws.amazon.com/)并选择 “**我的账户”，查看您当前的账户活动并管理您的账户**。

#### 创建具有管理访问权限的用户
<a name="create-an-admin"></a>

注册后，请保护您的安全 AWS 账户 AWS 账户根用户 AWS IAM Identity Center，启用并创建管理用户，这样您就不会使用 root 用户执行日常任务。

**保护你的 AWS 账户根用户**

1.  选择 **Root 用户**并输入您的 AWS 账户 电子邮件地址，以账户所有者的身份登录。[AWS 管理控制台](https://console.aws.amazon.com/)在下一页上，输入您的密码。

   要获取使用根用户登录方面的帮助，请参阅《AWS 登录 用户指南》**中的 [Signing in as the root user](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 为您的根用户启用多重身份验证（MFA）。

   有关说明，请参阅 I [A *M* 用户指南中的为 AWS 账户 根用户启用虚拟 MFA 设备（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**创建具有管理访问权限的用户**

1. 启用 IAM Identity Center。

   有关说明，请参阅**《AWS IAM Identity Center 用户指南》中的[启用 AWS IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，为用户授予管理访问权限。

   有关使用 IAM Identity Center 目录 作为身份源的教程，请参阅《[用户*指南》 IAM Identity Center 目录中的使用默认设置配置AWS IAM Identity Center 用户*访问权限](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)。

**以具有管理访问权限的用户身份登录**
+ 要使用您的 IAM Identity Center 用户身份登录，请使用您在创建 IAM Identity Center 用户时发送到您的电子邮件地址的登录 URL。

  有关使用 IAM Identity Center 用户[登录的帮助，请参阅*AWS 登录 用户指南*中的登录 AWS 访问门户](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**将访问权限分配给其他用户**

1. 在 IAM Identity Center 中，创建一个权限集，该权限集遵循应用最低权限的最佳做法。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 将用户分配到一个组，然后为该组分配单点登录访问权限。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Add groups](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)。

## 先决条件
<a name="java-quickstart-prereq"></a>

为了遵循本指南中的步骤，您需要命令行终端或 Shell，以便运行命令。命令显示在列表中，以提示符（\$1）和当前目录名称（如果有）开头。

```
~/eb-project$ this is a command
this is output
```

在 Linux 和 macOS 中，您可使用您首选的 Shell 和程序包管理器。在 Windows 上，您可以[安装适用于 Linux 的 Windows 子系统](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以获取与 Windows 集成的 Ubuntu 和 Bash 版本。

### EB CLI
<a name="java-quickstart-prereq.ebcli"></a>

本教程使用 Elastic Beanstalk 命令行界面 (EB CLI)。有关安装和配置 EB CLI 的详细信息，请参阅 [使用设置脚本安装 EB CLI（推荐）](eb-cli3.md#eb-cli3-install) 和 [配置 EB CLI](eb-cli3-configuration.md)。

### Java 和 Maven
<a name="java-quickstart-prereq.runtime"></a>

如果您的本地计算机上没有安装 Amazon Corretto，则可以按照《*Amazon Corretto 用户指南*》中的[安装说明](https://docs.aws.amazon.com/corretto/latest/corretto-21-ug/amazon-linux-install.html)进行安装。

通过运行以下命令来验证您的 Java 安装。

```
~$ java -version 
```

本教程使用 Maven。按照 Apache Maven Project 网站上的[下载](https://maven.apache.org/download.cgi)和[安装](https://maven.apache.org/install.html)说明进行操作。有关 Maven 的更多信息，请参阅 Apache Maven Project 网站上的 [Maven 用户中心](https://maven.apache.org/users/index.html)：

通过运行以下命令来验证您的 Maven 安装。

```
~$ mvn -v
```

## 步骤 1：创建 Java 应用程序
<a name="java-quickstart-create-app"></a>

创建项目目录。

```
~$ mkdir eb-java
~$ cd eb-java
```

接下来，创建一个您将使用 Elastic Beanstalk 部署的应用程序。我们将创建一个 “Hello World” RESTful 网络服务。

此示例使用 [Spring Boot](https://spring.io/projects/spring-boot) 框架。此应用程序在端口 5000 上打开侦听器。Elastic Beanstalk 默认将请求转发到端口 5000 上的应用程序。

创建以下文件：

该文件创建一个简单的 Spring Boot 应用程序。

**Example `~/eb-java/src/main/java/com/example/Application.java`**  

```
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
```

该文件创建一个映射，返回我们在此处定义的字符串。

**Example `~/eb-java/src/main/java/com/example/Controller.java`**  

```
package com.example;
    
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
    
@RestController
public class Controller {
    
    @GetMapping("/")
    public String index() {
       return "Hello Elastic Beanstalk!";
    }
}
```

此文件定义 Maven 项目配置。

**Example `~/eb-java/pom.xml`**  

```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.3</version>
  </parent>

  <groupId>com.example</groupId>
  <artifactId>BeanstalkJavaExample</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <java.version>21</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>
```

此属性文件将默认端口覆盖为 5000。这是 Elastic Beanstalk 向 Java 应用程序发送流量的默认端口。

**Example `~/eb-java/application.properties`**  

```
server.port=5000
```

## 步骤 2：在本地运行应用程序
<a name="java-quickstart-run-local"></a>

使用以下命令打包您的应用程序：

```
~/eb-java$ mvn clean package
```

使用以下命令在本地运行您的应用程序：

```
~/eb-java$ java -jar target/BeanstalkJavaExample-1.0-SNAPSHOT.jar
```

在应用程序运行时，在浏览器中导航至 `http://127.0.0.1:5000/`。您应该会看到文本“Hello Elastic Beanstalk\$1”。

## 步骤 3：使用 EB CLI 部署 Java 应用程序
<a name="java-quickstart-deploy"></a>

在将您的 Java 应用程序部署到 Elastic Beanstalk 之前，让我们从目录中清理构建应用程序并创建一个 [Buildfile](java-se-buildfile.md) 和一个 [Procfile](java-se-procfile.md) 来控制如何在您的 Elastic Beanstalk 环境上构建和运行应用程序。

**准备和配置应用程序部署**

1. 清理构建的应用程序。

   ```
   ~/eb-java$ mvn clean
   ```

1. 创建 `Buildfile`。  
**Example `~/eb-java/Buildfile`**  

   ```
   build: mvn clean package
   ```

   此 `Buildfile` 指定用于构建应用程序的命令。如果您没有包括用于 Java 应用程序的 `Buildfile`，Elastic Beanstalk 不会尝试构建您的应用程序。

1. 创建 `Procfile`。  
**Example `~/eb-java/Procfile`**  

   ```
   web: java -jar target/BeanstalkJavaExample-1.0-SNAPSHOT.jar
   ```

   此 `Procfile` 指定用于运行应用程序的命令。如果您没有包括用于 Java 应用程序的 `Procfile`，则 Elastic Beanstalk 假定源包的根目录中有一个 JAR 文件，并尝试使用 `java -jar` 命令运行它。

 既然您已经设置了配置文件来构建和启动应用程序，可以部署它了。

**创建环境并部署 Java 应用程序**

1. 使用 **eb init** 命令，初始化 EB CLI 存储库。

   ```
   ~/eb-java eb init -p corretto java-tutorial --region us-east-2
           
   Application java-tutorial has been created.
   ```

   此命令创建名为 `java-tutorial` 的应用程序并配置您的本地存储库，以创建具有最新 Java 平台版本的环境。

1. （可选）再次运行 **eb init** 以配置默认密钥对，以便使用 SSH 连接到运行您的应用程序的 EC2 实例。

   ```
   ~/eb-java$ eb init
   Do you want to set up SSH for your instances?
   (y/n): y
   Select a keypair.
   1) my-keypair
   2) [ Create new KeyPair ]
   ```

   如果您已有密钥对，请选择一个，或按提示创建一个。如果您没有看到提示或需要以后更改设置，请运行 **eb init -i**。

1. 创建环境并使用 **eb create** 将应用程序部署到此环境中。Elastic Beanstalk 会自动为您的应用程序生成一个 zip 文件，并在端口 5000 上启动该文件。

   ```
   ~/eb-java$ eb create java-env
   ```

   Elastic Beanstalk 大约需要五分钟来创建您的环境。

## 步骤 4：在 Elastic Beanstalk 上运行应用程序
<a name="java-quickstart-run-eb-ap"></a>

当创建环境的过程完成后，使用 **eb open** 打开您的网站。

```
~/eb-java eb open
```

恭喜您！您已使用 Elastic Beanstalk 部署了 Java 应用程序！这将使用为应用程序创建的域名打开一个浏览器窗口。

## 第 5 步：清理
<a name="java-tutorial-cleanup"></a>

应用程序使用完毕时，您可以终止您的环境。Elastic Beanstalk AWS 会终止与您的环境关联的所有资源。

要使用 EB CLI 终止您的 Elastic Beanstalk 环境，请运行以下命令。

```
~/eb-java$ eb terminate
```

## AWS 您的应用程序的资源
<a name="java-quickstart-eb-resources"></a>

您刚刚创建了一个单实例应用程序。它可用作带有单个 EC2 实例的简单示例应用程序，因此不需要负载平衡或自动扩缩。对于单实例应用程序，Elastic Beanstalk 会创建以下资源： AWS 
+ **EC2 实例** - 配置来在您选择的平台上运行 Web 应用程序的 Amazon EC2 虚拟机。

  各平台运行一组不同的软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 nginx 作为在 Web 应用程序前处理 Web 流量的反向代理，向其转发请求、提供静态资产以及生成访问和错误日志。
+ **实例安全组** - 配置为允许端口 80 上的传入流量的 Amazon EC2 安全组。通过此资源，HTTP 流量可以从负载均衡器到达运行您的 Web 应用程序的 EC2 实例。默认情况下，其他端口不允许流量进入。
+ **Amazon S3 存储桶** – 使用 Elastic Beanstalk 时创建的源代码、日志和其他构件的存储位置。
+ **Amazon CloudWatch CloudWatch 警**报 — 两个警报，用于监控您环境中实例的负载，并在负载过高或过低时触发。警报触发后，您的 Auto Scaling 组会扩展或收缩以进行响应。
+ **CloudFormation 堆栈** — Elastic CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)查看的模板中定义。
+  **域名**-以表单形式路由到您的 Web 应用程序的域名**subdomain*。 *region*.elasticbeanstalk.com。*

Elastic Beanstalk 管理所有这些资源。当您终止环境时，Elastic Beanstalk 会终止其包含的所有资源。

## 后续步骤
<a name="java-quickstart-next-steps"></a>

有了运行应用程序的环境以后，您随时可以部署新的应用程序版本或不同的应用程序。部署新应用程序版本非常快，因为不需要配置或重新启动 EC2 实例。您还可以使用 Elastic Beanstalk 控制台探索新环境。有关详细步骤，请参阅本指南*入门*一章中的[探索您的环境](GettingStarted.md#GettingStarted.Explore)。

**尝试更多教程**  
如果您想尝试包含不同示例应用程序的其他教程，请参阅 [示例应用程序和教程](java-getstarted.md)。

部署一到两个示例应用程序并准备好开始在本地开发和运行 Java 应用程序后，请参阅 [设置 Java 开发环境](java-development-environment.md)。

## 使用 Elastic Beanstalk 控制台进行部署
<a name="java-quickstart-console"></a>

您还可以使用 Elastic Beanstalk 控制台来启动示例应用程序。有关详细步骤，请参阅本指南*入门*一章中的[创建示例应用程序](GettingStarted.md#GettingStarted.CreateApp)。

# QuickStart: 将适用于 Tomcat 的 Java JSP Web 应用程序部署到 Elastic Beanstalk
<a name="tomcat-quickstart"></a>

本教程将引导您完成使用 P JavaServer ages (JSPs) 创建简单 Java Web 应用程序的过程。如果您想要在单个 Elastic Beanstalk 环境中以 WAR 文件形式捆绑多个 Web 应用程序，请参阅 [捆绑用于 Tomcat 环境的多个 WAR 文件](java-tomcat-multiple-war-files.md)。

**不用于生产用途**  
示例仅用于演示。请勿在生产环境中使用示例应用程序。

**Topics**
+ [

## 你的 AWS 账户
](#tomcat-quickstart-aws-account)
+ [

## 先决条件
](#tomcat-quickstart-prereq)
+ [

## 步骤 1：创建 Java JSP 应用程序
](#tomcat-quickstart-create-app)
+ [

## 步骤 2：使用 EB CLI 部署 Java JSP 应用程序
](#tomcat-quickstart-deploy)
+ [

## 步骤 3：在 Elastic Beanstalk 上运行应用程序
](#tomcat-quickstart-run-eb-ap)
+ [

## 步骤 4：清除
](#go-tutorial-cleanup)
+ [

## AWS 您的应用程序的资源
](#tomcat-quickstart-eb-resources)
+ [

## 后续步骤
](#tomcat-quickstart-next-steps)
+ [

## 使用 Elastic Beanstalk 控制台进行部署
](#tomcat-quickstart-console)

## 你的 AWS 账户
<a name="tomcat-quickstart-aws-account"></a>

如果您还不是 AWS 客户，则需要创建一个 AWS 帐户。注册后，您就可以访问 Elastic Beanstalk AWS 和其他所需的服务。

如果您已经有一个 AWS 帐户，则可以继续前进[先决条件](#tomcat-quickstart-prereq)。

### 创建一个 AWS 账户
<a name="tomcat-quickstart-aws-account-procedure"></a>

#### 注册获取 AWS 账户
<a name="sign-up-for-aws"></a>

如果您没有 AWS 账户，请完成以下步骤来创建一个。

**要注册 AWS 账户**

1. 打开[https://portal.aws.amazon.com/billing/注册。](https://portal.aws.amazon.com/billing/signup)

1. 按照屏幕上的说明操作。

   在注册时，将接到电话或收到短信，要求使用电话键盘输入一个验证码。

   当您注册时 AWS 账户，就会创建*AWS 账户根用户*一个。根用户有权访问该账户中的所有 AWS 服务 和资源。作为最佳安全实践，请为用户分配管理访问权限，并且只使用根用户来执行[需要根用户访问权限的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

AWS 注册过程完成后会向您发送一封确认电子邮件。您可以随时前往 [https://aws.amazon.com/](https://aws.amazon.com/)并选择 “**我的账户”，查看当前账户活动并管理您的账户**。

#### 创建具有管理访问权限的用户
<a name="create-an-admin"></a>

注册后，请保护您的安全 AWS 账户 AWS 账户根用户 AWS IAM Identity Center，启用并创建管理用户，这样您就不会使用 root 用户执行日常任务。

**保护你的 AWS 账户根用户**

1.  选择 **Root 用户**并输入您的 AWS 账户 电子邮件地址，以账户所有者的身份登录。[AWS 管理控制台](https://console.aws.amazon.com/)在下一页上，输入您的密码。

   要获取使用根用户登录方面的帮助，请参阅《AWS 登录 用户指南》**中的 [Signing in as the root user](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 为您的根用户启用多重身份验证（MFA）。

   有关说明，请参阅 I [A *M* 用户指南中的为 AWS 账户 根用户启用虚拟 MFA 设备（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**创建具有管理访问权限的用户**

1. 启用 IAM Identity Center。

   有关说明，请参阅**《AWS IAM Identity Center 用户指南》中的[启用 AWS IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，为用户授予管理访问权限。

   有关使用 IAM Identity Center 目录 作为身份源的教程，请参阅《[用户*指南》 IAM Identity Center 目录中的使用默认设置配置AWS IAM Identity Center 用户*访问权限](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)。

**以具有管理访问权限的用户身份登录**
+ 要使用您的 IAM Identity Center 用户身份登录，请使用您在创建 IAM Identity Center 用户时发送到您的电子邮件地址的登录 URL。

  有关使用 IAM Identity Center 用户[登录的帮助，请参阅*AWS 登录 用户指南*中的登录 AWS 访问门户](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**将访问权限分配给其他用户**

1. 在 IAM Identity Center 中，创建一个权限集，该权限集遵循应用最低权限的最佳做法。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 将用户分配到一个组，然后为该组分配单点登录访问权限。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Add groups](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)。

## 先决条件
<a name="tomcat-quickstart-prereq"></a>

为了遵循本指南中的步骤，您需要命令行终端或 Shell，以便运行命令。命令显示在列表中，以提示符（\$1）和当前目录名称（如果有）开头。

```
~/eb-project$ this is a command
this is output
```

在 Linux 和 macOS 中，您可使用您首选的 Shell 和程序包管理器。在 Windows 上，您可以[安装适用于 Linux 的 Windows 子系统](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以获取与 Windows 集成的 Ubuntu 和 Bash 版本。

### EB CLI
<a name="tomcat-quickstart-prereq.ebcli"></a>

本教程使用 Elastic Beanstalk 命令行界面 (EB CLI)。有关安装和配置 EB CLI 的详细信息，请参阅 [使用设置脚本安装 EB CLI（推荐）](eb-cli3.md#eb-cli3-install) 和 [配置 EB CLI](eb-cli3-configuration.md)。

## 步骤 1：创建 Java JSP 应用程序
<a name="tomcat-quickstart-create-app"></a>

创建项目目录。

```
~$ mkdir eb-tomcat
~$ cd eb-tomcat
```

接下来，创建一个您将使用 Elastic Beanstalk 部署的应用程序。我们将创建一个“Hello World”Web 应用程序。

创建一个名为 `index.jsp` 的简单 JSP 文件。

**Example `~/eb-tomcat/index.jsp`**  

```
<html>
  <body>
    <%out.println("Hello Elastic Beanstalk!");%>
  </body>
</html>
```

## 步骤 2：使用 EB CLI 部署 Java JSP 应用程序
<a name="tomcat-quickstart-deploy"></a>

运行以下命令为此应用程序创建 Elastic Beanstalk 环境。

 

**创建环境并部署 Java JSP 应用程序**

1. 使用 **eb init** 命令，初始化 EB CLI 存储库。

   ```
   ~/eb-tomcat$ eb init -p tomcat tomcat-tutorial --region us-east-2
   ```

   此命令创建名为 `tomcat-tutorial` 的应用程序并配置您的本地存储库，以创建具有最新 Tomcat 平台版本的环境。

1. （可选）再次运行 **eb init** 以配置默认密钥对，以便使用 SSH 连接到运行您的应用程序的 EC2 实例。

   ```
   ~/eb-go$ eb init
   Do you want to set up SSH for your instances?
   (y/n): y
   Select a keypair.
   1) my-keypair
   2) [ Create new KeyPair ]
   ```

   如果您已有密钥对，请选择一个，或按提示创建一个。如果您没有看到提示或需要以后更改设置，请运行 **eb init -i**。

1. 创建环境并使用 **eb create** 将应用程序部署到此环境中。Elastic Beanstalk 会自动为您的应用程序生成一个 zip 文件，并在端口 5000 上启动该文件。

   ```
   ~/eb-tomcat$ eb create tomcat-env
   ```

   Elastic Beanstalk 大约需要五分钟来创建您的环境。

## 步骤 3：在 Elastic Beanstalk 上运行应用程序
<a name="tomcat-quickstart-run-eb-ap"></a>

当创建环境的过程完成后，使用 **eb open** 打开您的网站。

```
~/eb-tomcat$ eb open
```

恭喜您！您已使用 Elastic Beanstalk 部署了 Java JSP 应用程序！这将使用为应用程序创建的域名打开一个浏览器窗口。

## 步骤 4：清除
<a name="go-tutorial-cleanup"></a>

应用程序使用完毕时，您可以终止您的环境。Elastic Beanstalk AWS 会终止与您的环境关联的所有资源。

要使用 EB CLI 终止您的 Elastic Beanstalk 环境，请运行以下命令。

```
~/eb-tomcat$ eb terminate
```

## AWS 您的应用程序的资源
<a name="tomcat-quickstart-eb-resources"></a>

您刚刚创建了一个单实例应用程序。它可用作带有单个 EC2 实例的简单示例应用程序，因此不需要负载平衡或自动扩缩。对于单实例应用程序，Elastic Beanstalk 会创建以下资源： AWS 
+ **EC2 实例** - 配置来在您选择的平台上运行 Web 应用程序的 Amazon EC2 虚拟机。

  各平台运行一组不同的软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 nginx 作为在 Web 应用程序前处理 Web 流量的反向代理，向其转发请求、提供静态资产以及生成访问和错误日志。
+ **实例安全组** - 配置为允许端口 80 上的传入流量的 Amazon EC2 安全组。通过此资源，HTTP 流量可以从负载均衡器到达运行您的 Web 应用程序的 EC2 实例。默认情况下，其他端口不允许流量进入。
+ **Amazon S3 存储桶** – 使用 Elastic Beanstalk 时创建的源代码、日志和其他构件的存储位置。
+ **Amazon CloudWatch CloudWatch 警**报 — 两个警报，用于监控环境中实例的负载，并在负载过高或过低时触发。警报触发后，您的 Auto Scaling 组会扩展或收缩以进行响应。
+ **CloudFormation 堆栈** — Elastic CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)查看的模板中定义。
+  **域名**-以表单形式路由到您的 Web 应用程序的域名**subdomain*。 *region*.elasticbeanstalk.com。*

Elastic Beanstalk 管理所有这些资源。当您终止环境时，Elastic Beanstalk 会终止其包含的所有资源。

## 后续步骤
<a name="tomcat-quickstart-next-steps"></a>

有了运行应用程序的环境以后，您随时可以部署新的应用程序版本或不同的应用程序。部署新应用程序版本非常快，因为不需要配置或重新启动 EC2 实例。您还可以使用 Elastic Beanstalk 控制台探索新环境。有关详细步骤，请参阅本指南*入门*一章中的[探索您的环境](GettingStarted.md#GettingStarted.Explore)。

**尝试更多教程**  
如果您想尝试包含不同示例应用程序的其他教程，请参阅 [示例应用程序和教程](java-getstarted.md)。

部署一到两个示例应用程序并准备好开始在本地 Tomcat Web 容器中开发和运行 Java 应用程序后，请参阅 [设置 Java 开发环境](java-development-environment.md)。

## 使用 Elastic Beanstalk 控制台进行部署
<a name="tomcat-quickstart-console"></a>

您还可以使用 Elastic Beanstalk 控制台来启动示例应用程序。有关详细步骤，请参阅本指南*入门*一章中的[创建示例应用程序](GettingStarted.md#GettingStarted.CreateApp)。

# 设置 Java 开发环境
<a name="java-development-environment"></a>

本主题提供了设置 Java 开发环境以便在将应用程序部署到 AWS Elastic Beanstalk之前在本地对其进行测试的说明。它还引用了提供有用工具安装说明的网站。

**Topics**
+ [

## 安装 Java 开发工具包
](#java-development-environment-jdk)
+ [

## 安装 Web 容器
](#java-development-environment-tomcat)
+ [

## 下载库
](#java-development-environment-libraries)
+ [

## 安装适用于 Java 的 S AWS DK
](#java-development-environment-sdk)
+ [

## 安装 IDE 或文本编辑器
](#java-development-environment-ide)

## 安装 Java 开发工具包
<a name="java-development-environment-jdk"></a>

安装 Java 开发工具包 (JDK)。如果您没有特别的要求，请获取最新版本。从 [oracle.com](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 下载 JDK 

JDK 包括 Java 编译器，您可以使用它将源文件构建为可在 Elastic Beanstalk Web 服务器上执行的类文件。

## 安装 Web 容器
<a name="java-development-environment-tomcat"></a>

如果您还没有其他 Web 容器或框架，请安装 Elastic Beanstalk 支持的适用于您的 Amazon Linux 操作系统的 Tomcat 版本。有关 Elastic Beanstalk 支持的当前 Apache Tomcat 版本的列表，请参阅 *AWS Elastic Beanstalk 平台*文档文档中的 [Tomcat](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.java)。从 [Apache Tomcat](http://tomcat.apache.org) 网站下载适合您环境的 Tomcat 版本。

## 下载库
<a name="java-development-environment-libraries"></a>

Elastic Beanstalk 平台默认包含几个库。请下载您的应用程序要用到的库，并将它们保存到要在应用程序源包中部署的项目文件夹中。

如果你在本地安装了 Tomcat，则可以从安装文件夹中复制 servlet API 和 P JavaServer ages (JSP) API 库。如果部署到 Tomcat 平台版本，则无需在源包中包含这些文件，但您的 `classpath` 中需要包含它们以便编译使用它们的任何类。

JUnit、Google Guava 和 Apache Commons 提供了几个有用的库。请访问其主页了解更多信息：
+  [下载 JUnit](https://github.com/junit-team/junit/wiki/Download-and-Install) 
+  [下载 Google Guava](https://code.google.com/p/guava-libraries/) 
+  [下载 Apache Commons](http://commons.apache.org/downloads/) 

## 安装适用于 Java 的 S AWS DK
<a name="java-development-environment-sdk"></a>

如果您需要从应用程序内部管理 AWS 资源，请安装适用于 Java 的 AWS SDK。例如，您可以使用 Amazon DynamoDB (DynamoDB) 在多个 Web 服务器上共享 Apache Tomcat 应用程序的会话状态。 适用于 Java 的 AWS SDK有关更多信息，请参阅适用于 Java 的 SDK 文档中的[使用亚马逊 DynamoDB AWS 管理 Tomcat 会话状态](https://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-tomcat-session-manager.html)。

有关更多信息和安装说明，请访问 [AWS SDK for Java 主页](https://aws.amazon.com/sdk-for-java/)。

## 安装 IDE 或文本编辑器
<a name="java-development-environment-ide"></a>

集成开发环境 (IDEs) 提供了多种便于应用程序开发的功能。如果您还没使用 IDE 进行过 Java 开发，请尝试 Eclipse 和 IntelliJ，看哪个更适合您。
+  [安装面向 Java EE 开发人员的 Eclipse IDE](https://www.eclipse.org/downloads/) 
+  [安装 IntelliJ](https://www.jetbrains.com/idea/) 

IDE 可以将您可能不希望提交到源代码控制的文件添加到项目文件夹中。要防止将这些文件提交到源代码控制，请使用 `.gitignore` 或您的源代码控制工具的同类功能。

如果您只是希望开始编码而不需要所有 IDE 功能，请考虑[安装 Sublime Text](http://www.sublimetext.com/)。

**注意**  
2023 年 5 月 31 日，[AWS Toolkit for Eclipse](https://docs.aws.amazon.com//toolkit-for-eclipse/v1/user-guide/welcome.html) 已到达使用寿命终止，不再受 AWS的支持。有关生命周期结束的更多详细信息 AWS Toolkit for Eclipse，请参阅存储库上的 [README.md](https://github.com/aws/aws-toolkit-eclipse) 文件。 AWS Toolkit for Eclipse GitHub 

# 更多适用于 Java 的 Elastic Beanstalk 示例应用程序和教程
<a name="java-getstarted"></a>

本节提供额外的应用程序和教程。本主题前面的 [QuickStart 适用于 Java](java-quickstart.md) 和 [QuickStart 在 Tomcat 上使用 Java](tomcat-quickstart.md) 主题将引导您使用 EB CLI 启动示例 Java 应用程序。

要开始使用 Java 应用程序 AWS Elastic Beanstalk，您只需要一个应用程序[源包](applications-sourcebundle.md)，将其作为第一个应用程序版本上传并部署到环境中。创建环境时，Elastic Beanstalk 会分配运行可扩展 Web 应用程序所需的所有 AWS 资源。

## 使用示例 Java 应用程序启动环境
<a name="java-getstarted-samples"></a>

Elastic Beanstalk 为每个平台提供了单页示例应用程序以及更复杂的示例，这些示例展示了 AWS 其他资源的使用情况，例如 Amazon RDS 以及特定于语言或平台的功能以及。 APIs

单一页面示例是您在创建环境时获得的相同代码，无需提供您自身的源代码。更复杂的示例托管在上 GitHub 面，在部署到 Elastic Beanstalk 环境之前，可能需要对其进行编译或构建。

 


**样本**  

|  Name  |  支持的版本  |  环境类型  |  源  |  描述  | 
| --- | --- | --- | --- | --- | 
|  Tomcat（单页）  |  所有 *Tomcat（带 Corretto）*平台分支  |  Web 服务器 工作线程  |   [tomcat.zip](samples/tomcat.zip)   |  配置为仅在网站根目录中显示一个页面 (`index.jsp`) 的 Tomcat Web 应用程序。 对于[工作线程环境](using-features-managing-env-tiers.md)，此示例包含一个 `cron.yaml` 文件，该文件配置一个每分钟调用一次 `scheduled.jsp` 的计划任务。调用 `scheduled.jsp` 时，它会写入 `/tmp/sample-app.log` 处的日志文件。最后，在 `.ebextensions` 中包含一个配置文件，该文件在您请求环境日志时将日志从 `/tmp/` 复制到由 Elastic Beanstalk 读取的位置。 如果您在运行此示例的环境中[启用 X-Ray 集成](environment-configuration-debugging.md)，则应用程序会显示有关 X-Ray 的更多内容，并提供用于生成调试信息（可在 X-Ray 控制台中查看）的选项。  | 
|  Corretto（单页）  |  Corretto 11 Corretto 8  |  Web 服务器  |  [corretto.zip](samples/corretto.zip)  |  使用 `Buildfile` 和 `Procfile` 配置文件的 Corretto 应用程序。 如果您在运行此示例的环境中[启用 X-Ray 集成](environment-configuration-debugging.md)，则应用程序会显示有关 X-Ray 的更多内容，并提供用于生成调试信息（可在 X-Ray 控制台中查看）的选项。  | 
|  Scorekeep  | Java 8 | Web 服务器 | [在 .com 上克隆存储库 GitHub](https://github.com/awslabs/eb-java-scorekeep) |  *Scorekeep* 是一个 RESTful Web API，它使用 Spring 框架提供用于创建和管理用户、会话和游戏的接口。此 API 与通过 HTTP 使用它的 Angular 1.5 Web 应用程序捆绑在一起。 应用程序使用 Java SE 平台的功能下载依赖项和用作构建基础的实例，从而最小化源包的大小。此外，应用程序还包含覆盖默认配置的 nginx 配置文件，以通过代理在端口 80 上静态地为前端 Web 应用程序提供服务，并将针对 `/api` 下路径的请求路由到在 `localhost:5000` 上运行的 API。 Scorekeep 还包含一个 `xray` 分支，它演示了使用 AWS X-Ray检测 Java 应用程序的方法。它显示了使用 servlet 过滤器对传入 HTTP 请求的检测、自动和手动 AWS SDK 客户端检测、记录器配置以及对传出 HTTP 请求和 SQL 客户端的检测。 请参阅自述文件获取说明，或跟随 [AWS X-Ray 入门教程](https://docs.aws.amazon.com/xray/latest/devguide/xray-gettingstarted.html)演练用 X-Ray 检测应用程序的过程。  | 
|  是否有 Snake？  | 使用 Java 8 的 Tomcat 8 | Web 服务器 | [在 .com 上克隆存储库 GitHub](https://github.com/awslabs/eb-tomcat-snakes) |  *它有蛇吗？* 是一款 Tomcat Web 应用程序，它显示了 Elastic Beanstalk 配置文件、亚马逊 RDS、JDBC、PostgreSQL、Servlets、Simple Tag Support、标签文件、Log4J JSPs、Bootstrap 和 Jackson 的使用情况。 此项目的源代码包括最低要求构建脚本，后者将小服务程序和模型汇编入类文件，并将所需文件封装入您可部署至 Elastic Beanstalk 环境的 Web 存档。请参阅项目存储库中的自述文件，浏览完整说明。  | 
| Locust Load Generator | Java 8 | Web 服务器 | [在 .com 上克隆存储库 GitHub](https://github.com/awslabs/eb-locustio-sample) |  您可用于对不同 Elastic Beanstalk 环境中运行的另一个 Web 应用程序进行负载测试的 Web 应用程序。显示 `Buildfile` 和 `Procfile` 文件、DynamoDB 以及 [Locust](http://locust.io/)（一种开放源负载测试工具）的使用。  | 

按照以下步骤下载任何示例应用程序并将其部署到 Elastic Beanstalk：

**使用应用程序启动环境（控制台）**

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

1. 在导航窗格中，选择 **应用程序**。在列表中选择一个现有的应用程序。您还可以选择按照 [管理 应用程序](applications.md) 中的说明创建一个。

1. 在应用程序概述页面上，选择**创建新环境**。

   这将启动 **Create environment**（创建环境）向导。该向导提供了一组创建新环境的步骤。

1. 对于**环境层**，选择 **Web 服务器环境**或**工作线程环境**[环境层](concepts.md#concepts-tier)。环境的层创建后无法更改。
**注意**  
[.NET on Windows Server 平台](create_deploy_NET.md)不支持工作线程环境层。

   根据您之前选择的应用程序，提供默认**应用程序信息**字段。

   在**环境信息**分组中，根据应用程序名称提供**环境名称**默认值。如果您更喜欢不同的环境名称，则可以在字段中输入其他值。您可以选择输入**域**名；否则 Elastic Beanstalk 会自动生成值。您还可以选择输入**环境描述**。

1. 对于**平台**，选择与应用程序使用的语言匹配的平台和平台分支。
**注意**  
Elastic Beanstalk 支持列出的大多数平台的多个[版本](concepts.platforms.md)。默认情况下，此控制台将为您选择的平台和平台分支选择推荐版本。如果您的应用程序需要其他版本，您可以在此处选择该版本。有关支持的平台版本的信息，请参阅 [Elastic Beanstalk 支持的平台](concepts.platforms.md)。

1. 对于**应用程序代码**，有几种选择可供您考虑。
   + 要启动默认示例应用程序而不提供源代码，请选择**示例应用程序**。此操作会选择 Elastic Beanstalk 为您之前选择的平台提供的单页应用程序。
   + 如果您从本指南下载了示例应用程序，或您有自己的应用程序源代码，请执行下面的步骤。

     1. 选择**上传代码**。

     1. 接下来选择**本地文件**，然后在**上传应用程序**下，选择**选择文件**。

     1. 您的客户端计算机操作系统将会显示一个界面来选择已下载的本地文件。选择源包文件并继续。

1. **预设**的选择取决于环境的用途。
   + 如果您要创建用来了解 Elastic Beanstalk 的示例环境或开发环境，请选择**单一实例（符合免费套餐资格）**。
   + 如果您要创建生产环境或用来进一步了解负载均衡的环境，请从**高可用性**选项中选择其一。

1. 选择**下一步**。

**配置服务访问权限**  
接下来，您需要两个角色。*服务角色*允许 Elastic Beanstalk 监控您的 EC2 实例并升级您的环境平台。*EC2 实例配置文件*角色允许执行诸如写入日志和与其他服务交互之类的任务。

**创建或选择服务角色**

1. 如果您之前创建了**服务角色**并想选择现有的角色，请从**服务角色**下拉列表中选择该值，然后跳过创建服务角色的其余步骤。

1. 如果未列出**服务角色**的任何值，或者您想创建一个新的值，请继续执行后续步骤。

1. 对于**服务角色**，选择**创建角色**。

1. 在**可信实体类型**中选择 **AWS 服务**。

1. 对于**使用案例**，选择 **Elastic Beanstalk – 环境**。

1. 选择**下一步**。

1. 确认**权限策略**包括以下内容，然后选择**下一步**：
   + `AWSElasticBeanstalkEnhancedHealth`
   + `AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy`

1. 选择**创建角色**。

1. 返回到**配置服务访问权限**选项卡，刷新列表，然后选择新创建的服务角色。

**创建或选择 EC2 实例配置文件**

1. 如果您之前创建了 **EC2 实例配置文件**并想选择现有的 EC2 实例配置文件，请从 **EC2 实例配置文件**下拉列表中选择该值，然后跳过创建 EC2 实例配置文件的其余步骤。

1. 如果未列出 **EC2 实例配置文件**的任何值，或者您想创建一个新的值，请继续执行后续步骤。

1. 选择**创建角色**。

1. 在**可信实体类型**中选择 **AWS 服务**。

1. 对于**使用案例**，选择 **Elastic Beanstalk – 计算**。

1. 选择**下一步**。

1. 确认**权限策略**包括以下内容，然后选择**下一步**：
   + `AWSElasticBeanstalkWebTier`
   + `AWSElasticBeanstalkWorkerTier`
   + `AWSElasticBeanstalkMulticontainerDocker`

1. 选择**创建角色**。

1. 返回**配置服务访问权限**选项卡，刷新列表，然后选择新创建的 EC2 实例配置文件。

**完成应用程序的配置和创建**

1. （可选）如果您之前创建了 EC2 密钥对，则可以从 **EC2 密钥对**字段下拉列表中选择它。您可以使用它安全地登录到 Elastic Beanstalk 为您的应用程序预置的 Amazon EC2 实例。如果跳过此步骤，您可以在创建环境后始终创建并分配 EC2 密钥对。有关更多信息，请参阅 [EC2 key pair](using-features.managing.security.md#using-features.managing.security.keypair)。

1. 在 **Configure service access**（配置服务访问）页面上选择 **Skip to Review**（跳至审核）。

1. **Review**（审核）页面将显示所有选择的摘要。

   要进一步自定义您的环境，请在包含要配置的任何项目的步骤旁边选择 **Edit**（编辑）。只能在创建环境期间设置下列选项：
   + 环境名称
   + 域名
   + 平台版本
   + 处理器
   + 负载均衡器类型
   + 套餐

   可在环境创建后更改下列设置，但它们需要配置新实例或其他资源并且应用更改可能需要很长的时间：
   + 实例类型、根卷、key pair 和 AWS Identity and Access Management (IAM) 角色
   + 内部 Amazon RDS 数据库
   + VPC

   有关所有可用设置的详细信息，请参阅 [创建新环境向导](environments-create-wizard.md)。

1. 选择页面底部的 **Submit**（提交）以初始化新环境的创建。

## 后续步骤
<a name="java-getstarted-next"></a>

有了运行应用程序的环境以后，您随时可以[部署新的应用程序版本](using-features.deploy-existing-version.md)或完全不同的应用程序。部署新应用程序版本非常快，因为不需要配置或重新启动 EC2 实例。

在您部署了一两个示例应用程序并准备好开始在本地开发和运行 Java 应用程序以后，请参阅[下一节](java-development-environment.md)以使用所有需要的工具和库设置 Java 开发环境。

# 使用 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)。

# 捆绑用于 Tomcat 环境的多个 WAR 文件
<a name="java-tomcat-multiple-war-files"></a>

如果您的 Web 应用程序包含多个 Web 应用程序组件，您可以在一个环境中运行多个组件，而不必在单独的环境中运行每个组件，从而简化部署和降低运营成本。此策略对无需大量资源的轻型应用程序以及开发和测试环境很有效。

要将多个 Web 应用程序部署到您的环境，请将每个组件的 Web 应用程序存档 (WAR) 文件合并到单个[源包](applications-sourcebundle.md)中。

要创建包含多个 WAR 文件的应用程序源包，请使用以下结构来组织 WAR 文件。

```
MyApplication.zip
├── .ebextensions
├── .platform
├── foo.war
├── bar.war
└── ROOT.war
```

将包含多个 WAR 文件的源包部署到一个 AWS Elastic Beanstalk 环境时，可以从根域名的不同路径访问每个应用程序。前面的示例包含三个应用程序：`foo`、`bar` 和 `ROOT`。`ROOT.war` 是一个特殊文件名，它告知 Elastic Beanstalk 在根域中运行该应用程序，以便三个应用程序可在 `http://MyApplication.elasticbeanstalk.com/foo`、`http://MyApplication.elasticbeanstalk.com/bar` 和 `http://MyApplication.elasticbeanstalk.com` 中使用。

源包可以包括 WAR 文件、可选的 `.ebextensions` 文件夹和可选的 `.platform` 文件夹。有关这些可选配置文件夹的详细信息，请参阅[扩展 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。

**启动环境 (控制台)**

1. [使用以下预配置链接打开 Elastic Beanstalk 控制台：console.aws.amazon。 com/elasticbeanstalk/home\$1/newApplication？ 应用程序名称=教程&环境类型= LoadBalanced](https://console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced)

1. 对于**平台**，请选择与应用程序使用的语言匹配的平台和平台分支，或者为基于容器的应用程序选择 Docker 平台。

1. 对于 **Application code**（应用程序代码），选择 **Upload your code**（上传代码）。

1. 选择 **Local file (本地文件)**，再选择 **Choose file (选择文件)**，然后打开源包。

1. 选择**复查并启动**。

1. 查看可用设置并选择 **Create app (创建应用程序)**。

有关创建源包的信息，请参阅[创建 Elastic Beanstalk 应用程序源包](applications-sourcebundle.md)。

# 项目文件夹结构设置
<a name="java-tomcat-platform-directorystructure"></a>

要在部署到 Tomcat 服务器时正常工作，必须根据某些[准则](https://docs.oracle.com/javaee/7/tutorial/packaging003.htm)为编译的 Java Platform Enterprise Edition (*Java EE*) Web 应用程序存档（WAR 文件）设置正确的结构。项目目录不一定要遵循同样的标准，但为了简化编译和打包操作，最好采用同样的方式设置结构。如同 WAR 文件内容一样设置项目文件夹的结构，还有助您了解文件的关联方式以及它们在 Web 服务器上的行为方式。

在以下推荐使用的层次结构中，Web 应用程序的源代码置于 `src` 目录中，与生成脚本和它生成的 WAR 文件隔离。

```
~/workspace/my-app/
|-- build.sh            - Build script that compiles classes and creates a WAR
|-- README.MD           - Readme file with information about your project, notes
|-- ROOT.war            - Source bundle artifact created by build.sh
`-- src                 - Source code folder
    |-- WEB-INF         - Folder for private supporting files
    |   |-- classes     - Compiled classes
    |   |-- lib         - JAR libraries
    |   |-- tags        - Tag files
    |   |-- tlds        - Tag Library Descriptor files
    |   `-- web.xml     - Deployment Descriptor
    |-- com             - Uncompiled classes
    |-- css             - Style sheets
    |-- images          - Image files
    |-- js              - JavaScript files
    `-- default.jsp     - JSP (JavaServer Pages) webpage
```

`src` 文件夹内容与将进行打包并部署到服务器的内容匹配 (`com` 文件夹除外)。`com` 文件夹包含未编译的类 (`.java` 文件)。这些类需要编译并置于 `WEB-INF/classes` 目录中，以便可通过应用程序代码进行访问。

`WEB-INF` 目录包含未在 Web 服务器上公开提供的代码和配置。源目录根位置处的其他文件夹 (`css`、`images` 和 `js`) 在 Web 服务器上的对应路径中公开提供。

以下列示例与上面的项目目录相同，只是包含的文件和子目录更多。此示例项目包含简单的标签、模型和支持类以及一个用于 `record` 资源的 Java Server Page (JSP) 文件。它还包括样式表和 [Bootstrap JavaScript ](http://getbootstrap.com/) 的样式表、默认 JSP 文件以及一个针对 404 错误的错误页面。

`WEB-INF/lib` 包含一个 Java 存档 (JAR) 文件，其中含有用于 PostgreSQL 的 Java 数据库连接 (JDBC) 驱动程序。`WEB-INF/classes` 为空，因为尚未编译类文件。

```
~/workspace/my-app/
|-- build.sh
|-- README.MD
|-- ROOT.war
`-- src
    |-- WEB-INF
    |   |-- classes
    |   |-- lib
    |   |   `-- postgresql-9.4-1201.jdbc4.jar
    |   |-- tags
    |   |   `-- header.tag
    |   |-- tlds
    |   |   `-- records.tld
    |   `-- web.xml
    |-- com
    |   `-- myapp
    |       |-- model
    |       |   `-- Record.java
    |       `-- web
    |           `-- ListRecords.java
    |-- css
    |   |-- bootstrap.min.css
    |   `-- myapp.css
    |-- images
    |   `-- myapp.png
    |-- js
    |   `-- bootstrap.min.js
    |-- 404.jsp
    |-- default.jsp
    `-- records.jsp
```

## 使用 Shell 脚本生成 WAR 文件
<a name="java-tomcat-platform-directorystructure-building"></a>

`build.sh` 是非常简单的 shell 脚本，它用于编译 Java 类、构造 WAR 文件并将该文件复制到 Tomcat `webapps` 目录以进行本地测试。

```
cd src
javac -d WEB-INF/classes com/myapp/model/Record.java
javac -classpath WEB-INF/lib/*:WEB-INF/classes -d WEB-INF/classes com/myapp/model/Record.java
javac -classpath WEB-INF/lib/*:WEB-INF/classes -d WEB-INF/classes com/myapp/web/ListRecords.java

jar -cvf ROOT.war *.jsp images css js WEB-INF
cp ROOT.war /Library/Tomcat/webapps
mv ROOT.war ../
```

在 WAR 文件中，将发现与上面示例中的 `src` 目录相同的结构 (不包括 `src/com` 文件夹)。`jar` 命令自动创建 `META-INF/MANIFEST.MF` 文件。

```
~/workspace/my-app/ROOT.war
|-- META-INF
|   `-- MANIFEST.MF
|-- WEB-INF
|   |-- classes
|   |   `-- com
|   |       `-- myapp
|   |           |-- model
|   |           |   `-- Records.class
|   |           `-- web
|   |               `-- ListRecords.class
|   |-- lib
|   |   `-- postgresql-9.4-1201.jdbc4.jar
|   |-- tags
|   |   `-- header.tag
|   |-- tlds
|   |   `-- records.tld
|   `-- web.xml
|-- css
|   |-- bootstrap.min.css
|   `-- myapp.css
|-- images
|   `-- myapp.png
|-- js
|   `-- bootstrap.min.js
|-- 404.jsp
|-- default.jsp
`-- records.jsp
```

## 使用 `.gitignore`
<a name="java-tomcat-platform-gitignore"></a>

要避免将已编译的类文件和 WAR 文件提交到 Git 存储库，或避免在运行 Git 命令时显示有关这些文件的消息，请将相关文件类型添加到项目文件夹内一个名为 `.gitignore` 的文件中。

**\$1/workspace/myapp/.gitignore**

```
*.zip
*.class
```

# 配置代理服务器
<a name="java-tomcat-proxy"></a>

Tomcat 平台使用 [nginx](https://www.nginx.com/)（默认）或 [Apache HTTP Server](https://httpd.apache.org/) 作为反向代理，将实例上来自端口 80 的请求中继到在端口 8080 上侦听的 Tomcat Web 容器。Elastic Beanstalk 提供一个默认代理配置，您可以扩展该配置，也可以使用您自己的配置完全覆盖该配置。

**在平台版本上配置代理服务器**  
所有 AL2023/AL2 平台都支持统一的代理配置功能。有关在运行 AL2023 /的平台版本上配置代理服务器的更多信息AL2，请参阅[反向代理配置](platforms-linux-extend.proxy.md)。

## 在 Amazon Linux AMI（在 Amazon Linux 2 之前）的 Tomcat 平台上配置代理
<a name="java-tomcat-proxy.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="java-tomcat-proxy.alami"></a>

默认情况下，基于 Amazon Linux AMI（在 Amazon Linux 2 之前）的 Tomcat 平台版本为代理使用 [Apache 2.4](https://httpd.apache.org/docs/2.4/)。可以通过将[配置文件](ebextensions.md)包括在源代码中来选择使用 [Apache 2.2](https://httpd.apache.org/docs/2.2/) 或 [nginx](https://www.nginx.com/)。以下示例将 Elastic Beanstalk 配置为使用 nginx。

**Example .ebextensions/nginx-proxy.config**  

```
option_settings:
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: nginx
```

### 从 Apache 2.2 迁移到 Apache 2.4 — 亚马逊 Linux AMI () AL1
<a name="java-tomcat-proxy-apache-migrate"></a>

如果应用程序是针对 [Apache 2.2](https://httpd.apache.org/docs/2.2/) 开发的，请阅读此部分以了解有关迁移到 [Apache 2.4](https://httpd.apache.org/docs/2.4/) 的信息。

从 Tomcat 平台版本 3.0.0 配置（随 [2018 年 5 月 24 日的 Java with Tomcat 平台更新](https://aws.amazon.com/releasenotes/release-aws-elastic-beanstalk-platform-update-for-the-java-with-tomcat-platform-on-may-24-2018/)一起发布）开始，Apache 2.4 是 Tomcat 平台的默认代理。Apache 2.4 `.conf` 文件大多 (但不是全部) 向后兼容 Apache 2.2 的此类文件。Elastic Beanstalk 包含可在每个 Apache 版本中正常工作的默认 `.conf` 文件。如果应用程序未自定义 Apache 的配置 (如[扩展并覆盖默认 Apache 配置 — 亚马逊 Linux AMI () AL1](#java-tomcat-proxy-apache)中所述)，它应准确无误地迁移到 Apache 2.4。

如果应用程序扩展或覆盖 Apache 的配置，可能必须进行一些更改才能迁移到 Apache 2.4。有关更多信息，请参阅 *Apache 软件基金会* 站点上的[从 2.2 升级到 2.4](https://httpd.apache.org/docs/current/upgrading.html)。在成功迁移到 Apache 2.4 之前，可以通过在源代码中包括以下[配置文件](ebextensions.md)作为临时措施，选择将 Apache 2.2 与应用程序一起使用。

**Example .ebextensions/ .config apache-legacy-proxy**  

```
option_settings:
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache/2.2
```

为了快速修复，您还可以在 Elastic Beanstalk 控制台中选择代理服务器。

**在 Elastic Beanstalk 控制台中选择 Tomcat 环境中的代理**

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

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

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

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

1. 对于 **Proxy server**（代理服务器），请选择 `Apache 2.2 (deprecated)`。

1. 要保存更改，请选择页面底部的 **Apply**（应用）。

![\[在 Elastic Beanstalk 控制台的软件配置类别中为 Tomcat 环境选择代理\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/java-tomcat-proxy-selection.png)


### 扩展并覆盖默认 Apache 配置 — 亚马逊 Linux AMI () AL1
<a name="java-tomcat-proxy-apache"></a>

您可以使用其他配置文件扩展 Elastic Beanstalk 默认 Apache 配置。也可以完全覆盖 Elastic Beanstalk 默认 Apache 配置。

**注意**  
所有 Amazon Linux 2 平台都支持统一的代理配置功能。有关在运行 Amazon Linux 2 的 Tomcat 平台版本上配置代理服务器的详细信息，请参阅 [反向代理配置](platforms-linux-extend.proxy.md)。
如果您要将 Elastic Beanstalk 应用程序迁移到 Amazon Linux 2 平台，请务必阅读[将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md) 中的信息。

要扩展 Elastic Beanstalk 默认 Apache 配置，请将 `.conf` 配置文件添加到应用程序源包中名为 `.ebextensions/httpd/conf.d` 的文件夹中。Elastic Beanstalk Apache 配置自动在此文件夹中包括 `.conf` 文件。

```
~/workspace/my-app/
|-- .ebextensions
|   -- httpd
|      -- conf.d
|         -- myconf.conf
|         -- ssl.conf
-- index.jsp
```

例如，以下 Apache 2.4 配置将在端口 5000 上添加一个监听器。

**Example 。 ebextensions/httpd/conf.d/port5000.conf**  

```
listen 5000
<VirtualHost *:5000>
  <Proxy *>
    Require all granted
  </Proxy>
  ProxyPass / http://localhost:8080/ retry=0
  ProxyPassReverse / http://localhost:8080/
  ProxyPreserveHost on

  ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>
```

要完全覆盖 Elastic Beanstalk 默认 Apache 配置，请在源包的 `.ebextensions/httpd/conf/httpd.conf` 处包括一个配置。

```
~/workspace/my-app/
|-- .ebextensions
|   `-- httpd
|       `-- conf
|           `-- httpd.conf
`-- index.jsp
```

如果要覆盖 Elastic Beanstalk Apache 配置，请将以下行添加到 `httpd.conf` 以加入适用于[Elastic Beanstalk 中的增强型运行状况报告和监控](health-enhanced.md)、响应压缩和静态文件的 Elastic Beanstalk 配置。

```
IncludeOptional conf.d/*.conf
IncludeOptional conf.d/elasticbeanstalk/*.conf
```

如果环境使用 Apache 2.2 作为其代理，则将 `IncludeOptional` 指令替换为 `Include`。有关这两个指令在两个 Apache 版本中的行为的详细信息，请参见在 Apache 2.4 [中包含、在 Apache 2.4 IncludeOptional ](https://httpd.apache.org/docs/2.4/mod/core.html#include) [中包含和 Apache 2.](https://httpd.apache.org/docs/2.4/mod/core.html#includeoptional) [2 中包含](https://httpd.apache.org/docs/2.2/mod/core.html#include)。

**注意**  
要覆盖端口 80 上的默认侦听器，请在 `00_application.conf` 处包含一个名为 `.ebextensions/httpd/conf.d/elasticbeanstalk/` 的文件，以覆盖 Elastic Beanstalk 配置。

有关工作示例，请查看环境中实例上的 `/etc/httpd/conf/httpd.conf` 处的 Elastic Beanstalk 默认配置文件。您的源包中 `.ebextensions/httpd` 文件夹内的所有文件均已在部署期间被复制到 `/etc/httpd`。

### 扩展默认 nginx 配置 — 亚马逊 Linux AMI () AL1
<a name="java-tomcat-proxy-nginx"></a>

要扩展 Elastic Beanstalk 的默认 nginx 配置，请将 `.conf` 配置文件添加到应用程序源包中名为 `.ebextensions/nginx/conf.d/` 的文件夹中。Elastic Beanstalk nginx 配置自动在此文件夹中包括 `.conf` 文件。

```
~/workspace/my-app/
|-- .ebextensions
|   `-- nginx
|       `-- conf.d
|           |-- elasticbeanstalk
|           |   `-- my-server-conf.conf
|           `-- my-http-conf.conf
`-- index.jsp
```

`conf.d` 文件夹中扩展名为 .conf 的文件均已包括在默认配置的 `http` 数据块中。`conf.d/elasticbeanstalk` 文件夹中的文件包括在 `server` 数据块中的 `http` 数据块中。

要完全覆盖 Elastic Beanstalk 默认 nginx 配置，请在源包的 `.ebextensions/nginx/nginx.conf` 处包括一个配置。

```
~/workspace/my-app/
|-- .ebextensions
|   `-- nginx
|       `-- nginx.conf
`-- index.jsp
```

**注意**  
如果要覆盖 Elastic Beanstalk nginx 配置，请将以下行添加到配置的 `server` 数据块，以加入适用于端口 80 侦听器、响应压缩和静态文件的 Elastic Beanstalk 配置。  

  ```
   include conf.d/elasticbeanstalk/*.conf;
  ```
要覆盖端口 80 上的默认侦听器，请在 `00_application.conf` 处包含一个名为 `.ebextensions/nginx/conf.d/elasticbeanstalk/` 的文件，以覆盖 Elastic Beanstalk 配置。
另请将以下行包括在配置的 `http` 数据块中，以加入适用于[Elastic Beanstalk 中的增强型运行状况报告和监控](health-enhanced.md)和日志记录的 Elastic Beanstalk 配置。  

  ```
      include       conf.d/*.conf;
  ```

有关工作示例，请查看环境中实例上的 `/etc/nginx/nginx.conf` 处的 Elastic Beanstalk 默认配置文件。您的源包中 `.ebextensions/nginx` 文件夹内的所有文件均已在部署期间被复制到 `/etc/nginx`。

# 使用 Elastic Beanstalk Java SE 平台
<a name="java-se-platform"></a>

本主题介绍如何配置、生成和运行在 Java SE 平台上运行的 AWS Elastic Beanstalk Java 应用程序。

Elastic Beanstalk Java SE 平台是一组[平台版本](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.javase)，适用于可通过已编译的 JAR 文件自行运行的 Java Web 应用程序。您可以在本地编译应用程序，或将源代码与生成脚本一起上传以便在实例中对其进行编译。Java SE 平台版本分组到平台分支中，每个分支均对应 Java 的一个主要版本。

**注意**  
Elastic Beanstalk 不会分析应用程序的 JAR 文件。将 Elastic Beanstalk 需要的文件保存在 JAR 文件外部。例如，在应用程序的源包的根目录下的 JAR 文件旁边放置[工作线程环境](using-features-managing-env-tiers.md)的 `cron.yaml` 文件。

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

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

Elastic Beanstalk Java SE 平台包含一个 [nginx](https://www.nginx.com/) 服务器，该服务器用作反向代理，向您的应用程序提供缓存的静态内容并传递请求。平台提供了配置选项，以便将代理服务器配置为从源代码中的文件夹提供静态资源，从而减少应用程序上的负载。有关高级方案，您可以在源包中[包括您自己的 .conf 文件](java-se-nginx.md)，以扩展 Elastic Beanstalk 的代理配置或完全重写它。

如果您仅为应用程序源提供单个 JAR 文件（单独提供而不是包含在源包中），则 Elastic Beanstalk 会将 JAR 文件重命名为 `application.jar`，然后使用 `java -jar application.jar` 运行它。要配置在您的环境中的服务器实例上运行的进程，请在您的源包中包含一个可选的 [Procfile](java-se-procfile.md)。如果您的源包根目录中有多个 JAR 或者您要自定义 java 命令来设置 JVM 选项，必须使用 `Procfile`。

我们建议您始终在源包中将 `Procfile` 与应用程序一起提供。通过这种方式，您可以精确控制 Elastic Beanstalk 为您的应用程序运行的进程以及这些进程接收的参数。

要编译 Java 类并在部署时对环境中的 EC2 实例运行其他构建命令，请在应用程序源包中包含一个 [Buildfile](java-se-buildfile.md)。A `Buildfile` 允许您按原样部署源代码并在服务器上构建，而不是在 JARs 本地编译。Java SE 平台包含常用的生成工具，允许您在服务器上执行生成操作。

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

## 配置 Java SE 环境
<a name="java-se-options"></a>

Java SE 平台设置允许您微调亚马逊 EC2 实例的行为。您可以使用 Elastic Beanstalk 控制台编辑 Elastic Beanstalk 环境 EC2 的亚马逊实例配置。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

## Java SE 配置命名空间
<a name="java-se-namespaces"></a>

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

Java SE 平台不定义任何特定于平台的命名空间。您可以使用 `aws:elasticbeanstalk:environment:proxy:staticfiles` 命名空间将代理配置为提供静态文件。有关详细信息和示例，请参阅[提供静态文件](environment-cfg-staticfiles.md)。

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外，您还可使用控制台、保存的配置、EB CLI 或 AWS CLI来配置选项。参阅 [配置选项](command-options.md) 了解更多信息。

## Amazon Linux AMI（在 Amazon Linux 2 之前）的 Java SE 平台
<a name="java-se.alami"></a>

如果您的 Elastic Beanstalk Java SE 环境使用 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)。

### Java SE 配置命名空间 — 亚马逊 Linux AMI () AL1
<a name="java-se.alami.namespaces"></a>

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

Java SE 平台除支持[所有平台支持的命名空间](command-options-general.md)外，还支持一个平台特定的配置命名空间。使用 `aws:elasticbeanstalk:container:java:staticfiles` 命名空间可以定义一些选项，通过它们将您的 Web 应用程序路径映射到应用程序源包中包含静态内容的文件夹。

例如，此 [option\$1settings](ebextensions-optionsettings.md) 代码段在静态文件命名空间中定义了两个选项。第一个选项将路径 `/public` 映射到名为 `public` 的文件夹，第二个选项将路径 `/images` 映射到名为 `img` 的文件夹：

```
option_settings:
  aws:elasticbeanstalk:container:java:staticfiles:
    /html: statichtml
    /images: staticimages
```

通过此命名空间映射的文件夹必须为源包根目录中实际存在的文件夹。不能将路径映射到 JAR 文件中的文件夹。

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外，您还可使用控制台、保存的配置、EB CLI 或 AWS CLI来配置选项。参阅 [配置选项](command-options.md) 了解更多信息。

# 使用 Buildfile 在 JARs 服务器上构建
<a name="java-se-buildfile"></a>

通过从源包中的文件中调用生成命令，可以在环境中的 EC2 实例上构建应用程序的类`Buildfile`文件和 JAR。

`Buildfile` 中的名只运行一次，并且在完成后必须终止，而 [Procfile](java-se-procfile.md) 文件中的命令应在应用程序的生命周期内始终运行，并且将在应用程序终止后重启。要 JARs 在您的应用程序中运行，请使用`Procfile`。

有关 `Buildfile` 的放置和语法的详细信息，请参阅 [Buildfile 和 Procfile](platforms-linux-extend.build-proc.md)。

以下 `Buildfile` 示例通过运行 Apache Maven 从源代码生成一个 Web 应用程序。有关使用此功能的示例应用程序，请参阅 [Java Web 应用程序示例](java-getstarted.md#java-getstarted-samples)。

**Example Buildfile**  

```
build: mvn assembly:assembly -DdescriptorId=jar-with-dependencies
```

Java SE 平台包含以下生成工具，可从您的生成脚本调用这些工具：
+ `javac` – Java 编译器
+ `ant` – Apache Ant
+ `mvn` – Apache Maven
+ `gradle` – Gradle

# 使用 Procfile 配置应用程序进程
<a name="java-se-procfile"></a>

如果您的应用程序源包根目录中有多个 JAR 文件，则必须包括 `Procfile` 文件来告知 Elastic Beanstalk 运行哪个或哪些 JAR。也可以为单 JAR 应用程序提供 `Procfile` 文件，以配置运行您的应用程序的 Java 虚拟机 (JVM)。

我们建议您始终在源包中将 `Procfile` 与应用程序一起提供。通过这种方式，您可以精确控制 Elastic Beanstalk 为您的应用程序运行的进程以及这些进程接收的参数。

有关编写和使用 `Procfile` 的详细信息，请参阅 [Buildfile 和 Procfile](platforms-linux-extend.build-proc.md)。

**Example Procfile**  

```
web: java -Xms256m -jar server.jar 
cache: java -jar mycache.jar
web_foo: java -jar other.jar
```

运行应用程序中的主 JAR 的命令必须命名为 `web`，而且必须是 `Procfile` 中列出的第一条命令。nginx 服务器将它从您的环境的负载均衡器接收到的所有 HTTP 请求都转发给此应用程序。

Elastic Beanstalk 假定 Procfile 中的所有条目应始终运行，并自动重新启动 Procfile 中定义的任何终止的应用程序。要运行将会终止并且不应重新启动的命令，请使用 [`Buildfile`](java-se-buildfile.md)。

## 在 Amazon Linux AMI（在 Amazon Linux 2 之前）上使用 Procfile
<a name="java-se-procfile.alami"></a>

如果您的 Elastic Beanstalk Java SE 环境使用 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)。

### 端口传递 — 亚马逊 Linux AMI (AL1)
<a name="java-se-procfile.alami.ports"></a>

默认情况下，Elastic Beanstalk 将 nginx 代理配置为通过端口 5000 向您的应用程序转发请求。您可以覆盖默认端口，方法是将 `PORT` [环境属性](java-se-platform.md#java-se-options)设置为主应用程序侦听的端口。

如果您使用 `Procfile` 运行多个应用程序，则 Amazon Linux AMI 平台版本上的 Elastic Beanstalk 预计每个额外的应用程序都侦听编号比上一个高 100 的端口。Elastic Beanstalk 将可从每个应用程序内访问的 PORT 变量设置为它预计该应用程序运行时使用的端口。您可以通过在应用程序代码中调用 `System.getenv("PORT")` 访问此变量。

在上面的 `Procfile` 示例中，`web` 应用程序侦听端口 5000，`cache` 侦听端口 5100，而 `web_foo` 侦听端口 5200。`web` 通过读取 `PORT` 变量配置其侦听端口，并在该端口号的基础上加 100 来确定 `cache` 侦听的端口，从而能够发送其请求。

# 配置代理服务器
<a name="java-se-nginx"></a>

Elastic Beanstalk 使用 [nginx](https://www.nginx.com/) 作为反向代理，将应用程序映射到端口 80 上的 Elastic Load Balancing 负载均衡器。Elastic Beanstalk 提供一个默认 nginx 配置，您可以扩展该配置，也可以使用您自己的配置完全覆盖该配置。

默认情况下，Elastic Beanstalk 将 nginx 代理配置为通过端口 5000 向您的应用程序转发请求。您可以覆盖默认端口，方法是将 `PORT` [环境属性](java-se-platform.md#java-se-options)设置为主应用程序侦听的端口。

**注意**  
应用程序侦听的端口不会影响 nginx 服务器为了从负载均衡器接收请求而侦听的端口。

**在平台版本上配置代理服务器**  
所有 AL2 023/ AL2 平台都支持统一的代理配置功能。有关在运行 AL2 023/ 的平台版本上配置代理服务器的更多信息AL2，请参阅。[反向代理配置](platforms-linux-extend.proxy.md)

## 在 Amazon Linux AMI（在 Amazon Linux 2 之前）上配置代理
<a name="java-se-nginx.alami"></a>

如果您的 Elastic Beanstalk Java SE 环境使用 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)。

### 扩展和覆盖默认代理配置 — Amazon Linux AMI () AL1
<a name="java-se-nginx.alami.extending"></a>

要扩展 Elastic Beanstalk 的默认 nginx 配置，请将 `.conf` 配置文件添加到应用程序源包中名为 `.ebextensions/nginx/conf.d/` 的文件夹中。Elastic Beanstalk 的 nginx 配置自动在此文件夹中包括 `.conf` 文件。

```
~/workspace/my-app/
|-- .ebextensions
|   `-- nginx
|       `-- conf.d
|           `-- myconf.conf
`-- web.jar
```

要完全覆盖 Elastic Beanstalk 的默认 nginx 配置，请在源包的 `.ebextensions/nginx/nginx.conf` 处包括一个配置：

```
~/workspace/my-app/
|-- .ebextensions
|   `-- nginx
|       `-- nginx.conf
`-- web.jar
```

如果要覆盖 Elastic Beanstalk 的 nginx 配置，请将以下行添加到 `nginx.conf` 中，以便加入适用于[Elastic Beanstalk 中的增强型运行状况报告和监控](health-enhanced.md)、自动应用程序映射和静态文件的 Elastic Beanstalk 配置。

```
 include conf.d/elasticbeanstalk/*.conf;
```

以下示例配置来自 [Scorekeep 示例应用程序](https://github.com/aws-samples/eb-java-scorekeep/)，它覆盖 Elastic Beanstalk 的默认配置，以从 `public` 的 `/var/app/current` 子目录为静态 Web 应用程序提供服务，Java SE 平台也从该处复制应用程序源代码。`/api` 位置转发流量，以在 `/api/` 下路由到侦听端口 5000 的 Spring 应用程序。所有其他流量由位于根路径的 Web 应用程序提供服务。

**Example**  

```
user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    33282;

events {
    worker_connections  1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  include       conf.d/*.conf;

  map $http_upgrade $connection_upgrade {
      default     "upgrade";
  }

  server {
      listen        80 default_server;
      root /var/app/current/public;

      location / {
      }git pull
      

      location /api {
          proxy_pass          http://127.0.0.1:5000;
          proxy_http_version  1.1;

          proxy_set_header    Connection          $connection_upgrade;
          proxy_set_header    Upgrade             $http_upgrade;
          proxy_set_header    Host                $host;
          proxy_set_header    X-Real-IP           $remote_addr;
          proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
      }

      access_log    /var/log/nginx/access.log main;

      client_header_timeout 60;
      client_body_timeout   60;
      keepalive_timeout     60;
      gzip                  off;
      gzip_comp_level       4;

      # Include the Elastic Beanstalk generated locations
      include conf.d/elasticbeanstalk/01_static.conf;
      include conf.d/elasticbeanstalk/healthd.conf;
  }
}
```

# 将 Amazon RDS DB 实例添加到 Java Elastic Beanstalk 环境
<a name="java-rds"></a>

本主题提供使用 Elastic Beanstalk 控制台创建 Amazon RDS 的说明。您可以使用 Amazon Relational Database Service (Amazon RDS) 数据库实例来存储应用程序收集和修改的数据。数据库可以附加到您的环境并由 Elastic Beanstalk 进行管理，也可以在外部创建和管理数据库。

如果您是首次使用 Amazon RDS，请使用 Elastic Beanstalk 控制台向测试环境中添加数据库实例，并验证您的应用程序是否可以连接到该实例。

**向环境添加数据库实例**

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

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

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

1. 在 **Database**（数据库）配置类别中，选择 **Edit**（编辑）。

1. 选择数据库引擎，然后输入用户名和密码。

1. 要保存更改，请选择页面底部的 **Apply**（应用）。

添加一个数据库实例大约需要 10 分钟。环境更新完成后，您的应用程序就可以通过以下环境属性访问数据库实例的主机名和其他连接信息：


| 属性名称 | 描述 | 属性值 | 
| --- | --- | --- | 
|  `RDS_HOSTNAME`  |  数据库实例的主机名。  |  在 Amazon RDS 控制台的 **Connectivity & security**（连接和安全）选项卡上：**Endpoint**（端点）。  | 
|  `RDS_PORT`  |  数据库实例接受连接的端口。默认值因数据库引擎而异。  |  在 Amazon RDS 控制台的 **Connectivity & security**（连接和安全）选项卡上：**Port**（端口）。  | 
|  `RDS_DB_NAME`  |  数据库名称 **ebdb**。  |  在 Amazon RDS 控制台的 **Configuration**（配置）选项卡上：**DB Name**（数据库名称）。  | 
|  `RDS_USERNAME`  |  您为数据库配置的用户名。  |  在 Amazon RDS 控制台的 **Configuration**（配置）选项卡上：**Master username**（主用户名）。  | 
|  `RDS_PASSWORD`  |  您为数据库配置的密码。  |  在 Amazon RDS 控制台中不可供参考。  | 

有关配置内部数据库实例的更多信息，请参阅[将数据库添加到 Elastic Beanstalk 环境](using-features.managing.db.md)。有关配置外部数据库以用于 Elastic Beanstalk 的说明，请参阅[将 Elastic Beanstalk 和 Amazon RDS 结合使用](AWSHowTo.RDS.md)。

要连接到数据库，请将适当的驱动程序 JAR 文件添加到应用程序中，在代码中加载驱动程序类，然后使用 Elastic Beanstalk 提供的环境属性创建连接对象。

**Topics**
+ [

## 下载 JDBC 驱动程序
](#java-rds-drivers)
+ [

## 连接数据库 (Java SE 平台)
](#java-rds-javase)
+ [

## 连接数据库 (Tomcat 平台)
](#java-rds-tomcat)
+ [

## 数据库连接问题排查
](#create_deploy_Java.rds.troubleshooting)

## 下载 JDBC 驱动程序
<a name="java-rds-drivers"></a>

您需要所选数据库引擎的 JDBC 驱动程序 JAR 文件。将 JAR 文件保存在源代码中，并在编译用于创建数据库连接的类时将该文件包含在类路径中。

在以下位置可以找到数据库引擎的最新驱动程序：
+ **MySQL** – [MySQL Connector/J](https://dev.mysql.com/downloads/connector/j/)
+ **Oracle SE-1** – [Oracle JDBC Driver](http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html)
+ **Postgres** – [PostgreSQL JDBC Driver](https://jdbc.postgresql.org/)
+ **SQL Server** – [Microsoft JDBC Driver](https://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx)

要使用 JDBC 驱动程序，请在用 `Class.forName()` 创建连接之前在代码中调用 `DriverManager.getConnection()` 加载该驱动程序。

JDBC 使用以下格式的连接字符串：

```
jdbc:driver://hostname:port/dbName?user=userName&password=password
```

您可以从 Elastic Beanstalk 提供给应用程序的环境变量中检索主机名、端口、数据库名称、用户名和密码。驱动程序名称特定于您的数据库类型和驱动程序版本。以下是驱动程序名称示例：
+ `mysql` for MySQL
+ `postgresql` 适用于 PostgreSQL
+ `oracle:thin` 适用于 Oracle Thin
+ `oracle:oci` 适用于 Oracle OCI
+ `oracle:oci8` 适用于 Oracle OCI 8
+ `oracle:kprb` 适用于 Oracle KPRB
+ `sqlserver` 适用于 SQL Server

## 连接数据库 (Java SE 平台)
<a name="java-rds-javase"></a>

在 Java SE 环境中，可以使用 `System.getenv()` 从环境中读取连接变量。下面的示例代码介绍用于创建 PostgreSQL 数据库连接的类。

```
private static Connection getRemoteConnection() {
    if (System.getenv("RDS_HOSTNAME") != null) {
      try {
      Class.forName("org.postgresql.Driver");
      String dbName = System.getenv("RDS_DB_NAME");
      String userName = System.getenv("RDS_USERNAME");
      String password = System.getenv("RDS_PASSWORD");
      String hostname = System.getenv("RDS_HOSTNAME");
      String port = System.getenv("RDS_PORT");
      String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password;
      logger.trace("Getting remote connection with connection string from environment variables.");
      Connection con = DriverManager.getConnection(jdbcUrl);
      logger.info("Remote connection successful.");
      return con;
    }
    catch (ClassNotFoundException e) { logger.warn(e.toString());}
    catch (SQLException e) { logger.warn(e.toString());}
    }
    return null;
  }
```

## 连接数据库 (Tomcat 平台)
<a name="java-rds-tomcat"></a>

在 Tomcat 环境中，环境属性是以 `System.getProperty()` 可访问的系统属性的形式提供的。

下面的示例代码介绍用于创建 PostgreSQL 数据库连接的类。

```
private static Connection getRemoteConnection() {
    if (System.getProperty("RDS_HOSTNAME") != null) {
      try {
      Class.forName("org.postgresql.Driver");
      String dbName = System.getProperty("RDS_DB_NAME");
      String userName = System.getProperty("RDS_USERNAME");
      String password = System.getProperty("RDS_PASSWORD");
      String hostname = System.getProperty("RDS_HOSTNAME");
      String port = System.getProperty("RDS_PORT");
      String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password;
      logger.trace("Getting remote connection with connection string from environment variables.");
      Connection con = DriverManager.getConnection(jdbcUrl);
      logger.info("Remote connection successful.");
      return con;
    }
    catch (ClassNotFoundException e) { logger.warn(e.toString());}
    catch (SQLException e) { logger.warn(e.toString());}
    }
    return null;
  }
```

如果您无法获取连接或运行 SQL 语句，请尝试将以下代码放入 JSP 文件中。此代码连接数据库实例，创建一个表并向表中写入。

```
<%@ page import="java.sql.*" %>
<%
  // Read RDS connection information from the environment
  String dbName = System.getProperty("RDS_DB_NAME");
  String userName = System.getProperty("RDS_USERNAME");
  String password = System.getProperty("RDS_PASSWORD");
  String hostname = System.getProperty("RDS_HOSTNAME");
  String port = System.getProperty("RDS_PORT");
  String jdbcUrl = "jdbc:mysql://" + hostname + ":" +
    port + "/" + dbName + "?user=" + userName + "&password=" + password;
  
  // Load the JDBC driver
  try {
    System.out.println("Loading driver...");
    Class.forName("com.mysql.jdbc.Driver");
    System.out.println("Driver loaded!");
  } catch (ClassNotFoundException e) {
    throw new RuntimeException("Cannot find the driver in the classpath!", e);
  }

  Connection conn = null;
  Statement setupStatement = null;
  Statement readStatement = null;
  ResultSet resultSet = null;
  String results = "";
  int numresults = 0;
  String statement = null;

  try {
    // Create connection to RDS DB instance
    conn = DriverManager.getConnection(jdbcUrl);
    
    // Create a table and write two rows
    setupStatement = conn.createStatement();
    String createTable = "CREATE TABLE Beanstalk (Resource char(50));";
    String insertRow1 = "INSERT INTO Beanstalk (Resource) VALUES ('EC2 Instance');";
    String insertRow2 = "INSERT INTO Beanstalk (Resource) VALUES ('RDS Instance');";
    
    setupStatement.addBatch(createTable);
    setupStatement.addBatch(insertRow1);
    setupStatement.addBatch(insertRow2);
    setupStatement.executeBatch();
    setupStatement.close();
    
  } catch (SQLException ex) {
    // Handle any errors
    System.out.println("SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
  } finally {
    System.out.println("Closing the connection.");
    if (conn != null) try { conn.close(); } catch (SQLException ignore) {}
  }

  try {
    conn = DriverManager.getConnection(jdbcUrl);
    
    readStatement = conn.createStatement();
    resultSet = readStatement.executeQuery("SELECT Resource FROM Beanstalk;");

    resultSet.first();
    results = resultSet.getString("Resource");
    resultSet.next();
    results += ", " + resultSet.getString("Resource");
    
    resultSet.close();
    readStatement.close();
    conn.close();

  } catch (SQLException ex) {
    // Handle any errors
    System.out.println("SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
  } finally {
       System.out.println("Closing the connection.");
      if (conn != null) try { conn.close(); } catch (SQLException ignore) {}
  }
%>
```

要显示结果，请将以下代码放入 JSP 文件 HTML 部分的正文中。

```
<p>Established connection to RDS. Read first two rows: <%= results %></p>
```

## 数据库连接问题排查
<a name="create_deploy_Java.rds.troubleshooting"></a>

**尝试使用 Amazon Q 开发者版 CLI 进行人工智能辅助故障排除**  
 Amazon Q 开发者版 CLI 可以帮助您针对环境问题快速进行故障排除。Q CLI 可通过检查环境状态、审核事件、分析日志和询问澄清问题来提供解决方案。有关更多信息和详细演练，请参阅博客中的使用 [Amazon Q Developer CLI 对 Elastic Beanstalk 环境进行故障排除](https://aws.amazon.com/blogs/devops/troubleshooting-elastic-beanstalk-environments-with-amazon-q-developer-cli/)。 AWS 

如果您从应用程序中连接数据库时遇到问题，请查看 Web 容器日志和数据库。

### 查看日志
<a name="create_deploy_Java.rds.troubleshooting.logs"></a>

您可以从 Eclipse 中查看 Elastic Beanstalk 环境中的所有日志。如果您没有打开 AWS 资源管理器视图，请选择工具栏中橙色 AWS 图标旁边的箭头，然后选择 “**显示 AWS 资源管理器视图**”。展开 **AWS Elastic Beanstalk** 和您的环境名称，然后打开服务器的上下文（右键单击）菜单。选择 **Open in WTP Server Editor**（在 WTP Server Editor 中打开）。

 选择 **Server**（服务器）视图的 **Log**（日志）选项卡以查看环境中的聚合日志。要打开最新日志，请选择页面右上角的 **Refresh**（刷新）按钮。

 向下滚动以在 `/var/log/tomcat7/catalina.out` 中找到 Tomcat 日志。如果您已在前面的示例中多次加载网页，可能会看到以下内容。

```
-------------------------------------
/var/log/tomcat7/catalina.out
-------------------------------------
INFO: Server startup in 9285 ms
Loading driver...
Driver loaded!
SQLException: Table 'Beanstalk' already exists
SQLState: 42S01
VendorError: 1050
Closing the connection.
Closing the connection.
```

Web 应用程序发送到标准输出的所有信息都会显示在 Web 容器日志中。在上一示例中，每次加载页面时，应用程序都会尝试创建表。这导致在第一次页面加载后，每次页面加载时都会捕获 SQL 异常。

作为示例，上述行为是可接受的。但在实际应用程序中，应将数据库定义保留在架构对象中，从模型类中执行事务并与控制器 servlet 协调请求。

### 连接到 RDS 数据库实例
<a name="create_deploy_Java.rds.troubleshooting.connecting"></a>

 您可以使用 MySQL 客户端应用程序直接连接到 Elastic Beanstalk 环境中的 RDS 数据库实例。

 您首先需要对 RDS 数据库实例开放安全组以允许来自计算机的流量。

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

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

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

1. 在 **Database (数据库)** 配置类别中，选择 **Edit (编辑)**。

1. 在 **Endpoint**（端点）旁边，选择 Amazon RDS 控制台链接。

1. 在 **RDS Dashboard**（RDS 控制面板）实例详细信息页面上的 **Security and Network**（安全与网络）下，选择 **Security Groups**（安全组）旁边的以 *rds-* 开头的安全组。
**注意**  
数据库可能有多个标记为 **Security Groups**（安全组）的条目。仅当您拥有不具有默认 [Amazon Virtual Private Cloud](https://docs.aws.amazon.com/vpc/latest/userguide/) (Amazon VPC) 的旧账户时，才应使用第一个条目（以 *awseb* 开头）。

1. 在 **Security group details**（安全组详细信息）中，选择 **Inbound**（入站）选项卡，然后选择 **Edit**（编辑）。

1. 为 MySQL (端口 3306) 添加一个允许来自 IP 地址 (以 CIDR 格式指定) 的流量的规则。

1. 选择 **Save**。更改将立即生效。

 返回到环境的 Elastic Beanstalk 配置详细信息并记下终端节点。您将使用域名连接到 RDS 数据库实例。

 安装 MySQL 客户端并在端口 3306 上发起与数据库的连接。在 Windows 上，从 MySQL 主页安装 MySQL Workbench 并按照提示操作。

 在 Linux 上，使用适用于您的分发版的程序包管理器安装 MySQL 客户端。以下示例对 Ubuntu 和其他 Debian 衍生物有效。

```
// Install MySQL client
$ sudo apt-get install mysql-client-5.5
...
// Connect to database
$ mysql -h aas839jo2vwhwb.cnubrrfwfka8.us-west-2.rds.amazonaws.com -u username -ppassword ebdb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 117
Server version: 5.5.40-log Source distribution
...
```

连接之后，您可以运行 SQL 命令以查看数据库状态，了解是否已创建表和行及其他信息。

```
mysql> SELECT Resource from Beanstalk;
+--------------+
| Resource     |
+--------------+
| EC2 Instance |
| RDS Instance |
+--------------+
2 rows in set (0.01 sec)
```

# Java 工具和资源
<a name="create_deploy_Java.resources"></a>

在开发 Java 应用程序时，您可以在多个地方获取额外的帮助。


****  

|  资源  |  说明  | 
| --- | --- | 
|  [AWS Java 开发论坛](https://forums.aws.amazon.com/forum.jspa?forumID=70)  | 发布您的问题并获取反馈。 | 
|  [Java 开发人员中心](https://aws.amazon.com/java/)  | 示例代码、文档、工具和其他资源的一站式商店。 | 