此文源自一次多年前面試的面試題,民工哥將它總結出來分享給大家,希望對大家有所幫助,或者今後的面試中說不定會用的上。
首先,我們瞭解一下常見的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