

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

# 应用程序服务器层
<a name="workinglayers-servers"></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 支持 团队联系。

**注意**  
这些层仅适用于 Chef 11 和更早的基于 Linux 的堆栈。

OpsWorks Stacks 支持几种不同的应用程序服务器，其中 “应用程序” 包括静态网页。每种类型的服务器都有单独的 OpsWorks Stacks 层，其内置配方用于在每个层的实例上安装应用程序服务器和任何相关软件包、部署应用程序等。例如，Java App Server 层将安装多个程序包 (包括 Apache、Tomcat 和 OpenJDK)，并将 Java 应用程序部署到层的每个实例中。

以下是使用应用程序服务器层的基本步骤：

1. [创建一种可用的](workinglayers-basics-create.md) **App Server** 层类型。

1. [将一个或多个实例添加](workinginstances-add.md)到该层。

1. 创建应用程序并将应用程序部署到实例中。有关更多信息，请参阅 [应用程序](workingapps.md)。

1. (可选) 如果层有多个实例，您可以添加一个负载均衡器，以在这些实例之间分配传入流量。有关更多信息，请参阅 [HAProxy OpsWorks 堆叠层](layers-haproxy.md)。

**Topics**
+ [AWS Flow (Ruby) 层](workinglayers-awsflow.md)
+ [Java 应用服务器 OpsWorks 堆栈层](layers-java.md)
+ [Node.js 应用服务器 OpsWorks 堆栈层](workinglayers-node.md)
+ [PHP 应用服务器 OpsWorks 堆栈层](workinglayers-php.md)
+ [Rails 应用程序服务器 OpsWorks 堆栈层](workinglayers-rails.md)
+ [静态 Web 服务器 OpsWorks 堆栈层](workinglayers-static.md)

# AWS Flow (Ruby) 层
<a name="workinglayers-awsflow"></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 支持 团队联系。

**注意**  
此层仅适用于基于 Linux 的堆栈。

AWS Flow (Ruby) 层是一个 OpsWorks 堆栈层，它为托管 A [mazon](https://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-welcome.html) SWF 活动和工作流程工作人员的实例提供蓝图。工作线程通过使用适用于 [Ruby 的 AWS Flow Framework](https://docs.aws.amazon.com/amazonswf/latest/awsrbflowguide/welcome.html) 进行实施，AWS Flow Framework 是一个编程框架，可简化实施分布式的异步应用程序同时提供 Amazon SWF 的所有好处的过程。对于实施应用程序以满足广泛的场景 (包括业务流程、媒体编码、长时间运行的任务和后台处理) 来说，这是理想的做法。

AWS Flow (Ruby) 层包含以下配置设置。

**RubyGems 版本**  
框架的 Gem 版本。

**Bundler 版本**  
[Bundler](http://bundler.io/) 版本。

**EC2 实例配置文件**  
用户定义的 Amazon EC2 实例配置文件，供该层的实例使用。此配置文件必须授予在层的实例上运行的应用程序访问 Amazon EC2 的权限。

如果您的账户没有合适的配置文件，则可以选择**具有 SWF 访问权限的新建配置文件**让 OpsWorks Stacks 更新其配置文件，也可以使用 [IAM](https://console.aws.amazon.com/iam/) 控制台自行更新。然后，您可以为所有后继的 AWS Flow 层使用更新后的配置文件。以下是关于如何使用 IAM; 控制台创建配置文件的简短说明。有关更多信息，请参阅 [Amazon Simple Workflow Service 中的 Identity and Access Management](https://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dev-iam.html)。

**为 AWS Flow (Ruby) 实例创建配置文件**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中选择 **Policies**，然后选择 **Create Policy** 创建一个新的客户管理的策略。

1. 对于**服务**，选择 **SNS**。

1. 在**操作**中，选择**所有 SWF 操作(swf: \$1)**。

1. 对于 **(Amazon 资源名称 (ARN)**，一个指定工作线程可访问哪些 Amazon SWF 域的 ARN。选择 **All resources** 以提供对所有域的访问权。

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

1. （可选）输入标签来标识策略。

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

1. 完成后，选择 **Create policy**。

1. 在导航窗格中，选择 **Roles**，然后选择 **Create role**。

1. 指定角色名称，然后选择 **Next Step**。当创建角色后，您便无法更改角色名称。

1. 选择 **AWS 服务**，然后选择** EC2**。

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

1. 从**权限策略**列表中，选择您之前创建的策略。

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

1. 输入角色名称，然后选择**创建角色**。当创建角色后，您便无法更改角色名称。

1. 在 OpsWorks 堆栈中创建 AWS Flow (Ruby) 层时，请指定此配置文件。

# Java 应用服务器 OpsWorks 堆栈层
<a name="layers-java"></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 支持 团队联系。

**注意**  
此层仅适用于基于 Linux 的堆栈。

Java App Server 层是一个 OpsWorks 堆栈层，它为充当 Java 应用程序服务器的实例提供蓝图。该层基于 [Apache Tomcat 7.0](http://tomcat.apache.org/) 和 Ope [n](http://openjdk.java.net/) JDK 7。 OpsWorks Stacks 还会安装 Java 连接器库，该库允许 Java 应用程序使用 JDBC `DataSource` 对象连接到后端数据存储。

**安装**：Tomcat 安装在 `/usr/share/tomcat7` 中。

**Add Layer** 页面提供以下配置选项：

**Java VM 选项**  
您可以使用此设置来指定自定义 Java VM 选项；没有默认选项。例如，一组常见的选项是 `-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC`。如果您使用 **Java VM 选项**，请确保传递了一组有效的选项； OpsWorks Stacks 不会验证字符串。如果您试图传递无效的选项，Tomcat 服务器通常会无法启动，这会导致设置失败。如果出现这种情况，您可以检查实例的设置 Chef 日志以了解详细信息。有关如何查看和解释 Chef 日志的更多信息，请参阅[Chef 日志](troubleshoot-debug-log.md)。

**自定义安全组**  
如果您选择不自动将内置 OpsWorks Stacks 安全组与您的图层关联，则会显示此设置。您必须指定要将哪一安全组与层关联起来。有关更多信息，请参阅 [创建新堆栈](workingstacks-creating.md)。

**Elastic Load Balancer**  
您可以将 Elastic Load Balancing 负载均衡器连接到层的实例。有关更多信息，请参阅 [Elastic Load Balancing 层](layers-elb.md)。

您可以通过使用自定义 JSON 或自定义属性文件指定其他配置设置。有关更多信息，请参阅 [自定义配置](layers-java-config.md)。

**重要**  
如果您的 Java 应用程序使用 SSL，我们建议您尽可能禁用 SSLv3 SSL 以解决 [CVE-2014-3566](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566) 中描述的漏洞。有关更多信息，请参阅 [SSLv3 对于 Apache 服务器禁用](#layers-java-sslv3)。

**Topics**
+ [SSLv3 对于 Apache 服务器禁用](#layers-java-sslv3)
+ [自定义配置](layers-java-config.md)
+ [部署 Java 应用程序](layers-java-deploy.md)

## SSLv3 对于 Apache 服务器禁用
<a name="layers-java-sslv3"></a>

要禁用 SSLv3，必须修改 Apache 服务器`ssl.conf`的文件`SSLProtocol`设置。为此，您必须覆盖内置 [apache2 说明书](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.10/apache2)的 `ssl.conf.erb` 模板文件，Java App Server 层的 Setup 配方将使用该文件创建 `ssl.conf`。具体细节取决于您为层的实例指定的操作系统。以下总结了亚马逊 Linux 和 Ubuntu 系统所需的修改。 SSLv3 对于红帽企业 Linux (RHEL) 系统，会自动禁用。有关如何覆盖内置模板的更多信息，请参阅[使用自定义模板](workingcookbook-template-override.md)。

**Amazon Linux**  
这些操作系统的 `ssl.conf.erb` 文件位于 `apache2` 说明书的 `apache2/templates/default/mods` 目录中。下面显示了内置文件的相关部分。  

```
...
#SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

# enable only secure protocols: SSLv3 and TLSv1.2, but not SSLv2
SSLProtocol all -SSLv2
</IfModule>
```
覆盖 `ssl.conf.erb` 并修改 `SSLProtocol` 设置，如下所示。  

```
...
#SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

# enable only secure protocols: SSLv3 and TLSv1.2, but not SSLv2
SSLProtocol all -SSLv3 -SSLv2
</IfModule>
```

**Ubuntu 14.04 LTS**  
此操作系统的 `ssl.conf.erb` 文件位于 `apache2` 说明书的 `apache2/templates/ubuntu-14.04/mods` 目录中。下面显示了内置文件的相关部分。  

```
...
# The protocols to enable.
# Available values: all, SSLv3, TLSv1.2
# SSL v2 is no longer supported
SSLProtocol all
...
```
将此设置更改为以下内容。  

```
...
# The protocols to enable.
# Available values: all, SSLv3, TLSv1.2
# SSL v2 is no longer supported
SSLProtocol all -SSLv3 -SSLv2
...
```

# 自定义配置
<a name="layers-java-config"></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 支持 团队联系。

OpsWorks Stacks 将其他配置设置作为内置属性公开，这些属性都在命名空间中。`opsworks_java`您可以使用自定义 JSON 或自定义属性文件以覆盖内置属性并指定自定义值。例如，JVM 和 Tomcat 版本由内置 `jvm_version` 和 `java_app_server_version` 属性表示，两者均被设置为 7。您可以使用自定义 JSON 或自定义属性文件将两个属性都设置为 6，或仅将其中一个属性设置为 6。以下示例使用自定义 JSON 将这两个属性都设置为 6：

```
{
  "opsworks_java": {
    "jvm_version": 6,
    "java_app_server_version" : 6
  }
}
```

有关更多信息，请参阅 [使用自定义 JSON](workingstacks-json.md)。

自定义配置的另一个示例是通过覆盖 `use_custom_pkg_location`、`custom_pkg_location_url_debian` 和 `custom_pkg_location_url_rhel` 属性安装自定义 JDK。

**注意**  
如果您覆盖内置说明书，您将需要自己更新这些组件。

有关属性以及如何覆盖属性的更多信息，请参阅[覆盖属性](workingcookbook-attributes.md)。要查看内置属性的列表，请参阅[opsworks\$1java 属性](attributes-recipes-java.md)。

# 部署 Java 应用程序
<a name="layers-java-deploy"></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 支持 团队联系。

以下主题介绍了如何将应用程序部署到 Java App Server 层的实例中。示例针对的都是 JSP 应用程序，但安装其他类型的 Java 应用程序时，您可以使用基本相同的安装过程。

您可以从任何受支持的存储库中部署 JSP 页面。如果你想部署 WAR 文件，请注意， OpsWorks Stacks 会自动提取从 Amazon S3 或 HTTP 存档中部署的 WAR 文件，而不是从 Git 或 Subversion 存储库中提取部署的 WAR 文件。如果您想要为 WAR 文件使用 Git 或 Subversion，您可以执行以下操作之一：
+ 将提取的存档存储在存储库中。
+ 将 WAR 文件存储到存储库中，并使用 Chef 部署挂钩提取存档，如下例中所述。

您可以在四个部署阶段的任一阶段使用 Chef 部署挂钩在实例上运行用户提供的 Ruby 应用程序。应用程序名称决定着阶段。以下是一个名为 `before_migrate.rb` 的 Ruby 应用程序的示例，该应用程序可从 Git 或 Subversion 存储库中提取已部署的 WAR 文件。名称将应用程序与 Checkout 部署挂钩关联起来，以便它在部署操作开始时 (检查代码之后，迁移之前) 运行。有关如何使用此示例的更多信息，请参阅[使用 Chef 部署挂钩](workingcookbook-extend-hooks.md)。

```
::Dir.glob(::File.join(release_path, '*.war')) do |archive_file|
  execute "unzip_#{archive_file}" do
    command "unzip #{archive_file}"
    cwd release_path
  end
end
```

**注意**  
当您为 JSP 应用程序部署更新时，Tomcat 可能无法识别该更新，而是继续运行现有的应用程序版本。在某些情况下，比如当您将您的应用程序作为仅包含一个 JSP 页面的 .zip 文件时，可能会发生这种情况。要确保 Tomcat 将运行最近部署的版本，项目的根目录应包含放置了 `web.xml` 文件的 WEB-INF 目录。`web.xml` 文件可包含各种内容，但以下内容足以确保 Tomcat 识别更新并运行当前部署的应用程序版本。您无需为每个更新更改版本。Tomcat 将识别更新，即使版本未发生更改。  

```
<context-param>
  <param-name>appVersion</param-name>
  <param-value>0.1</param-value>
</context-param>
```

**Topics**
+ [部署 JSP 应用程序](#layers-java-deploy-jsp)
+ [部署 JSP 应用程序附带后端数据库](#layers-java-deploy-jsp-db)

## 部署 JSP 应用程序
<a name="layers-java-deploy-jsp"></a>

要部署 JSP 应用程序，指定名称和存储库信息。您也可以选择性地指定域和 SSL 设置。有关如何创建应用程序的更多信息，请参阅[添加应用程序](workingapps-creating.md)。以下过程介绍了如何在公有 Amazon S3 存档中创建和部署一个简单的 JSP 页面。有关如何使用其他存储库类型 (包括私有 Amazon S3 存档) 的信息，请参阅 [应用程序源](workingapps-creating.md#workingapps-creating-source)。

以下示例显示了 JSP 页面，该页面仅显示某些系统信息。

```
<%@ page import="java.net.InetAddress" %>
<html>
<body>
<%
    java.util.Date date = new java.util.Date();
    InetAddress inetAddress = InetAddress.getLocalHost();
%>
The time is 
<%
    out.println( date );
    out.println("<br>Your server's hostname is "+inetAddress.getHostName());
%>
<br>
</body>
</html>
```

**注意**  
以下过程假定您已熟悉关于创建堆栈、将实例添加到层等的基础知识。如果你不熟悉 OpsWorks Stacks，你应该先看看[Chef 11 Linux 堆栈入门](gettingstarted.md)。

**从 Amazon S3 存档部署 JSP 页面**

1. [创建带有 Java App Server 层的堆栈](workingstacks-creating.md)，[将一个全天候实例添加](workinginstances-add.md)到层中，然后[启动实例](workinginstances-starting.md)。

1. 将代码复制到名为 `simplejsp.jsp` 的文件中，将该文件放到名为 `simplejsp` 的文件夹中，然后创建该文件夹的 `.zip` 存档。名称是任意的；您可以按照您的意愿使用任何文件或文件夹名称。您也可以使用其他类型的存档，包括 gzip、bzip2、tarball 或 Java WAR 文件。请注意， OpsWorks Stacks 不支持未压缩的压缩包。要部署多个 JSP 页面，将这些页面放到相同的存档中。

1. 将该存档上传到 Amazon S3 存储桶，并将该文件设置为公有。复制该文件的 URL 以备后用。有关如何创建存储桶和上传文件的更多信息，请转至 [Amazon Simple Storage Service 入门指南](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)。

1. [将一个应用程序添加](workingapps-creating.md#workingapps-creating-general)到堆栈并指定以下设置：
   + **名称** – `SimpleJSP`
   + **App type** - `Java`
   + **Repository type** – `Http Archive`
   + **Repository URL** -存档文件的 Amazon S3 URL。

   对其余设置使用默认值，然后单击 **Add App** 创建应用程序。

1. [将应用程序部署](workingapps-deploying.md)到 Java App Server 实例。

现在，您可以转到应用程序的 URL 并查看应用程序。如果您未指定域，您可以使用实例的公有 IP 地址或其公有 DNS 名称构建一个 URL。要获取实例的公有 IP 地址或公有 DNS 名称，请转到 OpsWorks Stacks 控制台，然后在 “实例” 页面上单击该**实例**的名称以打开其详细信息页面。

网址的其余部分取决于应用程序的短名称，该名称是 OpsWorks Stacks 根据您在创建应用程序时指定的应用程序名称生成的小写名称。例如，SimpleJSP 的短名称是 simplejsp。您可以从应用程序的详细信息页面中获得应用程序的短名称。
+ 如果短名称为 `root`，您可以使用 `http://public_DNS/appname.jsp` 或 `http://public_IP/appname.jsp`。
+ 否则，您可以使用 `http://public_DNS/app_shortname/appname.jsp` 或 `http://public_IP/app_shortname/appname.jsp`。

如果您已经为应用程序指定了域，则 URL 为 `http://domain/appname.jsp`。

此示例中的 URL 将如下所示：`http://192.0.2.0/simplejsp/simplejsp.jsp`。

如果您希望将多个应用程序部署到同一个实例，则您不应当使用 `root` 作为短名称。这可能会导致 URL 冲突，从而妨碍应用程序正常运行。而应当为每个应用程序分配不同的域名。

## 部署 JSP 应用程序附带后端数据库
<a name="layers-java-deploy-jsp-db"></a>

JSP 页面可以使用 JDBC `DataSource` 对象连接到一个后端数据库。您可以通过上一部分中的步骤创建和部署此类应用程序，另外再执行一个设置连接的步骤即可。

以下 JSP 页面介绍如何连接到 `DataSource` 对象。

```
<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>
```

OpsWorks Stacks 创建和初始化`DataSource`对象，将其绑定到逻辑名称，然后在 Java 命名和目录接口 (JNDI) 命名服务中注册该名称。完整的逻辑名称为 `java:comp/env/user-assigned-name`。您必须通过将自定义 JSON 属性添加到堆栈配置和部署属性定义 `['opsworks_java']['datasources']` 属性，来指定名称中用户分配的部分，如下所述。

**部署可连接到 MySQL 数据库的 JSP 页面**

1. [创建带有 Java App Server 层的堆栈](workingstacks-creating.md)，[将一个全天候实例添加](workinginstances-add.md)到每个层中，然后[启动实例](workinginstances-starting.md)。

1. 将一个数据库层添加到堆栈中。具体细节取决于您使用的数据库。

   要为示例使用 MySQL 实例，[添加 MySQL 层](workinglayers-db-mysql.md)到堆栈，[添加全天候实例](workinginstances-add.md)到该层，然后[启动实例](workinginstances-starting.md#workinginstances-starting-start)。

   要为示例使用 Amazon RDS (MySQL) 实例：
   + 为实例指定 MySQL 数据库引擎。
   + 将 **AWS OpsWorks-db-Master-Server () *security\$1group\$1id* 和 AWS--OpsWorks** **Java-App-S** erver () 安全组分配给实例。*security\$1group\$1id* OpsWorks 当您在该地区创建第一个堆栈时，Stacks 会为您创建这些安全组。
   + 创建一个名为 `simplejspdb` 的数据库。
   + 确保主用户名和密码不包含 `&` 或其他可能会导致 Tomcat 错误的符号。

     尤其是在启动期间，Tomcat 必须解析 Web 应用程序上下文文件，该文件是一个 XML 文件，其中包含主密码和用户名。如果任一字符串包含一个 `&` 字符，XML 分析器就会将其视为格式不正确的 XML 实体，并引发解析异常，从而阻止 Tomcat 启动。有关 Web 应用程序上下文文件的更多信息，请参阅[tomcat::context](create-custom-configure.md#create-custom-configure-context)。
   + [将一个 MySQL 驱动程序添加](workingapps-connectdb.md)到 Java App Server 层中。
   + [向您的堆栈注册 RDS 实例](workinglayers-db-rds.md#workinglayers-db-rds-register)。

   有关如何使用带有 OpsWorks 堆栈的 Amazon RDS 实例的更多信息，请参阅[Amazon RDS 服务层](workinglayers-db-rds.md)。

1. 将示例代码复制到名为 `simplejspdb.jsp` 的文件中，将该文件放到名为 `simplejspdb` 的文件夹中，然后创建该文件夹的 `.zip` 存档。名称是任意的；您可以按照您的意愿使用任何文件或文件夹名称。您还可以使用其他类型的存档，包括 gzip、bzip2 或 tarball。要部署多个 JSP 页面，将这些页面放到相同的存档中。有关如何部署其他存储库类型中的应用程序的信息，请参阅[应用程序源](workingapps-creating.md#workingapps-creating-source)。

1. 将该存档上传到 Amazon S3 存储桶，并将该文件设置为公有。复制该文件的 URL 以备后用。有关如何创建存储桶和上传文件的更多信息，请转至 [Amazon Simple Storage Service 入门指南](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)。

1. [将一个应用程序添加](workingapps-creating.md#workingapps-creating-general)到堆栈并指定以下设置：
   + **名称** – `SimpleJSPDB`
   + **App type** - `Java`
   + **数据源类型** — **OpsWorks**（对于 MySQL 实例）或 **RDS**（对于 Amazon RDS 实例）。
   + **数据库实例** — 您之前创建的 MySQL 实例，通常命名为 **db-master1 (mysql)，或者命名为 (mysql)** 的 Amazon RDS 实例 ***DB\$1instance\$1name*(**mysql)。
   + **数据库名称** – `simplejspdb`。
   + **Repository type** – `Http Archive`
   + **Repository URL** -存档文件的 Amazon S3 URL。

   对其余设置使用默认值，然后单击 **Add App** 创建应用程序。

1. 将以下自定义 JSON 属性添加到堆栈配置属性，其中 simplejspdb 是应用程序的短名称。

   ```
   {
     "opsworks_java": {
       "datasources": {
         "simplejspdb": "jdbc/mydb" 
       }
     }
   }
   ```

   OpsWorks Stacks 使用此映射生成包含必要数据库信息的上下文文件。

   有关如何将自定义 JSON 属性添加到堆栈配置属性的更多信息，请参阅[使用自定义 JSON](workingstacks-json.md)。

1. [将应用程序部署](workingapps-deploying.md)到 Java App Server 实例。

现在，您可以使用应用程序的 URL 来查看应用程序。有关如何构建 URL 的介绍，请参阅[部署 JSP 应用程序](#layers-java-deploy-jsp)。

此示例中的 URL 将如下所示：`http://192.0.2.0/simplejspdb/simplejspdb.jsp`。

**注意**  
`datasources` 属性可以包含多个属性。每个属性都以应用程序短名称命名，并被设置为逻辑名称中适当的用户分配的部分。如果您有多个应用程序，您可以使用单独的逻辑名称，这需要一个类似于以下内容的自定义 JSON。  

```
{
  "opsworks_java": {
    "datasources": {
      "myjavaapp": "jdbc/myappdb",
      "simplejsp": "jdbc/myjspdb",
      ...
    }
  }
}
```

# Node.js 应用服务器 OpsWorks 堆栈层
<a name="workinglayers-node"></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 支持 团队联系。

**注意**  
此层仅适用于基于 Linux 的堆栈。

Node.js App Server 层是一个 OpsWorks Stacks 层，它为充当 [Node.js](http://nodejs.org/) 应用程序服务器的实例提供蓝图。 OpsWorks Stacks 还会安装 [Express](http://expressjs.com/)，因此该层的实例同时支持标准和 Express 应用程序。

**安装**：Node.js 安装在 `/usr/local/bin/node` 中。

**Add Layer** 页面提供以下配置选项：

**Node.js 版本**  
有关当前支持的版本的列表，请参阅[OpsWorks 堆栈操作系统](workinginstances-os.md)。

**自定义安全组**  
如果您选择不自动将内置 OpsWorks Stacks 安全组与您的图层关联，则会显示此设置。您必须指定要将哪一安全组与层关联起来。有关更多信息，请参阅 [创建新堆栈](workingstacks-creating.md)。

**Elastic Load Balancer**  
您可以将 Elastic Load Balancing 负载均衡器连接到层的实例。

**重要**  
如果您的 Node.js 应用程序使用 SSL，我们建议您尽可能禁用 SSLv3 ，以解决 [CVE-2015-8027](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8027) 中描述的漏洞。为此，您必须将 **Node.js version** 设置为 `0.12.9`。

## 部署 Node.js 应用程序
<a name="w2ab1c14c71b9c21c21c19c17"></a>

有关如何为 OpsWorks Stacks 实施简单的 Node.js 应用程序并将其部署到一个堆栈的详细演练，请参阅[创建您的第一个 Node.js 堆栈](gettingstarted-node.md)。一般而言， OpsWorks Stacks 的 Node.js 应用程序应满足以下条件：
+ 主文件必须命名为 `server.js` 且驻留在部署的应用程序的根目录下。
+ [Express](http://expressjs.com/) 应用程序必须将 `package.json` 文件放在应用程序的根目录下。
+ 默认情况下，应用程序必须侦听端口 80 (HTTP) 或端口 443 (HTTPS)。

  可以在其他端口上进行侦听，但是 Node.js App Server 层的内置安全组 **AWS OpsWorks-nodejs-App-Server** 仅允许进入端口 80、443 和 22 (SSH) 的入站用户流量。要允许流入其他端口的入站用户流量，请使用适当的入站规则[创建安全组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)并[将其分配给 Node.js App Server 层](workinglayers-basics-edit.md#workinglayers-basics-edit-security)。请勿通过编辑内置安全组来修改入站规则。每次创建堆栈时，Stac OpsWorks ks 都会使用标准设置覆盖内置安全组，因此您所做的任何更改都将丢失。

**注意**  
OpsWorks Stacks 将 PORT 环境变量设置为 80（默认）或 443（如果您启用 SSL），因此您可以使用以下代码来侦听请求。  

```
app.listen(process.env.PORT);
```

如果您[将 Node.js 应用程序配置为支持 SSL](workingapps-creating.md#workingapps-creating-domain-ssl)，则必须指定密钥和证书。 OpsWorks Stacks 将每个应用服务器实例的数据作为单独的文件放在`/srv/www/app_shortname/shared/config`目录中，如下所示。
+ `ssl.crt`- SSL 证书。
+ `ssl.key`- SSL 密钥。
+ `ssl.ca`-链证书（如果您已经指定了一个）。

您的应用程序可以从这些文件中获取 SSL 密钥和证书。

# PHP 应用服务器 OpsWorks 堆栈层
<a name="workinglayers-php"></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 支持 团队联系。

**注意**  
此层仅适用于基于 Linux 的堆栈。

PHP App Server 层是一个 OpsWorks 堆栈层，它为充当 PHP 应用程序服务器的实例提供蓝图。PHP App Server 层基于包含 `mod_php` 的 [Apache2](http://httpd.apache.org/)，没有标准配置选项。PHP 和 Apache 版本取决于您为层的实例指定了哪一[操作系统](workinginstances-os.md)。


| 操作系统 | PHP 版本 | Apache 版本 | 
| --- | --- | --- | 
| Amazon Linux 2018.03 | 5.3 | 2.2 | 
| Amazon Linux 2017.09 | 5.3 | 2.2 | 
| Amazon Linux 2017.03 | 5.3 | 2.2 | 
| Amazon Linux 2016.09 | 5.3 | 2.2 | 
| Amazon Linux 2016.03 | 5.3 | 2.2 | 
| Amazon Linux 2015.09 | 5.3 | 2.2 | 
| Amazon Linux 2015.03 | 5.3 | 2.2 | 
| Amazon Linux 2014.09 | 5.3 | 2.2 | 
| Ubuntu 14.04 LTS | 5.5 | 2.4 | 

**安装**： OpsWorks Stacks 使用实例的软件包安装程序`mod_php`在默认位置安装 Apache2。有关安装的更多信息，请参阅 [Apache](http://httpd.apache.org/)。

**Add Layer** 页面提供以下配置选项：

**自定义安全组**  
如果您选择不自动将内置 OpsWorks Stacks 安全组与您的图层关联，则会显示此设置。您必须指定要将哪一安全组与层关联起来。有关更多信息，请参阅 [创建新堆栈](workingstacks-creating.md)。

**Elastic Load Balancer**  
您可以将 Elastic Load Balancing 负载均衡器连接到层的实例。

您可以使用自定义 JSON 或自定义属性文件来修改某些 Apache 配置设置。有关更多信息，请参阅 [覆盖属性](workingcookbook-attributes.md)。要查看可以覆盖的 Apache 属性的列表，请参阅[apache2 属性](attributes-recipes-apache.md)。

有关如何部署 PHP 应用程序 (包括如何将应用程序连接到后端数据库) 的示例，请参阅[Chef 11 Linux 堆栈入门](gettingstarted.md)。

**重要**  
如果您的 PHP 应用程序使用 SSL，我们建议您尽可能禁用 SSLv3 ，以解决 [CVE-2014-3566](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566) 中描述的漏洞。为此，您必须修改 Apache 服务器的 `SSLProtocol` 文件中的 `ssl.conf` 设置。有关如何修改此设置的更多信息，请参阅[SSLv3 对于 Apache 服务器禁用](layers-java.md#layers-java-sslv3)。

# Rails 应用程序服务器 OpsWorks 堆栈层
<a name="workinglayers-rails"></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 支持 团队联系。

**注意**  
此层仅适用于基于 Linux 的堆栈。

Rails App Server 层是一个 OpsWorks 堆栈层，它为充当 Rails 应用程序服务器的实例提供蓝图。

**安装**： OpsWorks Stacks 使用实例的软件包安装程序将服务器软件包安装到其默认位置。有关 Apache/Passenger 安装的更多信息，请参阅 [Phusion 乘客](https://www.phusionpassenger.com/)。有关日志记录的更多信息，请参阅 [Log Files](http://httpd.apache.org/docs/2.2/logs.html)。有关 Nginx/Unicorn 安装的更多信息，请参阅 [Unicorn](http://unicorn.bogomips.org/)。

**Add Layer** 页面提供以下配置选项，所有这些选项都是可选的。

**Ruby 版本**  
您的应用程序将使用的 Ruby 版本。默认值为 2.3。  
您还可以通过[覆盖 `[:opsworks][:ruby_version]`](workingcookbook-attributes.md) 属性来指定您的首选 Ruby 版本。  
OpsWorks Stacks 会安装一个单独的 Ruby 软件包，供配方和实例代理使用。有关更多信息，请参阅 [Ruby 版本](workingcookbook-ruby.md)。

**Rails 堆栈**  
默认 Rails 堆栈为包含 [Phusion Passenger](http://httpd.apache.org/) 的 [Apache2](https://www.phusionpassenger.com/)。您还可以使用包含 [Unicorn](http://nginx.org/en/) 的 [Nginx](http://unicorn.bogomips.org/)。  
如果您使用 Nginx 和 Unicorn，则必须将 unicorn gem 添加到您的应用程序的 Gemfile 中，如以下示例中所示：  

```
source 'https://rubygems.org'
gem 'rails', '3.2.15'
...
# Use unicorn as the app server
gem 'unicorn'
...
```

**Passenger 版本**  
如果您已经指定了 Apache2/Passenger，则您必须指定 Passenger 版本。默认值是 5.0.28。

**Rubygems 版本**  
默认 [Rubygems](http://rubygems.org/) 版本是 2.5.1

**安装并托管 Bundler**  
允许您选择是否安装并托管 [Bundler](http://gembundler.com/)。默认值是 **Yes**。

**Bundler 版本**  
默认 Bundler 版本是 1.12.5。

**自定义安全组**  
如果您选择不自动将内置 OpsWorks Stacks 安全组与您的图层关联，则会显示此设置。您必须指定要将哪一安全组与层关联起来。有关更多信息，请参阅 [创建新堆栈](workingstacks-creating.md)。

**Elastic Load Balancer**  
您可以将 Elastic Load Balancing 负载均衡器连接到层的实例。

您可以使用自定义 JSON 或自定义属性文件来修改某些配置设置。有关更多信息，请参阅 [覆盖属性](workingcookbook-attributes.md)。要查看可以覆盖的 Apache、Nginx、Phusion Passenger 和 Unicorn 属性的列表，请参阅[内置说明书属性](attributes-recipes.md)。

**重要**  
如果您的 Ruby on Rails 应用程序使用 SSL，我们建议您尽可能禁用 SSLv3 ，以解决 [CVE-2014-3566](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566) 中描述的漏洞。有关更多信息，请参阅 [对 Rail SSLv3 s 服务器禁用](#workinglayers-rails-sslv3)。

**Topics**
+ [对 Rail SSLv3 s 服务器禁用](#workinglayers-rails-sslv3)
+ [连接到数据库](#workinglayers-rails-db)
+ [部署 Ruby on Rails 应用程序](#workinglayers-rails-deploy)

## 对 Rail SSLv3 s 服务器禁用
<a name="workinglayers-rails-sslv3"></a>

要禁 SSLv3 用 Rails 服务器，请将该层的 **Ruby 版本**设置更新为 2.1 或更高版本，这将安装 Ruby 2.1.4 或更高版本作为应用程序使用的版本。
+ 将层的 **Ruby Version (Ruby 版本)** 设置更新为 2.1 或更高版本。
+ 为您的 Rails 堆栈更新配置文件，如下所示。

**带 Phusion Passenger 的 Apache**  
更新 Apache 服务器的 `SSLProtocol` 文件中的 `ssl.conf` 设置，如[SSLv3 对于 Apache 服务器禁用](layers-java.md#layers-java-sslv3)中所述。

**带 Unicorn 的 Nginx**  
在 Nginx 服务器的 `ssl_protocols` 文件中添加一个显式 `nginx.conf` 指令。要禁用 SSLv3，请覆盖内置 [nginx 食谱](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.10/nginx)`nginx.conf.erb`的模板文件，Rails App Server 层的安装配方使用该文件来`nginx.conf`创建，然后添加以下指令：  

```
ssl_protocols TLSv1.2;
```
有关如何配置 `nginx.conf` 的更多信息，请参阅 [Configuring HTTPS servers](http://nginx.org/en/docs/http/configuring_https_servers.html)。有关如何覆盖内置模板的更多信息，请参阅[使用自定义模板](workingcookbook-template-override.md)。

## 连接到数据库
<a name="workinglayers-rails-db"></a>

部署应用程序时， OpsWorks Stacks 会使用来自应用程序[`deploy`属性的](workingcookbook-json.md#workingcookbook-json-deploy)信息创建一个新`database.yml`文件。如果您[将 MySQL 或 Amazon RDS 实例附加](workingapps-creating.md#workingapps-creating-data)到应用程序， OpsWorks Stacks 会将连接信息添加到`deploy`属性中，从而`database.yml`自动包含正确的连接数据。

如果应用程序没有附加数据库，则默认情况下， OpsWorks Stacks 不会向`deploy`属性添加任何连接信息，也不会创建`database.yml`。如果您希望使用不同的数据库，您可以使用自定义 JSON 将数据库属性以及连接信息添加到应用程序的 `deploy` 属性。属性都在下面`["deploy"]["appshortname"]["database"]`，其中*appshortname*是应用程序的短名称， OpsWorks Stacks根据应用程序名称生成该名称。您在自定义 JSON 中指定的值将覆盖任何默认设置。有关更多信息，请参阅 [添加应用程序](workingapps-creating.md)。

OpsWorks 堆栈将以下[`[:...][:database]`](attributes-json-deploy.md#attributes-json-deploy-app-db)属性值合并到。`database.yml`所需的属性取决于特定的数据库，但必须有`host`属性，否则 OpsWorks 堆栈将无法创建`database.yml`。
+ `[:adapter] (String)`-数据库适配器，如 `mysql`。
+ `[:database]`（字符串）-数据库名称。
+ `[:encoding]`（字符串）-编码，这通常被设置为 `utf8`。
+ `[:host]`（字符串）-主机 URL，如 `railsexample.cdlqlk5uwd0k.us-west-2.rds.amazonaws.com`。
+ `[:reconnect]`（布尔值）-如果连接不再存在，应用程序是否重新连接。
+ `[:password]`（字符串）-数据库密码。
+ `[:port]` (数字)。-数据库的端口号。使用此属性覆盖默认端口号，该属性由适配器设置。
+ `[:username]`（字符串）-数据库用户名称。

以下示例显示了其短名称为 *myapp* 的应用程序的自定义 JSON。

```
{
  "deploy" : {
    "myapp" : {
      "database" : {
        "adapter" : "adapter",
        "database" : "databasename",
        "host" : "host",
        "password" : "password",
        "port" : portnumber
        "reconnect" : true/false,
        "username" : "username"
      }
    }
  }
}
```

有关如何指定自定义 JSON 的信息，请参阅[使用自定义 JSON](workingstacks-json.md)。要查看用于创建 `database.yml` (`database.yml.erb`) 的模板，请转至[内置说明书存储库](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.4/rails/templates/default)。

## 部署 Ruby on Rails 应用程序
<a name="workinglayers-rails-deploy"></a>

您可以在任一受支持的存储库中部署 Ruby on Rails 应用程序。以下内容展示了如何将示例 Ruby on Rails 应用程序部署到运行 R Apache/Passenger ails 堆栈的服务器上。示例代码存储在公共存储 GitHub库中，但其他支持的存储库的基本过程相同。有关如何创建和部署应用程序的更多信息，请参阅[应用程序](workingapps.md)。要查看包含大量注释的示例代码，请转到 [https://github.com/awslabs/opsworks-demo-rails-photo-share-app](https://github.com/awslabs/opsworks-demo-rails-photo-share-app)。

**从 GitHub 存储库部署 Ruby on Rails 应用程序**

1. 使用 Apache/Passenger 作为 Rails [堆栈的 Rails App Server 层创建一个](workingstacks-creating.md)堆栈，向该层[添加一个全天候实例](workinginstances-add.md)，然后[启动它](workinginstances-starting.md)。

1. 当实例处于联机状态后，[将一个应用程序添加](workingapps-creating.md#workingapps-creating-general)到堆栈，并指定以下设置：
   + **Name** - 您喜欢的任何名称；示例中使用的是 `PhotoPoll`。

     OpsWorks Stacks 使用此名称进行显示，并生成一个短名称供内部使用，并在[堆栈配置和部署属性](workingcookbook-json.md)中标识应用程序。例如， PhotoPoll 简称是 photopoll。
   + **App type** - **Ruby on Rails**。
   + ** Rails environment** - 可用的环境由应用程序决定。

     示例应用程序有三个：**development**、**test** 和 **production**。在此示例中，将环境设置为 **development**。查看每个环境的描述的示例代码。
   + **Repository type** -任何受支持的存储库类型。在此示例中指定 `Git`
   + **Repository URL** - 将从其中部署代码的存储库。

     在此示例中，将 URL 设置为 **git://github.com/awslabs/opsworks-demo-rails-photo-share-app**。

   对其余设置使用默认值，然后单击 **Add App** 创建应用程序。

1. [将应用程序部署](workingapps-deploying.md)到 Rails App Server 实例。

1. 部署完成后，转到 **实例** 页面，然后单击 Rails App Server 实例的公有 IP 地址。您将看到以下内容：

![\[Congratulatory message for deploying first app with AWS OpsWorks, with stylized logo.\]](http://docs.aws.amazon.com/zh_cn/opsworks/latest/userguide/images/rails_example.png)


# 静态 Web 服务器 OpsWorks 堆栈层
<a name="workinglayers-static"></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 支持 团队联系。

**注意**  
此层仅适用于基于 Linux 的堆栈。

静态 Web 服务器层是一个 OpsWorks 堆栈层，它为提供静态 HTML 页面的实例提供模板，其中可能包括客户端脚本。此层基于 [Nginx](http://nginx.org/en/)。

**安装**：Nginx 安装在 `/usr/sbin/nginx` 中。

**Add Layer** 页面提供以下配置选项：

**自定义安全组**  
如果您选择不自动将内置 OpsWorks Stacks 安全组与您的图层关联，则会显示此设置。您必须指定要将哪一安全组与层关联起来。有关更多信息，请参阅 [创建新堆栈](workingstacks-creating.md)。

**Elastic Load Balancer**  
您可以将 Elastic Load Balancing 负载均衡器连接到层的实例。

您可以使用自定义 JSON 或自定义属性文件来修改某些 Nginx 配置设置。有关更多信息，请参阅 [覆盖属性](workingcookbook-attributes.md)。要查看可以覆盖的 Apache 属性的列表，请参阅[nginx 属性](attributes-recipes-nginx.md)。

**重要**  
如果您的 Web 应用程序使用 SSL，我们建议您尽可能禁用 SSLv3 SSL 以解决 [CVE-2014-3566](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566) 中描述的漏洞。  
要禁用 SSLv3，必须修改 Nginx 服务器的文件。`nginx.conf`为此，覆盖内置 [nginx 说明书的](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.10/nginx) `nginx.conf.erb` 模板文件，Rails App Server 层的 Setup 配方使用该文件来创建 `nginx.conf`，并添加以下指令：  

```
ssl_protocols TLSv1.2;
```
有关如何配置 `nginx.conf` 的更多信息，请参阅 [Configuring HTTPS servers](http://nginx.org/en/docs/http/configuring_https_servers.html)。有关如何覆盖内置模板的更多信息，请参阅[使用自定义模板](workingcookbook-template-override.md)。