

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

# 创建堆栈并运行应用程序
<a name="create-custom-stack"></a>

**重要**  
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止，新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问，请通过 re [AWS : Post 或通过 Pre](https://repost.aws/) mium Su [AWS pp](https://aws.amazon.com/support) ort 与 AWS 支持 团队联系。

这部分介绍如何使用 Tomcat 说明书实施可运行名为 SimpleJSP 的简单的 Java 服务器页面 (JSP) 应用程序的基本堆栈设置。该堆栈由一个名为的基于 Tomcat 的自定义层和 TomCustom 一个 MySQL 层组成。SimpleJSP 已部署到 MySQL 数据库 TomCustom 并显示一些来自 MySQL 数据库的信息。如果您还不熟悉如何使用 OpsWorks Stacks 的基础知识，则应先阅读[Chef 11 Linux 堆栈入门](gettingstarted.md)。

## SimpleJSP 应用程序
<a name="create-custom-stack-jsp"></a>

SimpleJSP 应用程序演示了关于如何设置数据库连接以及从堆栈的 MySQL 数据库中检索数据的基础知识。

```
<html>
  <head>
    <title>DB Access</title>
  </head>
  <body>
    <%@ page language="java" import="java.sql.*,javax.naming.*,javax.sql.*" %>
    <%
      StringBuffer output = new StringBuffer();
      DataSource ds = null;
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
      try {
        Context initCtx = new InitialContext();
        ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/mydb");
        con = ds.getConnection();
        output.append("Databases found:<br>");
        stmt = con.createStatement();
        rs = stmt.executeQuery("show databases");
        while (rs.next()) {
          output.append(rs.getString(1));
          output.append("<br>");
        }
      }
      catch (Exception e) {
        output.append("Exception: ");
        output.append(e.getMessage());
        output.append("<br>");
      }
      finally {
        try {
          if (rs != null) {
            rs.close();
          }
          if (stmt != null) {
            stmt.close();
          }
          if (con != null) {
            con.close();
          }
        }
        catch (Exception e) {
          output.append("Exception (during close of connection): ");
          output.append(e.getMessage());
          output.append("<br>");
        }
      }
    %>
    <%= output.toString() %>
  </body>
</html>
```

SimpleJSP 使用 `DataSource` 对象与 MySQL 数据库进行通信。Tomcat 使用 [Web 应用程序上下文配置文件](create-custom-configure.md#create-custom-configure-context)中的数据来创建并初始化 `DataSource` 对象，然后将其绑定到一个逻辑名称。然后，它向 Java 命名和目录接口 (JNDI) 命名服务注册该逻辑名称。要获取相应的 `DataSource` 对象的实例，您可以创建一个 `InitialContext` 对象，将资源的逻辑名称传递给该对象的 `lookup` 方法，该方法将检索相应的对象。SimpleJSP 示例的逻辑名称 `java:comp/env/jdbc/mydb` 拥有以下组件：
+ 根命名空间 `java` 通过一个冒号 (:) 与名称的其余部分分隔开来。
+ 任何其他命名空间都通过正斜杠 (/) 分隔开来。

  Tomcat 会自动将资源添加到 `comp/env` 命名空间。
+ 资源名称，它在 Web 应用程序上下文配置文件中定义，并通过正斜杠与命名空间分隔开来。

  此示例中的资源名称为 `jdbc/mydb`。

为了建立与数据库之间的连接，SimpleJSP 将执行以下操作：

1. 调用 `DataSource` 对象的 `getConnection` 方法，该方法将返回一个 `Connection` 对象。

1. 调用 `Connection` 对象的 `createStatement` 方法以创建一个 `Statement` 对象，您可以使用该对象来与数据库通信。

1. 通过调用相应的 `Statement` 方法与数据库进行通信。

   SimpleJSP 调用 `executeQuery` 以执行 SHOW DATABASES 查询，这会列出服务器的数据库。

`executeQuery` 方法将返回一个包含查询结果的 `ResultSet` 对象。SimpleJSP 从返回的 `ResultSet` 对象中获取数据库名称，并将这些名称联接起来创建一个输出字符串。最后，该示例关闭 `ResultSet`、`Statement` 和 `Connection` 对象。有关 JSP 和 JDBC 的更多信息，请分别参见 P [JavaServer ages Tech](http://docs.oracle.com/javaee/5/tutorial/doc/bnagx.html) nology 和 [JD](http://docs.oracle.com/javase/tutorial/jdbc/basics/) BC 基础知识。

要将 SimpleJSP 与堆栈一起使用，您必须将其放到存储库中。您可以使用任何受支持的存储库，但要将 SimpleJSP 与以下部分中讨论的示例堆栈一起使用，您必须将其放到公有 S3 存档中。有关如何使用其他标准存储库的信息，请参阅[说明书存储库](workingcookbook-installingcustom-repo.md)。

**将 SimpleJSP 放到 S3 存档存储库中**

1. 将示例代码复制到名为 `simplejsp.jsp` 的文件中，并将该文件放到名为 `simplejsp` 的目录中。

1. 创建 `simplejsp` 目录的 `.zip` 存档。

1. 创建一个 Amazon S3 存储桶，将 `simplejsp.zip` 上传到该存储桶，并将该文件设置为公有。

   有关如何执行此任务的说明，请参阅 [Amazon Simple Storage Service 入门](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)。

## 创建堆栈
<a name="create-custom-stack-stack"></a>

要运行 SimpleJSP，您需要一个包含以下层的堆栈。
+ 一个支持后端 MySQL 服务器的 MySQL 层。
+ 一个使用 Tomcat 说明书以支持 Tomcat 服务器实例的自定义层。

**要创建 堆栈，请执行以下操作：**

1. 在 “ OpsWorks 堆栈” 仪表板上，单击 “**添加堆栈**” 以创建新堆栈，然后单击 “**高级 >>**” 以显示所有选项。按如下所示配置堆栈。
   + **名称**-用户定义的堆栈名称；本示例使用 TomStack。
   + **使用自定义 Chef 说明书 **-将切换设置为 **是 **，这会显示一些其他选项。
   + **Repository type** - Git
   + **存储库 URL**-`git://github.com/amazonwebservices/opsworks-example-cookbooks.git`。
   + **自定义 Chef JSON **-添加以下 JSON：

     ```
     {
       "tomcat": {
         "base_version": 7,
         "java_opts": "-Djava.awt.headless=true -Xmx256m"
       },
       "datasources": {
         "ROOT": "jdbc/mydb"
       }
     }
     ```

   对于其余选项，您可以接受默认值。

   自定义 JSON 执行以下操作：
   + 覆盖 Tomcat 说明书的 `['base_version']` 属性，以将 Tomcat 版本设置为 7；默认值为 6。
   + 覆盖 Tomcat 说明书的 `['java_opts']` 属性，以指定该实例处于无管控状态，并将 JVM 最大堆大小指定为 256MB；默认值并不会为运行 Amazon Linux 的实例设置选项。
   + 指定 `['datasources]` 属性值，这会将 JDBC 资源名称 (jdbc/mydb) 分配给 Web 应用程序上下文名称 (ROOT)，如[tomcat::context](create-custom-configure.md#create-custom-configure-context)中所述。

     最后一个属性没有默认值；您必须使用自定义 JSON 设置该属性。  
![\[Configuration Management interface showing Chef version options and custom JSON input field.\]](http://docs.aws.amazon.com/zh_cn/opsworks/latest/userguide/images/tom_add_stack.png)

1. 单击 **Add a layer**。对于 **Layer type**，选择 **MySQL**。然后单击 **Add Layer**。

1. 在导航窗格中，单击 **Instances**，然后单击 **Add an instance**。单击 **Add Instance** 以接受默认值。在该实例对应的行中，单击 **start**。

1. 返回 **Layers** 页面并单击 **\$1 Layer** 以添加层。对于 **Layer type (层类型)**，单击 **Custom (自定义)**。该示例分别使用 **TomCustom** 和 **tomcustom** 作为层的名称和短名称。  
![\[Add Layer form with Custom layer type, Name, and Short name fields for creating a customized layer.\]](http://docs.aws.amazon.com/zh_cn/opsworks/latest/userguide/images/tom_add_custom_layer.png)

1. 在 **Layers** 页面上，对于自定义层，单击 **Recipes**，然后单击 **Edit**。在 **Custom Chef Recipes** 下，将 Tomcat 说明书配方分配给层的生命周期事件，如下所示：
   + 对于 **Setup (设置)**，键入 **tomcat::setup** 并单击 **\$1**。
   + 对于 **Configure (配置)**，键入 **tomcat::configure** 并单击 **\$1**。
   + 对于 **Deploy (部署)**，键入 **tomcat::deploy** 并单击 **\$1**。然后单击 **Save (保存)**。

     .  
![\[Custom Chef Recipes interface showing setup, configure, and deploy steps with options.\]](http://docs.aws.amazon.com/zh_cn/opsworks/latest/userguide/images/tom_events.png)

1. 在导航窗格中，单击 **Apps**，然后单击 **Add an app**。指定以下选项，然后单击 **Add App**：
   + **名称** —应用程序的名称；该示例使用 simpleJSP， OpsWorks Stacks 生成的短名称将是 simplejsp。
   + **应用程序类型 **-将此选项设置为 **其他**。

     OpsWorks Stacks 会自动将标准应用程序类型部署到关联的服务器实例。如果您将 **App type (应用程序类型)** 设置为“other (其他)”， OpsWorks Stacks 将仅运行 Deploy 配方，并使这些配方处理部署作业。
   + **Document root**-将此选项设置为 **ROOT**。

     **Document root** 值指定上下文名称。
   + **存储库类型 **-将此选项设置为 **S3 存档**。
   + **存储库 URL **-将此选项设置为您之前创建的应用程序的 URL。

   为其他选项使用默认设置。  
![\[Application settings form with fields for name, app type, document root, and source details.\]](http://docs.aws.amazon.com/zh_cn/opsworks/latest/userguide/images/tom_app.png)

1. 使用 “**实例**” 页面向 TomCustom 图层添加实例并启动该实例。 OpsWorks 安装配方完成后，堆栈会自动在新实例上运行 Deploy 配方，因此启动该实例也会部署 SimpleJSP。

1. 当 TomCustom 实例处于联机状态时，在 “实例” 页面上单击**实例**名称以查看其详细信息。复制公有 IP 地址。然后按如下方式构造一个 URL：http: *publicIP* ///tc*appname.jsp*/。例如，此 URL 应类似于 **http://50.218.191.172/tc/simplejsp.jsp**。
**注意**  
将请求转发到 Tomcat 的 Apache URL 被设置为默认 `['tomcat']['apache_tomcat_bind_path']` 属性 `/tc/`。SimpleJSP 文档根目录被设置为 `ROOT`，这是一个解析为 `/` 的特殊值。因此，该 URL 为“.../tc/simplejsp.jsp”。

1. 将上一步骤中的 URL 粘贴到您的浏览器中。您将看到以下内容：

   ```
   Databases found:
   information_schema
   simplejsp
   test
   ```
**注意**  
如果您的堆栈有 MySQL 实例， OpsWorks Stacks 会自动为每个应用程序创建一个数据库，并以应用程序的短名称命名。