幾乎所有容器類型的應用都會包含一個名為 server.xml 的文件結構。基本上,其中的每個元數據或者配置都是容器完成初始化所需要的。正是由于這些內容都是可配置的,使得軟件設計者或架構師可以在容器運行時或銷毀時(停止)的情況下注入需要的服務。明白這一點,其重要性不亞于明白代碼或軟件的工作機制。
對于這篇文章,我們將通過分析 server.xml 文件來理解和配置 appache tomcat 服務器。
準備工作:
安裝教程可以點擊這里。
安裝完成 的tomcat,被放在了你的本地存儲中。對于 windows ,通常在 “ PRogram Files ” 文件夾下,對于 Mac 或者 linux,可能在 /user/var/opt 或 /User/<>/application 文件夾下。進入該目錄,可以看到下面這幾個文件和文件夾:
catalina.properties
和 logging.properties ,
每個引擎在conf 目錄下都有一個對應的子目錄,例如Catalina,反過來對于每個 host 都有一個二級子目錄,比如localhost。可以將上下文信息配置放在這里(類似于 context.xml ,但是對于每個在 host 下的 webapp ,該文件命名為 webapp.xml )。
Catalina
), host name (localhost
), webapp name, followed by the Java classes package structure.Tomcat 是一個 HTTP 服務器。也是一個servlet 容器,可以執行 Java Servlet,將 JavaServer Page(JSP)和 JavaServerFaces(JSF)轉換為 Java Servlet。Tomcat 采用了層次化和模塊化的架構,如下:
圖片1.0 Tomcat 架構
server.xml
“server.xml” 是 Tomcat 的主配置文件,在 <CATALINA_HOME>conf 目錄下可以看到。重構后(刪掉注釋和格式化后)的默認”server.xml“文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <? xml version = '1.0' encoding = 'utf-8' ?> < Server port = "8005" shutdown = "SHUTDOWN" > < Listener className = "org.apache.catalina.core.JasperListener" /> < Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" /> < 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" factory = "org.apache.catalina.users.MemoryUserDatabaseFactory" pathname = "conf/tomcat-users.xml" /> </ GlobalNamingResources > < Service name = "Catalina" > < Connector port = "8080" protocol = "HTTP/1.1" connectionTimeout = "20000" redirectPort = "8443" /> < Connector port = "8009" 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 > </ Server > |
Server(第二行)是頂級組件,代表一個 Tomcat 實例。可以包含一個或多個 Services ,其中每個 Service 都有自己的 Engines 和 Connectors。
1 | < Server port = "8005" shutdown = "SHUTDOWN" > ...... </ Server > |
Server 可以包含幾個監聽器。一個監聽器監聽指定事件,并對其作出響應。
JasperListener 作用于 Jasper JSP 引擎,該引擎負責對更新后的 JSP 頁面進行重編譯。
1 | Listener className="org.apache.catalina.core.JasperListener" /> |
GlobalResourcesLifecycleListener 作用于全局資源,保證 JNDI 對資源的可達性,比如數據庫。
1 | < Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> |
9到15行的元素定義了 JNDI(Java 命名和目錄接口)資源,其允許 Java 軟件客戶端通過名稱搜尋和查找數據。
默認配置通過10到14行的元素定義了一個名稱為 UserDatabase 的 JNDI,通過”conf/tomcat-users.xml“得到了一個用于用戶授權的內存數據庫。
1 2 3 4 5 6 7 | < 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 > |
你也可以定義其它全局化JNDI資源來實現連接池,比如 MySQL 數據庫。
一個 Service 可以連接一個或多個 Connectors 到一個引擎。默認配置定義了一個名為“Catalina”的 Service ,連接了兩個 Connectors:HTTP 和 AJP 到當前的引擎。
1 | < Service name = "Catalina" > ...... </ Service > |
一個 Connector 關聯到一個 TCP 端口,負責處理 Service 與客戶端之間的交互。默認配置定義了兩個 Connectors。
HTTP/1.1:處理 HTTP 請求,使得 Tomcat 成為了一個 HTTP 服務器。客戶端可以通過 Connector 向服務器發送 HTTP 請求,接收服務器端的 HTTP 響應信息。
1 | < Connector port = "8080" protocol = "HTTP/1.1" connectionTimeout = "20000" redirectPort = "8443" /> |
與生產服務默認使用80端口不同,Tomcat HTTP 服務默認在 TCP 端口8080上運行 。你可以選擇1024到65535之間的任意數字作為端口號來運行 Tomcat 服務器,前提是該端口沒有被任何其它應用使用。connectionTimeOut 屬性定義了這個 connector 在鏈接獲得同意之后,獲得請求 URI line(請求信息)響應的最大等待時間毫秒數。默認為20秒。redirect 屬性會把 SSL 請求重定向到 TCP 的8443端口。AJP/1.3:Apache JServ Protocol connector 處理 Tomcat 服務器與 Apache HTTP 服務器之間的交互。
1 | < Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" /> |
可以將 Tomcat 和 Apache HTTP 服務運行在一起,Apache HTTP 服務器處理靜態請求和 php;Tomcat 服務器負責處理 Java Servlet/JSP 。可以參閱“Tomcat 與 Apache 協同工作如何配置”。
包含了 Engine、Host、Context和 Cluster 的 Tomcat 稱為容器。最高級的是 Engine,最底層的是 Context。某些組件,比如 Realm 和 Valve,也可以放在容器中。
引擎是容器中最高級別的部分。可以包含一個或多個 Host。Tomcat 服務器可以配置為運行在多個主機名上,包括虛擬主機。
1 | < Engine name = "Catalina" defaultHost = "localhost" /> |
Catalina 引擎 從 HTTP connector 接收 HTTP 請求,并根據請求頭部信息中主機名或 IP 地址重定向到正確的主機上。
一個 Realm(域)就是一個包含 user、passWord 和 role 認證(比如訪問控制)的數據庫。你可以在任何容器中定義 Realm ,例如 Engine、Host、Context 和 Cluster。
1 2 3 | < Realm className = "org.apache.catalina.realm.LockOutRealm" > < Realm className = "org.apache.catalina.realm.UserDatabaseRealm" resourceName = "UserDatabase" /> </ Realm > |
默認配置定義了一個 Catalina Engine 的 Realm(UserDatabaseRealm),對用戶訪問 engine 的權限進行控制。其使用定義在 GlobalNamingResources 中,名字為 UserDatabase 的 JNDI。
除了 UserDatabaseRealm 以外,還有:JDBCRealm(授權用戶是否可以通過 JDBC 驅動鏈接到關系型數據庫);DataSourceRealm(通過 JNDI 連到數據源);JNDIRealm(連接到一個 LDAP 目錄)和 MemoryRealm (將 XML 文件加載到內存)。
一個 Host 定義了在 Engine 下的一個虛擬機,反過來其又支持多個 Context(web 應用)。
1 | < Host name = "localhost" appBase = "webapps" unpackWARs = "true" autoDeploy = "true" /> |
默認配置定義了一個名為 localhost 的主機。appBase 屬性定義了所有 webapp 的根目錄,在這種情況下是 webapps。默認情況下,每一個 webapp 的 URL 和它所在的目錄名稱相同。例如,默認的 Tomcat 安裝目錄的 webapps 下提供了四個 web 應用:docs、examples、host-manager 和 manager。只有 ROOT 是個例外,它用一個空字符串定義。也就是說,它的 URL 是 http://localhost:8080/。unpackWARs 屬性指定了放到 webapps 目錄下的 WAR-file 是否應該被解壓。對于 unpackWARs=”false“,Tomcat 將會直接從 WAR-file 運行應用,而不解壓,這可能導致應用運行變慢。autoDeploy 屬性指定了是否自動部署放到 webapps 目錄下的應用。
Tomcat 支持服務器集群。它可以復制整個集群的會話和上下文屬性。也可以部署一個 WAR 文件到所有的集群上。
Valve (閥門)作為請求的前置處理程序,可以在請求發送到應用之前攔截 HTTP 請求。可以定義在任何容器中,比如 Engine、Host、Context和 Cluster。默認配置中,AccessLogValve 會攔截 HTTP 請求,并在日志文件中創建一個日志切入點,如下:
1 2 3 | < Valve className = "org.apache.catalina.valves.AccessLogValve" directory = "logs" prefix = "localhost_access_log." suffix = ".txt" pattern = "%h %l %u %t " %r" %s %b" /> |
以下是其它一些 valve:
更多信息見于 server.xml 文件的頂層和嵌套級別的元素和屬性,可以在這里查看。
現在,如果我們想要為應用修改 server.xml 文件該怎么做?不能僅僅因為一個應用修改 server.xml 文件,因為它可能會對所有應用部署的初始化產生影響。對于指定的應用如何隔離指定的變化?
答案就是:創建一個 server-<name>.xml
server-.xml 是一個自定義的文件,包含了對于一個指定 app 需要隔離的配置變化。所有這種格式的文件都會在 server.xml 文件之后被調用。
不推薦這么做,但如果想滿足下自己好奇心的除外,你可以通過編輯 catalina.bat 文件來使用你自己的 server.xml 作為替代。
1 | catalina.bat start -config confserver-< name >.xml |
總的來講,無論是 serve.xml 還是你自己的 server-<name>.xml 文件,都是 container 的核心配置。對于應用開發者和發布管理員來講,是一種在部署 J2EE 應用的容器中放入資源文件的補充策略。其它無論以何種方式實現的 J2EE 標準容器(廠商),都有相同的配置文件,允許自定義注入和綁定,同時允許在部署、重新部署和卸載時控制哪些服務是有效的。
前兩天在一群里看見有人推薦一個app叫問啊,就可以發題答題那種的,感覺就跟uber滴滴打車似的,一般這種軟件一上來就砸錢給紅包啥的,哥之前刷過uber的單有經驗!試驗了幾次應該可以刷,把注冊紅包和之前領的紅包錢套現,目前我提了五十多,目測還能刷更多。ps,但是盡量要問技術相關的問題,不然容易被封。有技術的可以自己試,不會的可以q我:315414695
新聞熱點
疑難解答