Tomcat下為每個Web應用配置不同的訪問端口
要完成這個目錄必須對conf/Server.xml文件進行配置
設現在我們有兩個應用app1和app2,客戶端期望的訪問方式是:
App1 -> http://localhost:8081/
App2 -> http://localhost:8082/
這樣省去了在主機名后面添加ContextPath的麻煩,相信客戶更願意這樣使用。
實現步驟:
1. 找到conf/server.xml中的service配置節,復制這個service元素,緊跟在后面粘貼一次。如下:
<Servicename="Catalina.app1">
<Connector port="8081"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Engine name="Catalina.app1" defaultHost="localhost">
<RealmclassName="org.apache.catalina.realm.LockOutRealm">
<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true"autoDeploy="true">
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log."suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
<Context path="/"docBase="app1" />
</Host>
</Engine>
</Service>
說明:紅色加粗是特別要注意的部分。
1.1、<Servicename="Catalina.app1">,這里設置Service的名字為Catalina.app1,是隨便取的名字不能和當前這個文件已有的Service元素同名。
1.2、<Connectorport="8081"…/,這里設置當前服務的Http Connector監聽的端口為8081,注意不能和已有的其它Service的Connector的監聽端口相同。
1.3、<Enginename="Catalina.app1"defaultHost="localhost">,這里設置Engine的名字為Catalina.app1也不是必須的,你可以換其它名字,但是還是不要和其它Engine重名就行了。defaultHost這個屬性指出當前Engine根據主機頭在它的子元素中找不到匹配名稱的虛擬主機時所要訪問的缺省虛擬主機。我們這兒Engine里面只有一個虛擬主機因此缺省主機也是它。當然defaultHost屬性指定的主機名稱在它的子元素里面是必須存在的。
1.4、<Host name="localhost" appBase="webapps" />,name屬性指定虛擬主機的名字,一般是Internet域名,Engine會根據HTTP協議請求里面的主機頭Host的值來匹配這里的虛擬主機名,如果匹配就交給該虛擬主機處理。比如,如果你的客戶端訪問地址是:http://qrkx.uten.cn:8090/index.jsp,那么這里虛擬主機名字就應該為qrkx.uten.cn,當然請求中的端口號是前面連接器最先使用的。appBase屬性指出虛擬主機上的Web應用是部署在哪里的。一個虛擬主機上可以同時部署多個Web應用,那么appBase就是指出這些應用的存放位置,這里可以使帶盤符的絕對路徑,像d:/webapps.也可以是相對路徑。這個相對路徑的起點就是Tomcat的安裝目錄。這里appBase屬性我們設置為webapps表示當前虛擬主機的Web應用存放目錄為tomcat安裝目錄下的webapps目錄里面。
1.5、<Context path="/"docBase="app1" />,這個是最為關鍵的部分了。一個虛擬主機里面可以部署多個Web應用,而每個Web應用就是一個Context,因此這里可以配置多個Context元素,每個表示一個Web應用程序上下文。Path屬性表示訪問這個Web應用的路徑,”/”表示這個Context是當前虛擬主機的缺省Web應用程序,也可以為空字符串“”,這樣改Context可以用處理所有不匹配任何其它Context的 Context path請求。我們訪問的時候就不用輸入Web應用的名稱了,可以如下訪問http://localhost:80801/,如果你像這樣配置:<Contextpath="/app1" docBase="app1" />,那么你就要這樣訪問:http://localhost:80801/app1/。總結一下意思就是在一個虛擬主機下只有一個Web應用是采用根路徑的,其它必須要指定特別的訪問路徑【根路徑只有一個】,比如path="/app1"、path="/app2"、path="/app3"等。
docBase="app1"這個屬性指出當前Web應用程序的存放路徑,可以是相對路徑也可以是絕對路徑,絕對路徑就是帶盤符的路徑,比如:d:/app1,相對路徑就是以Host元素的appBase屬性指定的路徑為起點的路徑。這里docBase="app1"表示我們的當前Web應用程序是在Tomcat安裝目下的webapps目錄下的app1目錄。
2、重復步驟一再次創建一個Service
<Servicename="Catalina.app2">
<Connector port="8082"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Engine name="Catalina.app2" defaultHost="localhost">
<RealmclassName="org.apache.catalina.realm.LockOutRealm">
<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true"autoDeploy="true">
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log."suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
<Context path="/"docBase="app2" />
</Host>
</Engine>
</Service>
3、啟動Tomcat,觀察日志輸出
信息: Deploying webapplication directory E:\WorkSpace\JavaWorkspace\Tomcat 7.0\webapps\app1
2012-6-414:03:36 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts-default.xml]
2012-6-414:03:37 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts-plugin.xml]
2012-6-414:03:37 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts.xml]
2012-6-414:03:38 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying webapplication directory E:\WorkSpace\JavaWorkspace\Tomcat 7.0\webapps\app2
2012-6-414:03:39 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts-default.xml]
2012-6-414:03:39 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts-plugin.xml]
2012-6-414:03:39 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts.xml]
4、通過瀏覽器訪問:
http://localhost:80801/index.jsp
我們通過觀察瀏覽器發出的請求頭如下:
Request URL: http://localhost:8081/index.jsp
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:JSESSIONID=CADAAC6E5B9366F4590E50B889BE58BF
Host:localhost:8081
Pragma:no-cache
User-Agent:Mozilla/5.0 (Windows NT 5.1)AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 QIHU360EE
Response Headersview source
Content-Length:1235
Content-Type:text/html;charset=UTF-8
Date:Mon, 04 Jun 2012 06:24:19 GMT
Server:Apache-Coyote/1.1
Set-Cookie:JSESSIONID=BA86EAD5BBDF7BB51343377C88588AB8;Path=/; HttpOnly
請注意紅色的部分就是主機頭,一般是Internet域名。
http:// localhost:80802/ognl.jsp
這里和上面做法一樣,主機頭是:Host:localhost:8082
5、觀察Tomcat的conf目錄:
你發現了什么?????????????????????????????????????
Catalina.app1和Catalina.app2是我們分別配置的兩個Engine的名字。打開這兩個目錄,我們發現:
里面都有個localhost,其實這是我們上面配置的虛擬主機名稱,如果你配置的虛擬主機名稱是qrkx.uten.cn,那么這里目錄的名稱就是qrkx.uten.cn了。
注意:如果你的Webapps目錄下有ROOT目錄請將其更名或刪除,否則訪問地址:http://localhost:8081和http://localhost:8082是會出問題的。官方文檔有這樣的說明:If the contextPath is a zero length string, the base name isROOT
使用主機頭示范,由於測試環境沒有DNS服務器,搭建太麻煩。我們通過修改本機的如下文件模擬實現:
C:\WINDOWS\system32\drivers\etc\HOSTS,該文件作用:
host是一個沒有擴展名的系統文件,可以用記事本等工具打開,其作用就是將一些常用的網址域名與其對應的IP地址建立一個關聯“數據庫”,當用戶在瀏覽器中輸入一個需要登錄的網址時,系統會首先自動從Hosts文件中尋找對應的IP地址,一旦找到,系統會立即打開對應網頁,如果沒有找到,則系統再會將網址提交DNS域名解析服務器進行IP地址的解析。
我們在文件中添加如下:
127.0.0.1 localhost
127.0.0.1 app1.family.cn
127.0.0.1 app2.family.cn
然后修改server.xml文件中虛擬主機的主機頭分別為:
<Servicename="Catalina.app1">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Engine name="Catalina.app1" defaultHost="app1.family.cn">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="app1.family.cn" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
<Contextpath="" docBase="app1" />
</Host>
</Engine>
</Service>
<Service name="Catalina.app2">
<Connector port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Engine name="Catalina.app2" defaultHost="app2.family.cn">
<RealmclassName="org.apache.catalina.realm.LockOutRealm">
<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="app2.family.cn" appBase="webapps"
unpackWARs="true"autoDeploy="true">
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
<Contextpath="" docBase="app2" />
</Host>
</Engine>
</Service>
重新啟動Tomcat,在瀏覽器地址欄訪問如下地址:
http://app1.family.cn:80801/inde.jsp
http://app1.family.cn:80802/ognl.jsp
成功!!!!!!!!!
觀察Tomcat下的conf目錄:
不難發現,在兩個Engine的名稱的目錄下各自生成了虛擬主機名稱的目錄。