問題
今天安裝完 Tomcat,安裝時把 Tomcat 默認的 HTTP/1.1 Connector Port 從 8080 改為了 7080,啟動 Tomcat,在瀏覽器中輸入 Http://localhost:7080/ 也能看到 Tomcat 的歡迎頁。后來想改成 80 端口,然后想測試綁定一個域名看看,於是進入 C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf 的 server.xml,把配置改成下面的代碼:
(注意:server.xml 中不能用中文注釋,否則 Tomcat 啟動會失敗!)
<?xml version='1.0' encoding='utf-8'?> <Server port="7005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <!-- 下面這里的 port 從 7080 改為 80 --> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="7009" protocol="AJP/1.3" redirectPort="8443" /> <!-- 下面這里的 defaultHost 從 localhost 改為 www.testMyTomcat.com --> <Engine name="Catalina" defaultHost="www.testMyTomcat.com"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="www.testMyTomcat.com" appBase="webapps" 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> </Server>
注意:server.xml 中不能用中文注釋,否則 Tomcat 啟動會失敗,Tomcat 里面的 log 文件夾中的日志會提示諸如下面的錯誤消息:
警告: Catalina.start using conf/server.xml:
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 2 字節的 UTF-8 序列的字節 2 無效。
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanComment(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanComment(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1537)
at org.apache.catalina.startup.Catalina.load(Catalina.java:617)
at org.apache.catalina.startup.Catalina.load(Catalina.java:665)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
上面的代碼,共修改了 2 個地方:
1. Connector 節點的 port 從 7080 改為 80
2. Engine 節點的 defaultHost 從 localhost 改為 www.testMyTomcat.com
修改完后,重啟 Tomcat,然后配置 C:\Windows\System32\Drivers\etc 的 Hosts 文件,增加一個映射:
127.0.0.1 www.testMyTomcat.com
在瀏覽器中輸入 http://www.testMyTomcat.com 卻無法顯示,就像隨意在瀏覽器中輸入一個錯誤的地址后,顯示的一樣的錯誤頁面。左思右想,卻怎么也不知道到底是哪里錯了。后來咨詢同事,才想到可能是 80 端口被占用了,看看是不是被 IIS 給占用了。打開 IIS, 發現:
這就是當時做 Cookie 跨域名傳遞測試時配置的,原來如此,把 80 改為其它的后,再次打開瀏覽器,輸入 http://www.testMyTomcat.com 后終於成功了,哈哈,心里一下子就開心了。
配置虛擬目錄
配置完域名配置,那么如何配置虛擬目錄呢?前面的配置不變,把 Host 節點替換成這樣:
<Host name="www.testMyTomcat.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Alias>testMyTomcat.com</Alias> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Context docBase="E:\Deployment_Projects\Tomcat_WebApp\cas" path="sso" reloadable="true"/> </Host>
注意到了嗎?只是在 </Host> 前面增加了一個
<Context docBase="E:\Deployment_Projects\Tomcat_WebApp\cas" path="sso" reloadable="true"/>
其中 docBase 屬性表示虛擬目錄的地址,默認我的 tomcat 是安裝在 C:\Program Files\Apache Software Foundation\Tomcat 7.0 的,我不想把 cas 項目也放在 C 盤,所以指定了一個絕對路徑,path 屬性表示 URL 訪問時的路徑。
修改完后重新啟動 Tomcat,在瀏覽器中輸入 http://www.testmytomcat.com/sso,結果成功!
配置二級域名
如果我想把 cas 項目(注:cas 是 java 里面著名的單點登錄 SSO 項目)單獨做一個二級域名,而不是以虛擬目錄的形式提供給外部,那么該怎樣配置呢?
1. 首先依舊配置 C:\Windows\System32\Drivers\etc 的 Hosts 文件,增加一個映射:
127.0.0.1 cas.testMyTomcat.com
注:cas.testMyTomcat.com 是我隨意起的,你也可以起名為 sso.testMyTomcat.com ,貌似這樣大氣一點,呵呵...
2. 修改 C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf 的 server.xml,把配置改成下面的代碼(PS:依舊只是把玩 Host 節點):
<Host name="www.testMyTomcat.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Alias>testMyTomcat.com</Alias> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="cas.testMyTomcat.com" appBase="E:\Deployment_Projects\Tomcat_WebApp" 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" /> <Context docBase="E:\Deployment_Projects\Tomcat_WebApp\cas" path="" reloadable="true"/> </Host>
請注意第二個 Host 節點的 appBase 不能和第一個 Host 節點的 appBase 相同。
修改完后重新啟動 Tomcat,在瀏覽器中輸入 http://cas.testmytomcat.com/,結果成功!
完整配置如下:
<?xml version='1.0' encoding='utf-8'?> <Server port="7005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="7009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="www.testMyTomcat.com"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="www.testMyTomcat.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Alias>testMyTomcat.com</Alias> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="cas.testMyTomcat.com" appBase="E:\Deployment_Projects\Tomcat_WebApp" 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" /> <Context docBase="E:\Deployment_Projects\Tomcat_WebApp\cas" path="" reloadable="true"/> </Host> </Engine> </Service> </Server>
多端口配置
如果我想把 cas 項目只是單獨一個端口,那又該如何配置呢?
<Service name="Catalina"> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="7009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" 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="Catalina2"> <Connector port="85" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="86" /> <Connector port="87" protocol="AJP/1.3" redirectPort="86" /> <Engine name="Catalina2" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="E:\Deployment_Projects\Tomcat_WebApp" 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" /> <Context docBase="E:\Deployment_Projects\Tomcat_WebApp\cas" path="" reloadable="true"/> </Host> </Engine> </Service>
注:首先復制一個 Service 節點及子節點,修改相關的 name 屬性和端口號。
打開瀏覽器,分別輸入 Http://localhost/ 和 Http://localhost:85/, 測試通過!
謝謝瀏覽!