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 Headers view 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 Headers view 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的名称的目录下各自生成了虚拟主机名称的目录。