1. 程式人生 > >Jetty9架構解析-Jetty配置及部署(二)

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的讀者會非常容易找到替代方案。

新書上市
《Tomcat架構解析》