此文源自一次多年前面試的面試題,民工哥將它總結出來分享給大家,希望對大家有所幫助,或者今后的面試中說不定會用的上。
首先,我們了解一下常見的Java Web服務器。
-
Tomcat:由Apache組織提供的一種Web服務器,提供對jsp和Servlet的支持。它是一種輕量級的javaWeb容器(服務器),也是當前應用最廣的JavaWeb服務器(免費)。
-
Jboss:是一個遵從JavaEE規范的、開放源代碼的、純Java的EJB服務器,它支持所有的JavaEE規范(免費)。
-
GlassFish:由Oracle公司開發的一款JavaWeb服務器,是一款強健的商業服務器,達到產品級質量(應用很少,收費)。
-
Resin:是CAUCHO公司的產品,是一個非常流行的應用服務器,對servlet和JSP提供了良好的支持,性能也比較優良,resin自身采用JAVA語言開發(收費,應用比較多)。
-
WebLogic:是Oracle公司的產品,是目前應用最廣泛的Web服務器,支持JavaEE規范,而且不斷的完善以適應新的開發要求,適合大型項目(收費,用的不多,適合大公司)。
Tomcat就是實際環境中最常見的,很多時候,特別是像在平時的測試環境,經常會遇到多個項目同時測試的情況,所以,今天民工哥與大家來聊一聊如何在一個Tomcat服務下,同時部署多個應用項目。
1、不修改端口
大家都知道,應用項目是直接放在Tomcat webapps目錄下面
[root@CentOS7-1 tomcat]# cd webapps/ [root@CentOS7-1 webapps]# ll total 4 drwxr-x--- 16 root root 4096 Jun 4 03:07 docs drwxr-x--- 6 root root 83 Jun 4 03:07 examples drwxr-x--- 5 root root 87 Jun 4 03:07 host-manager drwxr-x--- 5 root root 103 Jun 4 03:07 manager drwxr-x--- 3 root root 283 Jun 4 03:07 ROOT
所以,我們在不修改端口的情況下,可以直接在此目錄下新增多個項目目錄,也可以直接將war包放在此目錄下,由於測試環境,我們直接模擬war解壓后的目錄,用添加目錄來替代。
[root@CentOS7-1 webapps]# mkdir test java [root@CentOS7-1 webapps]# ls docs examples host-manager java manager ROOT test
准備測試的首頁文件
[root@CentOS7-1 webapps]# echo "this is a test" >test/test.html [root@CentOS7-1 webapps]# echo "this is a java" >java/java.html [root@CentOS7-1 webapps]# cat test/test.html this is a test [root@CentOS7-1 webapps]# cat java/java.html this is a java
修改配置文件
<!-- test --> <Context path="test/" docBase="test" reloadable="true" /> <Context path="java/" docBase="java" reloadable="true" /> #增加上兩行配置即可 </Host> </Engine> </Service> </Server> "../conf/server.xml" 173L, 7744C
docBase屬性: 指定Web應用的文件路徑,可以是絕對路徑,也可以給定相對路徑
path屬性: 指定訪問該Web應用的URL入口。
reloadable屬性: 若這個屬性為true,tomcat服務器在運行狀態下會監視WEB-INF/classes和WEB-INF/lib目錄下class文件的改動,如果監測到class文件被更新,服務器會自動重新加載Web應用。
重啟Tomcat服務,測試訪問,結果如下:
部署成功。
注:配置文件中增加的配置步驟可以不做,直接跳過,不是必須要做的步驟。
2、修改端口
第二種修改端口的方法,其實是基於第一種方法做出的改良,在tomcat目錄下創建多個webapps目錄。
刪除webapps目錄下的java項目,並刪除webapps1目錄下test項目即可。
修改配置文件
server.xml已有第一個項目的配置信息,現在需要新增第二個項目的配置,在Server節點下,新增一個Service節點,第2個Service節點直接復制第1個Service內容修改即可。
<Service name="Catalina1"> <!--The connectors can use a shared executor, you can define one or more named thread pools--> <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- A "Connector" using the shared thread pool--> <Engine name="Catalina1" defaultHost="localhost"> <!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps1" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service>
只需要注意修改幾個配置即可,不太熟悉的讀者,可以利用代碼工具比較一下,就會發現兩段配置的不同,這里就不多解釋了。
-
Service的name屬性修改為Catelina1;
-
http協議訪問的Connector port屬性修改為8081;
-
Engine的name屬性修改為Catelina1;
-
Host的appBase屬性修改為webapps1;
重啟服務並測試訪問
[root@CentOS7-1 conf]# ../bin/startup.sh Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcat started. [root@CentOS7-1 conf]# lsof -i :8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 2486 root 52u IPv6 25075 0t0 TCP *:webcache (LISTEN) [root@CentOS7-1 conf]# lsof -i :8081 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 2486 root 57u IPv6 25079 0t0 TCP *:tproxy (LISTEN) [root@CentOS7-1 conf]# curl http://127.0.0.1:8080/test/test.html this is a test [root@CentOS7-1 conf]# curl http://127.0.0.1:8081/java/java.html this is a java