解決 Tomcat 無法綁定 80 端口的問題,以及 Tomcat 配置虛擬目錄、二級域名等


問題

今天安裝完 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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %s %b" />
        <Context docBase="E:\Deployment_Projects\Tomcat_WebApp\cas" path=""  reloadable="true"/>
      </Host>
    </Engine>
  </Service>

注:首先復制一個 Service 節點及子節點,修改相關的 name 屬性和端口號。

打開瀏覽器,分別輸入 Http://localhost/   和  Http://localhost:85/, 測試通過!

謝謝瀏覽!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM