部署 Java 应用程序 - AWS OpsWorks

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

部署 Java 应用程序

重要

这些区域有: AWS OpsWorks Stacks 该服务已于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请联系 AWS Support 团队开启 AWS re: post 或通过 AWS 高级支持

以下主题介绍了如何将应用程序部署到 Java App Server 层的实例中。这些示例适用于JSP应用程序,但您可以使用基本相同的步骤来安装其他类型的 Java 应用程序。

您可以从任何支持的存储库中部署JSP页面。如果要部署WAR文件,请注意 AWS OpsWorks 堆栈会自动提取从 Amazon S3 或HTTP存档中部署的WAR文件,但不会从 Git 或 Subversion 存储库中提取部署的文件。如果你想使用 Git 或 Subversion 来处理WAR文件,你可以执行以下任一操作:

  • 将提取的存档存储在存储库中。

  • 将WAR文件存储在存储库中,然后使用 Chef 部署挂钩提取存档,如以下示例所述。

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

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

部署JSP应用程序

要部署JSP应用程序,请指定名称和存储库信息。您也可以选择指定域名和SSL设置。有关如何创建应用程序的更多信息,请参阅添加应用程序。以下过程说明如何从公共 Amazon S3 档案中创建和部署简单JSP页面。有关如何使用其他存储库类型 (包括私有 Amazon S3 存档) 的信息,请参阅 应用程序源

以下示例显示了该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>
注意

以下过程假定您已熟悉关于创建堆栈、将实例添加到层等的基础知识。如果你不熟悉 AWS OpsWorks 堆栈,你应该先看看Chef 11 Linux 堆栈入门

从 Amazon S3 档案中部署JSP页面
  1. 创建带有 Java App Server 层的堆栈将一个全天候实例添加到层中,然后启动实例

  2. 将代码复制到名为 simplejsp.jsp 的文件中,将该文件放到名为 simplejsp 的文件夹中,然后创建该文件夹的 .zip 存档。名称是任意的;您可以按照您的意愿使用任何文件或文件夹名称。你也可以使用其他类型的存档,包括 gzip、bzip2、tarball 或 Java 文件。WAR请注意 AWS OpsWorks 堆栈不支持未压缩的压缩包。要部署多个JSP页面,请将它们包含在同一个存档中。

  3. 将该存档上传到 Amazon S3 存储桶,并将该文件设置为公有。复制文件以URL备后用。有关如何创建存储桶和上传文件的更多信息,请转至 Amazon Simple Storage Service 入门指南

  4. 将一个应用程序添加到堆栈并指定以下设置:

    • 名称SimpleJSP

    • App type - Java

    • Repository typeHttp Archive

    • 存储库 URL — 存档文件的 Amazon S3 URL。

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

  5. 将应用程序部署到 Java App Server 实例。

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

其余的URL取决于应用程序的短名称,这是一个小写的名称 AWS OpsWorks 堆栈根据您在创建应用程序时指定的应用程序名称生成。例如,Simple 的简称JSP是 simplejsp。您可以从应用程序的详细信息页面中获得应用程序的短名称。

  • 如果短名称为 root,您可以使用 http://public_DNS/appname.jsphttp://public_IP/appname.jsp

  • 否则,您可以使用 http://public_DNS/app_shortname/appname.jsphttp://public_IP/app_shortname/appname.jsp

如果您为应用程序指定了域,则URL为http://domain/appname.jsp

举URL个例子就是这样http://192.0.2.0/simplejsp/simplejsp.jsp

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

使用后端数据库部署JSP应用程序

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

下一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>

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

部署连接到 JSP “我的SQL数据库” 的页面
  1. 创建带有 Java App Server 层的堆栈将一个全天候实例添加到每个层中,然后启动实例

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

    要使用 “我的SQL实例” 作为示例,请向堆栈中添加一个 “我的SQL图层”,向该图层添加一个 24/7 实例,然后启动它

    要使用亚马逊RDS(我的SQL)实例作为示例,请执行以下操作:

    • 为实例指定 “我的SQL数据库引擎”。

    • 分配 AWS-OpsWorks-db-Master-Server (security_group_id) AWS-OpsWorks-Java-App-Server (security_group_id) 实例的安全组。 AWS OpsWorks Stacks 在您在该区域中创建第一个堆栈时为您创建这些安全组。

    • 创建一个名为 simplejspdb 的数据库。

    • 确保主用户名和密码不包含 & 或其他可能会导致 Tomcat 错误的符号。

      尤其是在启动期间,Tomcat 必须解析 Web 应用程序上下文文件,该XML文件包含主密码和用户名。如果任一字符串包含&字符,则XML解析器会将其视为格式错误的XML实体并抛出解析异常,从而阻止 Tomcat 启动。有关 Web 应用程序上下文文件的更多信息,请参阅tomcat::context

    • 将 “我的SQL驱动程序” 添加到 Java 应用服务器层。

    • 在您的堆栈中注册RDS实例

    有关如何将 Amazon RDS 实例与配合使用的更多信息 AWS OpsWorks 堆栈,请参阅亚马逊RDS服务层

  3. 将示例代码复制到名为 simplejspdb.jsp 的文件中,将该文件放到名为 simplejspdb 的文件夹中,然后创建该文件夹的 .zip 存档。名称是任意的;您可以按照您的意愿使用任何文件或文件夹名称。您还可以使用其他类型的存档,包括 gzip、bzip2 或 tarball。要部署多个JSP页面,请将它们包含在同一个存档中。有关如何部署其他存储库类型中的应用程序的信息,请参阅应用程序源

  4. 将该存档上传到 Amazon S3 存储桶,并将该文件设置为公有。复制文件以URL备后用。有关如何创建存储桶和上传文件的更多信息,请转至 Amazon Simple Storage Service 入门指南

  5. 将一个应用程序添加到堆栈并指定以下设置:

    • 名称SimpleJSPDB

    • App type - Java

    • 数据源类型-OpsWorks(对于 “我的SQL实例”)或 RDS(对于 Amazon RDS 实例)。

    • 数据库实例 — 你之前创建的 “我的SQL实例”,通常命名为 db-master1 (mysql),或者名为 Amazon RDS 实例 DB_instance_name (mysql)

    • 数据库名称simplejspdb

    • Repository typeHttp Archive

    • 存储库 URL — 存档文件的 Amazon S3 URL。

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

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

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

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

    有关如何向堆栈配置JSON属性添加自定义属性的更多信息,请参阅使用自定义 JSON

  7. 将应用程序部署到 Java App Server 实例。

现在,您可以使用该应用程序URL来查看该应用程序。有关如何构造的说明URL,请参见部署JSP应用程序

举URL个例子就是这样http://192.0.2.0/simplejspdb/simplejspdb.jsp

注意

datasources 属性可以包含多个属性。每个属性都以应用程序短名称命名,并被设置为逻辑名称中适当的用户分配的部分。如果您有多个应用程序,则可以使用单独的逻辑名称,这需要使用JSON如下所示的自定义名称。

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