本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
部署 Java 应用程序
重要
这些区域有: AWS OpsWorks Stacks 该服务已于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请联系 AWS Support 团队开启 AWS re: post 或通过
以下主题介绍了如何将应用程序部署到 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页面
-
将代码复制到名为
simplejsp.jsp
的文件中,将该文件放到名为simplejsp
的文件夹中,然后创建该文件夹的.zip
存档。名称是任意的;您可以按照您的意愿使用任何文件或文件夹名称。你也可以使用其他类型的存档,包括 gzip、bzip2、tarball 或 Java 文件。WAR请注意 AWS OpsWorks 堆栈不支持未压缩的压缩包。要部署多个JSP页面,请将它们包含在同一个存档中。 -
将该存档上传到 Amazon S3 存储桶,并将该文件设置为公有。复制文件以URL备后用。有关如何创建存储桶和上传文件的更多信息,请转至 Amazon Simple Storage Service 入门指南。
-
将一个应用程序添加到堆栈并指定以下设置:
-
名称 –
SimpleJSP
-
App type -
Java
-
Repository type –
Http Archive
-
存储库 URL — 存档文件的 Amazon S3 URL。
对其余设置使用默认值,然后单击 Add App 创建应用程序。
-
-
将应用程序部署到 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/
。您必须通过向堆栈配置和部署属性添加自定义JSON属性来指定名称中用户分配的user-assigned-name
['opsworks_java']['datasources']
部分,如下所述。
部署连接到 JSP “我的SQL数据库” 的页面
-
创建带有 Java App Server 层的堆栈,将一个全天候实例添加到每个层中,然后启动实例。
-
将一个数据库层添加到堆栈中。具体细节取决于您使用的数据库。
要使用 “我的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 应用服务器层。
有关如何将 Amazon RDS 实例与配合使用的更多信息 AWS OpsWorks 堆栈,请参阅亚马逊RDS服务层。
-
-
将示例代码复制到名为
simplejspdb.jsp
的文件中,将该文件放到名为simplejspdb
的文件夹中,然后创建该文件夹的.zip
存档。名称是任意的;您可以按照您的意愿使用任何文件或文件夹名称。您还可以使用其他类型的存档,包括 gzip、bzip2 或 tarball。要部署多个JSP页面,请将它们包含在同一个存档中。有关如何部署其他存储库类型中的应用程序的信息,请参阅应用程序源。 -
将该存档上传到 Amazon S3 存储桶,并将该文件设置为公有。复制文件以URL备后用。有关如何创建存储桶和上传文件的更多信息,请转至 Amazon Simple Storage Service 入门指南。
-
将一个应用程序添加到堆栈并指定以下设置:
-
名称 –
SimpleJSPDB
-
App type -
Java
-
数据源类型-OpsWorks(对于 “我的SQL实例”)或 RDS(对于 Amazon RDS 实例)。
-
数据库实例 — 你之前创建的 “我的SQL实例”,通常命名为 db-master1 (mysql),或者名为 Amazon RDS 实例
DB_instance_name
(mysql) 。 -
数据库名称 –
simplejspdb
。 -
Repository type –
Http Archive
-
存储库 URL — 存档文件的 Amazon S3 URL。
对其余设置使用默认值,然后单击 Add App 创建应用程序。
-
-
将以下自定义JSON属性添加到堆栈配置属性中,其中 simplejspdb 是应用程序的简称。
{ "opsworks_java": { "datasources": { "simplejspdb": "jdbc/mydb" } } }
AWS OpsWorks Stacks 使用此映射生成包含必要数据库信息的上下文文件。
有关如何向堆栈配置JSON属性添加自定义属性的更多信息,请参阅使用自定义 JSON。
-
将应用程序部署到 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", ... } } }