Jetty9架構解析-Jetty配置及部署(二)
2.2. Jetty配置方式
除了Jetty配置及部署(一)介紹的命令列引數、ini和XML(Jetty IoC)檔案的預設配置方式外,Jetty也為我們提供了其它靈活的配置方案。
由於Jetty的伺服器物件(如Server、連結器、Context等)都是POJO,因此從理論上講,我們可以採用程式設計的方式配置Jetty,這便是嵌入式Jetty所完成的工作。不僅如此,我們還可以採用其它IoC框架配置Jetty伺服器。例如官方即支援通過Spring容器進行配置及例項化Jetty伺服器。只要啟動模組中包含了spring(模組名),我們就可以直接使用Spring的Bean配置檔案來替代Jetty IoC檔案。在講解Web應用部署時,你將會看到一個採用Spring進行部署配置的示例。
總之,Jetty對IoC框架整合的機制非常靈活,只要願意,我們可以非常容易的實現自己的替代方案,具體實現方式可以參見“擴充套件篇”。
注意:與Tomcat相比,Jetty的可擴充套件性做的非常出色。除了它的模組化架構,各個元件的可擴充套件性也充分說明了這一點。這也是Jetty進行嵌入式開發如此便捷的原因,而Tomcat的伺服器生命週期處理,有部分是與其Catalina容器配置解析耦合在一起的,因此如果要進行嵌入式開發,則需要做額外的適配工作。
2.3. Jetty配置方式
本節主要講解Jetty相關的啟動配置,包括載入規則和常見的啟動引數。
2.3.1. 載入規則
從前面的講解我們知道,Jetty有三種方式新增命令列啟動引數:命令列新增、start.ini、start.d/*.ini(大多數情況下,start.ini和start.d不必兩者都保留,只需要兩者擇其一即可)。對於這三種方式,如果存在重複的配置,Jetty將自行進行覆蓋。其具體規則是命令列的優先順序最高,start.d目錄次之,start.ini檔案最低。這也符合我們對配置靈活性的要求,保證最靈活的方式優先順序最高。
2.3.2. 常見啟動引數
下面我們整理了部分常用的Jetty啟動引數及其用途說明,你可以根據需要採用任意一種方式配置使用,如表2-1所示。
注意:所有JVM相關的引數也可以直接通過ini檔案設定,此處不再贅述。
表2-1 Jetty常見啟動引數
引數 | 所屬模組 | 說明 |
---|---|---|
jetty.http.host | http | HTTP連結器繫結的主機地址,預設本機所有有效IP地址。 |
jetty.http.port | http | HTTP連結器監聽的埠號,預設為8080。 |
jetty.http.idleTimeout | http | HTTP連結的最大空閒時間,單位為毫秒,預設為30000。 |
jetty.http.soLingerTime | http | HTTP連結器Socket Linger時間,預設為-1,即禁用。 |
jetty.http.acceptors | http | HTTP連結器用於接收請求的執行緒數量,預設為-1,Jetty基於處理器核數選擇一個值,具體規則是低於16核為1,低於24核為2,低於32核為3,32核以上為4。 |
jetty.http.selectors | http | Socket selector的數量,預設為-1,Jetty基於處理器核數選擇一個值,具體規則是低於4核為1,低於8核為3,8核以上為4。 |
jetty.http.acceptorQueueSize | http | 用於設定ServerSocket繫結時的backlog值,輸入連線指示(對連線的請求)的最大佇列長度。如果佇列滿時收到連線指示,則拒絕該連線。 |
jetty.threadPool.minThreads | server | Jetty執行緒池最小執行緒數,預設為10。 |
jetty.threadPool.maxThreads | server | Jetty執行緒池最大執行緒數,預設為200。 |
jetty.threadPool.idleTimeout | server | Jetty執行緒池執行緒空閒超時時間,單位為毫秒,預設為60000。 |
jetty.httpConfig.secureScheme | server | HTTP安全重定向時,URI的Scheme,預設為https。 |
jetty.httpConfig.securePort | server | HTTP安全重定向埠,預設為8443。 |
jetty.httpConfig.outputBufferSize | server | HTTP響應內容緩衝大小,單位為位元組,預設為32768。 |
jetty.httpConfig.outputAggregationSize | server | 可以緩衝的響應內容最大寫入長度,單位為位元組,預設為8192。 |
jetty.httpConfig.requestHeaderSize | server | HTTP請求頭的最大值,單位為位元組,預設為8192。 |
jetty.httpConfig.responseHeaderSize | server | HTTP響應頭的最大值,單位為位元組,預設為8192。 |
jetty.server.stopAtShutdown | server | 在控制檯按下ctrl+c停止Jetty伺服器。 |
jetty.server.stopTimeout | server | Jetty優雅停止的超時時間,單位為毫秒,預設5000。 |
jetty.server.dumpAfterStart | server | Jetty啟動之後,輸出伺服器、元件以及Web應用的狀態。 |
jetty.server.dumpBeforeStop | server | Jetty關閉之前,輸出伺服器、元件以及Web應用的狀態。 |
jetty.ssl.host | ssl | TLS/SSL連結器繫結的主機地址,預設本機所有有效的IP地址。 |
jetty.ssl.port | ssl | TLS/SSL連結器監聽的埠,預設為8443。 |
jetty.ssl.idleTimeout | ssl | TLS/SSL連結器空閒超時時間,單位為毫秒,預設30000。 |
jetty.ssl.soLingerTime | ssl | TLS/SSL連結器Socket Linger時間,預設為-1,即禁用。 |
jetty.ssl.acceptors | ssl | TLS/SSL連結器用於接收請求的執行緒數量。 |
jetty.ssl.selectors | ssl | TLS/SSL連結器Socket selector的數量。 |
jetty.ssl.acceptorQueueSize | ssl | 設定TLS/SSL連結器ServerSocket繫結時的backlog值 |
jetty.ssl.sniHostCheck | ssl | 是否檢查請求主機名是否匹配SNI 名稱。 |
jetty.ssl.stsMaxAgeSeconds | ssl | 設定Strict-Transport-Security 響應頭的過期時間,單位為秒,預設為3153600。 |
jetty.sslContext.keyStorePath | ssl | 金鑰庫檔案路徑,相對於$JETTY_BASE。 |
jetty.sslContext.trustStorePath | ssl | 信任庫檔案路徑,相對於$JETTY_BASE。 |
jetty.sslContext.keyStorePassword | ssl | 金鑰庫密碼。 |
jetty.sslContext.keyStoreType | ssl | 金鑰庫型別(JCEKS、JKS、DKS、PKCS11、PKCS12)。 |
jetty.sslContext.keyStoreProvider | ssl | 金鑰庫提供者。 |
jetty.sslContext.keyManagerPassword | ssl | KeyManager密碼。 |
jetty.sslContext.trustStorePassword | ssl | 信任庫密碼。 |
jetty.sslContext.trustStoreType | ssl | 信任庫型別(JCEKS、JKS、DKS、PKCS11、PKCS12)。 |
jetty.sslContext.trustStoreProvider | ssl | 信任庫提供者。 |
jetty.sslContext.needClientAuth | ssl | 是否要求客戶端證書認證,如果為true並且客戶端選擇不提供自身的驗證資訊,則協商將會停止。 |
jetty.sslContext.wantClientAuth | ssl | 是否請求客戶端證書認證,如果為true並且客戶端選擇不提供其自身的驗證資訊,則協商將會繼續。 |
jetty.sslContext.sslSessionCacheSize | ssl | SSL會話快取大小。 |
jetty.sslContext.sslSessionTimeout | ssl | SSL會話快取超時時間,單位為秒。 |
jetty.gzip.minGzipSize | ssl | 指定一個HTTP響應內容長度的限制,當超過該值時,Jetty啟動GZIP壓縮。 |
jetty.gzip.compressionLevel | ssl | GZIP壓縮級別。 |
jetty.gzip.excludedUserAgent | ssl | 正則表示式,用於指定禁用GZIP的User Agent。如果請求的User Agent匹配該表示式,則將不啟用GZIP壓縮。預設為.MSIE.6.0.,即IE6不支援GZIP壓縮。 |
jetty.deploy.monitoredDir | deploy | Jetty部署模組監控目錄,相對於$JETTY_BASE,用於熱部署監控檔案變更。 |
jetty.deploy.monitoredPath | deploy | Jetty部署模組監控路徑(絕對目錄),用於熱部署監控檔案變更。 |
jetty.deploy.defaultsDescriptorPath | deploy | Web應用使用的預設部署描述檔案,該檔案中的配置資訊將會被所有Web應用繼承,預設為/etc/webdefault.xml。 |
jetty.deploy.scanInterval | deploy | Jetty部署模組掃描監控目錄的時間間隔,單位為秒,預設為1秒。 |
jetty.deploy.extractWars | deploy | 是否解壓WAR包,預設為true。 |
jetty.jmxremote.rmihost | jmx-remote | JMX遠端訪問繫結的RMI主機地址。 |
jetty.jmxremote.rmiport | jmx-remote | JMX遠端訪問RMI監聽的埠,預設為1999。 |
Jetty在啟動時,會自動獲取引數的鍵值對,並在載入各個模組時,將引數值以IoC的方式注入到各個元件物件。這是Jetty與Tomcat在引數處理方面的一大區別,Tomcat引數均以硬編碼的方式進行讀取,即便我們可以通過引數去控制Tomcat元件的行為,但是對於引數本身我們卻無法控制。而Jetty則是在用IoC的方式構造元件物件時動態注入,因此方案更加靈活。我們完全可以通過更改IoC檔案來增加、修改甚至刪除相關引數,Tomcat則無法做到這一點。
注意:將引數讀取載入與IoC框架結合的優勢就是,在支援IoC框架的可替代性的同時,又不會降低系統的可配置性。針對Jetty的引數處理方式,相信熟悉Spring的讀者會非常容易找到替代方案。
新書上市