
摘要:Web應用程序可以通過在Web服務器啟動之前進行部署,這種靜態部署的方式并不靈活,部署和卸載都需要對服務器進行操作,而動態部署則可以在服務器運行的狀態下部署Web應用程序。Tomcat7通過自帶的Web應用程序manager,全面支持動態部署,并且能夠對服務器中Web應用程序進行管理。
關鍵詞:Web服務器;靜態部署;動態部署;Web應用程序
中圖分類號:[G714] 文獻標識碼:A 文章編號:1671-864X(2014)08-0184-02
一、引言
動態部署,名如其意,就是在Web服務器運行時部署依賴它的Web應用程序。對于所欲的Web服務器來說,動態部署是一個非常有必要實現的功能,除了能部署新的Web應用程序之外,還能夠對存在的項目取消部署,而這些都是在服務器仍處于運行狀態的情形下實現的。本文以Apache Tomcat服務器為例,對其動態部署的方式進行研究。
二、Tomcat7簡介
Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個Servlet容器,依照原Sun Microsystems提供的技術規范,實現了對Servlet和JavaServer Page(JSP)的支持,并提供了作為Web服務器的一些特有功能[1]。由于Tomcat本身也內含了一個HTTP服務器,它也可以被視作一個單獨的Web服務器。因為同屬于Apache軟件基金會的下屬項目,經常會有程序員混淆Apache Web Server和Tomcat,認為它們就是一個服務器;其實不然,Apache Web Server 是一個用 C 語言實現的 HTTP Web Server,一個完全的Web服務器。
Tomcat7始于2010年,最初的版本是7.0.0beta,在2011年1月11日發布的Tomcat 7.0.6已經成為穩定版本,這是Tomcat 7分支的第一個穩定版本,用來取代2007年2月發布的Tomcat 6,Tomcat7修復大量的原有bug,包括其中各個模塊,如Catalina,Coyote,Jasper等,其中包括一些比較嚴重的如內存泄露問題,線程安全問題等。
三、Tomcat7下實現動態部署
Tomcat通過自帶的Web應用程序manager來實現對容器中的Web應用程序目錄或是WAR文件進行動態部署。
1.manager權限設置。
由于版本的更新,Tomcat7和6相比較,在權限配置方面變的更細微,原來Tomcat6中的manager應用程序的權限在7中被細分為4種,這些權限的名字都被定義在Tomcat7提供的manager應用程序目錄下的\WEB-INF\web.xml文件中,它們是分別是manager-gui,manager-status,manager-script和manager-jmx,其描述見表1。
表1
角色名描述
manager-gui允許訪問HTML接口
manager-status僅允許訪問訪問“Server Status”頁面
manager-script允許訪問“Server Status”頁和文檔里友好的簡單text接口
manager-jmx允許訪問“Server Status”頁和JMX代理接口
其中HMTL接口包含manager應用中的圖形界面,有效能防止跨站點偽造請求(Cross-Site Request Forgery,CSRF)的攻擊,但是text和JMX就不具備這樣的能力。text接口通過查詢字符串的方式在地址欄用manager支持的指令管理容器內的Web應用程序。這里以manager-gui為例,來看一下web.xml文件中權限的設置和角色的聲明,代碼如下:
MemoryRealm是域(Realm)的一種,用來讀取保存在\conf\tomcat-users.xml文件中的角色和用戶名、密碼的關聯信息。
在tomcat-user.xml文件中配置角色和管理用戶的代碼如下:
tomcat-users.xml文件可以設置不同的角色,使用這些角色名和權限的前提條件是在包含它們的Web應用程序目錄下的web.xml中聲明。
當完成上述操作之后,便可以通過瀏覽器打開tomcat的歡迎界面,選擇“Manager App”入口,把tomcat-users.xml文件中自定義的用戶名和密碼在彈出的登錄對話框中輸入,即進入tomcat7中的manager應用中,動態的配置當前tomcat容器中所有被部署的Web應用程序,包括manager本身。
2.圖形化的動態部署。
完成Tomcat7中manager應用的權限配置后,在命令提示符下啟動Tomcat服務器,在瀏覽器中輸入http://localhost:8080進入Tomcat的歡迎界面,選擇“Manager App”入口,在彈出的用戶名和密碼對話框中輸入tomcat-users.xml配置好的用戶名和密碼,則可以進入圖形化動態部署模式。
圖形化部署模式提供下列9種功能:
· 通過直接指定WAR文件,部署一個新的Web應用程序
· 通過在服務器文件系統中指定Web應用程序的上下文路徑來部署一個新的應用
· 提供服務器中當前被部署的所有Web應用程序列表和這些應用中被激活的會話信息
· 通過對\WEB-INF\classes和\WEB-INF\lib目錄中文件的監視和反射,重新加載容器中已存在的Web應用程序
· 提供當前操作系統和Java虛擬機的屬性列表
· 提供可用的全局可用的JNDI資源列表,在部署工具中通過在
· 啟動已經停止的Web應用程序
· 停止正在運行的Web應用程序
· 卸載已經部署的Web應用程序,并刪除其根目錄的文檔
圖形話部署模式可以是開發人員方便快捷對Web應用程序進行部署,并對容器中存在的應用進行管理。
3.指令化的動態部署。
除了圖形化的部署方式外,manager應用程序還提供指令化的動態部署模式。指令化的部署實際上是在地址欄通過text接口輸入部署的指令和參數即可實現指令化的部署模式,所有manager已知的指令通過在獨立的請求URI指定而被執行。
指令化的動態部署模式URI格式如下:
http://{host}:{port}/manager/text/{command}?{parameters}
{command}代表manager應用下程序員需要執行的指令,{parameters}表示針對URI中的指令提供的查詢參數。
manager中常用指令如下:
list:提供Tomcat容器中當前Web應用程序列表
reload:重新加載Web應用程序
serverinfo:服務器信息
sessions:會話管理
start:啟動Web應用程序
stop:停止Web應用程序
deploy:部署新的Web應用程序
undeploy:卸載存在的Web應用程序
這些指令有些可以單獨使用,如list,而大部分需要使用“?”連接參數一起使用,manager應用提供的參數包括path、version、war等。
本文主要闡述deploy指令部署新的Web應用程序。
通過Web應用程序上下文部署
http://localhost:8080/manager/text/deploy?path=/foo
其中Web應用程序的上下文通過path參數指定為/foo。
通過URL部署Web應用程序目錄
http://localhost:8080/manager/text/deploy?path=/footoowar=file:/path/to/foo
其中Web應用程序的上下文通過path參數指定為/footoo,程序目錄則通過war參數指定,由于部署的是文件目錄,所以需要指定文件協議file。
通過URL部署WAR
http://localhost:8080/manager/text/deploy?war=jar:file:/path/to/bar.war!/
使用URL部署WAR的特殊之處在于需要把jar和file連接使用,并且WAR文件不能在URL中以擴展名war結束,需要在之后添加“!/”。
通過Host appBase部署Web應用程序目錄
http://localhost:8080/manager/text/deploy?war=foo
Host appBase表示服務器的應用程序跟目錄,在Tomcat中即為webapps,使用這種方式部署需要事先把Web應用程序目錄拷貝到appBase中,不需要指定應用程序的上下文,直接提供Web應用程序在appBase下的相對路徑即可。
通過Host appBase部署WAR
http://localhost:8080/manager/text/deploy?war=bar.war
和部署目錄方式一致,通過Host appBase部署WAR時,事先要把WAR文件拷貝到appBase目錄下,然后使用war參數直接指定WAR文件即可。
四、總結
Tomcat7作為一款靈巧的HTTP服務器,最新版本已經提供了對Servlet3.0和JSP2.3的支持。通過Tomcat7提供的動態部署方式能夠簡單快速的對Web應用程序進行部署,使用圖形化的模式直觀且方便,并且可以輕松的對容器中已經部署的Web應用程序和會話進行管理;指令化的模式能夠讓程序員以更快捷的方式對Web應用程序進行部署和卸載,前提是熟悉manager下的指令和參數。
參考文獻:
[1]維基百科.Apache Tomcat.2013-6.[DB/OL]http://zh.wikipedia.org/wiki/Apache_Tomcat
[2]孫衛琴. Tomcat與Java Web開發技術詳解(第2版).電子工業出版社[M].2009-1。
[3] Budi Kurniawan著. 曹旭東譯. 深入剖析Tomcat.機械工業出版社[M].2012-1。