本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
部署 Java 應用程式
重要
所以此 AWS OpsWorks Stacks 服務於 2024 年 5 月 26 日終止使用壽命,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載移轉至其他解決方案。如果您對移轉有任何疑問,請聯絡 AWS Support 團隊上 AWS Re: 郵寄
下列主題說明如何將應用程式部署至 Java 應用程式伺服器層的執行個體。這些示例適用於JSP應用程序,但是您可以使用基本相同的過程來安裝其他類型的 Java 應用程序。
您可以從任何受支援的儲存庫部署JSP頁面。如果您想要部署WAR檔案,請注意 AWS OpsWorks 堆疊會自動擷取從 Amazon S3 或存檔部署的HTTP檔WAR案,但不會從 Git 或顛覆儲存庫擷取檔案。如果您想使用 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>
注意
下列程序假設您已熟悉建立堆疊、將執行個體新增至 layer 等等的基本知識。如果您是新手 AWS OpsWorks 堆疊,你應該先看看Chef 11 Linux 堆疊入門。
若要從 Amazon S3 存檔部署JSP頁面
-
使用 Java 應用程式伺服器層建立堆疊,將全年無休的執行個體新增至圖層,然後啟動它。
-
將程式碼複製至名為
simplejsp.jsp
的檔案,並將檔案放入名為simplejsp
的資料夾中,然後建立資料夾的.zip
封存檔。名稱可以是任意名稱;您可以使用您想要的任何檔案或資料夾名稱。您也可以使用其他類型的歸檔,包括 gzip,bzip2,壓縮包或 Java 文件。WAR請注意, AWS OpsWorks 堆棧不支持未壓縮的壓縮包。若要部署多個JSP頁面,請將它們包含在同一個歸檔中。 -
將存檔上傳到 Amazon S3 儲存貯體,並將檔案設為公開。複製檔案以URL供日後使用。如需如何建立儲存貯體以及上傳檔案的詳細資訊,請參閱開始使用 Amazon Simple Storage Service。
-
新增應用程式至堆疊,然後指定下列設定:
-
名稱 –
SimpleJSP
-
App type (應用程式類型) –
Java
-
Repository type (儲存庫類型) –
Http Archive
-
儲存庫 URL — 存檔檔案URL的 Amazon S3。
針對剩餘設定使用預設值,然後按一下 Add App (新增應用程式) 以建立應用程式。
-
-
將應用程式部署至 Java 應用程式伺服器執行個體。
現在,您可以轉到該應用程序URL並查看該應用程序。如果您尚未指定網域,可以使用執行個體的公有 IP 位址或其公用DNS名稱URL來建構網域。若要取得執行個體的公用 IP 位址或公用DNS名稱,請前往 AWS OpsWorks 「堆疊」主控台,然後按一下「執行個體」頁面上的執行個體名稱,開啟其詳細資料
的其餘部分URL取決於應用程序的簡短名稱,這是一個小寫名稱 AWS OpsWorks 堆疊會根據您在建立應用程式時指定的 App 名稱產生。例如,簡單的簡短名稱JSP是簡單的 JSP。您可以從其詳細資訊頁面中取得應用程式的簡短名稱。
-
如果簡短名稱是
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 堆棧創建並初始化對DataSource
象,將其綁定到一個邏輯名,並使用 Java 命名和目錄接口(JNDI)命名服務註冊該名稱。完整的邏輯名稱為 java:comp/env/
。您必須透過將自訂屬性新增至堆疊配置和部署JSON屬性來定義user-assigned-name
['opsworks_java']['datasources']
屬性,以指定使用者指定名稱的部分,如下所述。
若要部署連線至我的SQL資料庫的JSP頁面
-
使用 Java 應用程序服務器層創建一個堆棧,向每個層添加 24/7 實例,然後啟動它。
-
將資料庫 layer 新增至堆疊。詳細資訊取決於您使用的資料庫。
若要在此範例中使用 My SQL 執行個體,請將 My SQL 圖層新增至堆疊,將全年無休的執行個體新增至圖層,然後啟動它。
以下範例使用 Amazon RDS (MySQL) 執行個體:
-
指定執行個體的 [我的SQL資料庫引擎]。
-
指派 AWS-OpsWorks-DB 主伺服器 (
security_group_id
)和 AWS-OpsWorks Java 的應用程序服務器(security_group_id
) 執行個體的安全群組。 AWS OpsWorks 當您在該地區建立第一個堆疊時,Stack 會為您建立這些安全群組。 -
建立名為
simplejspdb
的資料庫。 -
確定主要使用者名稱和密碼未包含可能會導致 Tomcat 錯誤的
&
或其他字元。特別是在啟動過程中,Tomcat 必須解析 Web 應用程序上下文文件,該XML文件是一個包含主密碼和用戶名的文件。如果任一字串包含字
&
元,剖析XML器會將其視為格式錯誤的XML實體,並擲回剖析例外狀況,以防止 Tomcat 啟動。如需 Web 應用程式內容檔案的詳細資訊,請參閱tomcat::context。 -
將我的SQL驅動程式新增至 Java 應用程式伺服器層。
-
在堆疊中註冊RDS執行個體。
如需如何搭配使用 Amazon RDS 執行個體的詳細資訊 AWS OpsWorks 堆疊,請參閱Amazon 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)。 -
Database name (資料庫名稱) –
simplejspdb
。 -
Repository type (儲存庫類型) –
Http Archive
-
儲存庫 URL — 存檔檔案URL的 Amazon S3。
針對剩餘設定使用預設值,然後按一下 Add App (新增應用程式) 以建立應用程式。
-
-
將以下自定義JSON屬性添加到堆棧配置屬性中,其中 simplejspdb 是應用程序的簡短名稱。
{ "opsworks_java": { "datasources": { "simplejspdb": "jdbc/mydb" } } }
AWS OpsWorks 堆棧使用此映射來生成包含必要數據庫信息的上下文文件。
如需如何將自訂JSON屬性新增至堆疊配置屬性的詳細資訊,請參閱使用自訂 JSON。
-
將應用程式部署至 Java 應用程式伺服器執行個體。
現在,您可以使用該應用程序URL查看該應用程序。如需如何建構的描述URL,請參閱部署JSP應用程式。
對URL於這個例子會是這樣的http://192.0.2.0/simplejspdb/simplejspdb.jsp
。
注意
datasources
屬性可以包含多個屬性。每個屬性的名稱都會有應用程式簡短名稱,並設定為邏輯名稱中由使用者指派的適當部分。如果您有多個應用程序,則可以使用單獨的邏輯名稱,這需JSON要自定義如下內容。
{ "opsworks_java": { "datasources": { "myjavaapp": "jdbc/myappdb", "simplejsp": "jdbc/myjspdb", ... } } }