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的读者会非常容易找到替代方案。
新书上市