首先帶着疑問html
問題一:去哪配置?
核心配置在Tomcat目錄下conf/
目錄下的server.xml
文件中java問題二:怎麼配置?web
以下apache
<!-- Server 根元素,建立⼀個Server實例,⼦標籤有 Listener、GlobalNamingResources、Service --> <Server> <!--定義監聽器--> <Listener/> <!--定義服務器的全局JNDI資源 --> <GlobalNamingResources/> <!-- 定義⼀個Service服務,⼀個Server標籤能夠有多個Service服務實例 --> <Service/> </Server>
說明Tomcat來監聽port端口來執行關閉瀏覽器
<!-- port:關閉服務器的監聽端⼝ shutdown:關閉服務器的指令字符串 --> <Server port="8005" shutdown="SHUTDOWN"> <!-- 以⽇志形式輸出服務器 、操做系統、JVM的版本信息 --> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" /> --> <!--APR library loader. Documentation at /docs/apr.html --> <!-- 加載(服務器啓動) 和 銷燬 (服務器停⽌) APR。 若是找不到APR庫, 則會輸出⽇志, 並不影響 Tomcat啓動 --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!-- Prevent memory leaks due to use of particular java/javax APIs--> <!-- 避免JRE內存泄漏問題 --> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <!-- 加載(服務器啓動) 和 銷燬(服務器停⽌) 全局命名服務 --> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <!-- 在Context停⽌時重建 Executor 池中的線程, 以免ThreadLocal 相關的內存泄漏 --> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html GlobalNamingResources 中定義了全局命名服務 --> <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <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> <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/service.html --> <Service name="Catalina"> ... </Service> </Server>
Listenertomcat
GlobalNamingResources (中定義了全局命名服務)安全
Service (以下)服務器
以上標籤Listener
、GlobalNamingResources
通常狀況下保持默認便可,不須要而外操做,重點在於Service 標籤app
<Service name="Catalina"> ... </Service>
該標籤⽤於建立 Service 實例,默認使⽤ org.apache.catalina.core.StandardService
。 默認狀況下,Tomcat 僅指定了Service 的名稱, 值爲 "Catalina"。webapp
用來定義共享線程池的。
默認是被註釋掉的,且屬性不全。那麼該如何使用呢?
默認狀況下,Service 並未添加共享線程池配置。 若是咱們想添加⼀個線程池, 能夠在
<Executor name="commonThreadPool" namePrefix="thread-exec-" maxThreads="200" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/>
org.apache.catalina.core.StandardThreadExecutor
。若是想使⽤⾃定義線程池⾸先須要實現 org.apache.catalina.Executor
接⼝Connector 標籤⽤於建立連接器實例默認狀況下,server.xml
配置了兩個連接器,⼀個⽀持HTTP協議,⼀個⽀持AJP協議,⼤多數狀況下,咱們並不須要新增連接器配置,只是根據須要對已有連接器進⾏優化。
<!--org.apache.coyote.http11.Http11NioProtocol , ⾮阻塞式 Java NIO 連接器--> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
maxThreads
、minSpareThreads
等屬性配置內部線程池。可使用共享線程池:
<Connector port="8080" protocol="HTTP/1.1" executor="commonThreadPool" maxThreads="1000" minSpareThreads="100" acceptCount="1000" //每每和maxThreads保持一致 maxConnections="1000" //每每和maxThreads保持一致 connectionTimeout="20000" compression="on" //要不要啓動gzip壓縮 compressionMinSize="2048" //壓縮處理的最小大小,超過此大小才壓縮 disableUploadTimeout="true" //單獨的給servlet放寬超時時間 redirectPort="8443" URIEncoding="UTF-8" />
能夠看到
Connector
標籤和Executor
都有maxThreads
和minSpareThreads
標籤。每個Connector均可以本身定義一個線程池,若是每一個Connector都本身定義線程池就浪費了。因此爲何不用一個呢?因而就有了Executor標籤來定義一個共享線程池。
Engine 表示 Servlet 引擎
<Engine name="Catalina" defaultHost="localhost"> ... </Engine>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> ... </Host>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
當請求來臨時,日誌存放起來,
directory
值的目錄<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
hostname是localhost,appBase是webapps,去webapps文件夾下找應用程序文件夾,沒有指定,默認就去ROOT文件夾下:
www.abc.com
,www.def.com
。appBase分別爲webapps
、webapps2
能夠看到localhost:8080訪問不到了,由於這個虛擬主機被咱們修改了
而abc和def都可以找到。同時def.com的Home也被修改成Home-webapps2了。
用於配置一個Web應用——一個虛擬主機下能夠配置多個應用
<Host name="www.abc.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- docBase:Web應⽤⽬錄或者War包的部署路徑。能夠是絕對路徑,也能夠是相對於 Host appBase的 相對路徑。 path:Web應⽤的Context 路徑。若是咱們Host名爲localhost, 則該web應⽤訪問的根路徑爲: http://localhost:8080/web_demo。 --> <Context docBase="E://dengxhh" path="/dengxh"></Context> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
剛纔咱們訪問的是
http://www.abc.com:8080
,那麼如今我想輸入http://www.abc.com:8080/dengxh
,dengxh所表明的位置是個人磁盤上的某個文件夾,這個文件夾裏放的個人程序資源。如何作?
爲了方便演示,咱們就拿ROOT中的程序作例子,把webapps中的ROOT文件夾複製到E盤根目錄,取名爲dengxhh
在Host標籤中,增長 <Context docBase="E://dengxhh" path="/dengxh"></Context>
重啓Tomcat,訪問www.abc.com/dengxh/ ,成功跳轉了。
如此操做就能夠在一個虛擬主機中,配置多個應用,只須要在host標籤中配置多個Context標籤,區分的時候只須要在虛擬主機後跟上Context的path屬性的值便可找到對應的資源。
例如:Host name="www.abc.com" ,Context path ="dengxh" ,那麼瀏覽器中輸入 www.abc.com/dengxh
便可。
思惟導圖在線觀看地址:https://www.processon.com/view/link/5fe4da565653bb054783ca6e