在座各位老鐵程序開發多年,想必Tomcat一直是都是大家的必用貓吧,在項目中配一下Tomcat,copy一份server.xml覆蓋進來,就能夠輕鬆愉快的把項目跑起來了。javascript
可是.....php
大家有沒有想過Tomcat是怎麼運行大家充滿bug的程序的呢?server.xml裏的這些垃圾配置又是什麼用的呢?css
下面,我附上一份花費多日嘔心瀝血製做而成的server.xml配置詳解,費你們腦袋和鈦合金眼睛仔細看看:html
<?xml version='1.0' encoding='utf-8'?>
<!--Server:最頂層,表明整個Tomcat容器 , port:指定負責監聽的關閉端口 主要用於tomcat服務關閉時回調給應用程序的監聽 -->
<Server port="8005" shutdown="SHUTDOWN">
<!-- Listener:監聽器 能夠在特定事件發生時執行特定的操做;被監聽的事件一般是Tomcat的啓動和中止-->
<!-- VersionLoggerListener:當Tomcat啓動時,該監聽器記錄Tomcat、Java和操做系統的信息。該監聽器必須是配置的第一個監聽器 -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!-- JasperListener:在Web應用啓動以前初始化Jasper,Jasper是JSP引擎,把JVM不認識的JSP文件解析成java文件, 而後編譯成class文件供JVM使用。 -->
<Listener className="org.apache.catalina.core.JasperListener" />
<!-- JreMemoryLeakPreventionListener:類加載器致使的內存泄露有關 -->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<!-- GlobalResourcesLifecycleListener:初始化< GlobalNamingResources>標籤中定義的全局JNDI資源; 若是沒有該監聽器,任何全局資源都不能使用 -->
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<!-- ThreadLocalLeakPreventionListener:當Web應用因thread-local致使的內存泄露而要中止時,該監聽器會觸發線程池中線程的更新。當線程執行完任務被收回線程池時, 活躍線程會一個一個的更新。只有當Web應用(即Context元素)的renewThreadsWhenStoppingContext屬性設置爲true時,該監聽器纔有效。 -->
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- 服務器的全局JNDI資源 -->
<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:服務組件,對外提供服務,一個service表明一個服務 -->
<Service name="Catalina">
<!--Connector: 接收鏈接請求,建立Request和Response對象用於和請求端交換數據; 而後分配線程讓Engine來處理這個請求,並把產生的Request和Response對象傳給Engine。 能夠配置多個Connector, 經過建立不一樣的Connector指定不一樣的port和協議訪問Tomcat服務 常見的屬性有: protocol:協議,有HTTP、AJP等各類協議等 connectionTimeout:連接超時時間 redirectPort:指定服務器正在處理http請求時,收到了一個SSL傳輸請求後,重定向的端口號 -->
<Connector keepAliveTimeout="10000" namePrefix="catalina-exec-" maxThreads="1024" minSpareThreads="4" maxIdleTime="6000" connectionTimeout="1000" compression="on" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" enableLookups="false" maxKeepAliveRequests="1" maxConnections="1024" acceptCount="2000" port="8008" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8444" />
<!--Engine:請求處理組件,在service組件中有且只有一個,Service組件中的請求處理組件。 Engine組件從一個或多個Connector中接收請求並處理,並將完成的響應返回給Connector,最終傳遞給客戶端 他有如下屬性: name:Engine的邏輯名稱,在日誌和錯誤消息中會用到 defaultHost:指定默認主機,若是沒有分配哪一個Host來執行用戶請求,由這個值所指定的主機來處理, 這個值必須和<Host>元素中的其中一個的name值相同 -->
<Engine name="Catalina" defaultHost="localhost">
<!-- Host:能夠有一或多個Host組件,每一個Host組件表明Engine中的一個虛擬主機。 Host的做用是能夠運行多個Web應用(一個Context表明一個Web應用),並負責安裝、展開、啓動和結束每一個Web應用, 它的屬性有: name:指定虛擬主機的主機名,通常狀況下,主機名須要是在DNS服務器中註冊的網絡名,可是Engine指定的defaultHost不須要 unpackWARs:是否將表明Web應用的WAR文件解壓;若是爲true,經過解壓後的文件結構運行該Web應用,若是爲false,直接使用WAR文件運行Web應用 appBase:應用程序基本目錄,即存放應用程序的目錄,能夠是計算機中的絕對目錄,也能夠是相對CATALINA_HOME的相對目錄,不填則默認爲tomcat下webapps目錄 alias:指定主機別名 autoDeploy:是否自動發佈;用於檢測appBase下的文件,若是有新增或者修改,爲true則會自動從新啓動項目 -->
<Host name="localhost" appBase="" unpackWARs="true" autoDeploy="false">
<!-- Context:指當前Host上運行的一個Web應用 ,每一個Host中能夠定義任意多的Context元素。 它有如下屬性: path:訪問該Web應用的上下文路徑 docBase:指定了該Web應用使用的WAR包路徑,或應用目錄。 reloadable:tomcat是否在運行時監控在WEB-INF/classes和WEB-INF/lib目錄下class文件的改動 -->
<Context path="" docBase="/Users/jaybril-pro/Documents/workspace/neno/BlackEye-SCAN/web" reloadable="true" />
</Host>
</Engine>
</Service>
</Server>
複製代碼
經過研究上面的配置和註釋,想必你們已經對這個配置的講解理解的一塌糊塗了吧?由於密密麻麻花裏胡哨的代碼和漢字混雜在一塊兒,看起來就像腦袋撞牆冒星星同樣難受。java
好吧,咱們根據真實場景分析一下從用戶在瀏覽器輸入網址發請求到最終返回結果展現到網站這一個過程在客戶端瀏覽器、提供web程序的服務器、Tomcat、web程序分別在哪一個步驟作了什麼騷操做:web
至此,一個完整的http請求完成。結合這個流程再看上面的server.xml配置,應該是一點即通了吧。apache
以爲本文對你有幫助?請分享給更多人編程
關注「編程無界」,提高裝逼技能瀏覽器