HTTP 连接器

目录

简介

HTTP 连接器元素表示一个支持 HTTP/1.1 协议的连接器组件。除了执行 servlet 和 JSP 页面外,它还使 Catalina 能够作为独立 Web 服务器运行。此组件的一个特定实例侦听服务器上特定 TCP 端口号上的连接。一个或多个此类连接器可以配置为单个服务的一部分,每个连接器转发到关联的引擎来执行请求处理并创建响应。

如果您希望配置用于通过 AJP 协议连接到 Web 服务器的连接器(例如 Apache 1.3 的mod_jk 1.2.x连接器),请参阅AJP 连接器文档。

每个传入的非异步请求在该请求持续期间需要一个线程。如果接收到的同时请求比当前可用的请求处理线程所能处理的更多,则将创建其他线程,直至达到配置的最大值(maxThreads 属性的值)。如果仍收到更多同时请求,Tomcat 将接受新连接,直到当前连接数达到 maxConnections。连接在由 Connector 创建的服务器套接字内排队,直到有线程可用于处理连接。一旦达到 maxConnections,操作系统将对进一步的连接排队。操作系统提供的连接队列的大小可以通过 acceptCount 属性控制。如果操作系统队列已满,则可能会拒绝或超时进一步的连接请求。

属性

通用属性

Connector 的所有实现都支持以下属性

属性 说明
allowBackslash

如果为 true,则允许使用“\”字符作为路径分隔符。

如果未指定,则使用默认值 false

allowTrace

一个布尔值,可用于启用或禁用 TRACE HTTP 方法。如果未指定,则此属性设置为 false。根据 RFC 7231 第 4.3.8 节,cookie 和授权标头将从对 TRACE 请求的响应中排除。如果您希望包含这些标头,则可以为目标 Servlet 实现 doTrace() 方法,并完全控制响应。

asyncTimeout

异步请求的默认超时(以毫秒为单位)。如果未指定,则此属性设置为 Servlet 规范默认值 30000(30 秒)。

discardFacades

一个布尔值,可用于启用或禁用隔离容器内部请求处理对象的 facade 对象的回收。如果设置为 true,则将在每次请求后将 facade 设置为垃圾回收,否则将重复使用它们。启用安全管理器时,此设置无效。如果未指定,则此属性设置为 true

enableLookups

如果希望调用 request.getRemoteHost() 以便执行 DNS 查找以返回远程客户端的实际主机名,则设置为 true。设置为 false 以跳过 DNS 查找,并以字符串形式返回 IP 地址(从而提高性能)。默认情况下,DNS 查找被禁用。

encodedSolidusHandling

当设置为 reject 时,将拒绝包含 %2f 序列的请求路径,并返回 400 响应。当设置为 decode 时,包含 %2f 序列的请求路径将同时对该序列解码为 /,同时对其他 %nn 序列进行解码。当设置为 passthrough 时,包含 %2f 序列的请求路径将使用未更改的 %2f 序列进行处理。如果未指定,则默认值为 reject

enforceEncodingInGetWriter

如果这是 true,则在未指定字符编码的情况下调用 Response.getWriter() 将导致后续对 Response.getCharacterEncoding() 的调用返回 ISO-8859-1,并且 Content-Type 响应头将包括 charset=ISO-8859-1 组件。(SRV.15.2.22.1)

如果未指定,将使用符合默认规范的值 true

maxCookieCount

允许用于请求的最大 cookie 数。小于零的值表示没有限制。如果未指定,将使用默认值 200。

maxParameterCount

从查询字符串以及对于 POST 请求,如果内容类型为 application/x-www-form-urlencodedmultipart/form-data,则从请求正文获取的请求参数(包括上传的文件)的最大总数。超过此限制的请求参数将被忽略。小于 0 的值表示没有限制。如果未指定,则使用默认值 10000。请注意,FailedRequestFilter filter 可用于拒绝超出限制的请求。

maxPostSize

容器 FORM URL 参数解析将处理的 POST 的最大字节数。可以通过将此属性设置为小于零的值来禁用限制。如果未指定,则此属性设置为 2097152(2 MiB)。请注意,FailedRequestFilter 可用于拒绝超出此限制的请求。

maxSavePostSize

容器在 FORM 或 CLIENT-CERT 身份验证或 HTTP/1.1 升级期间保存/缓冲的请求正文的最大字节大小。对于这两种类型的身份验证,请求正文将在用户身份验证之前保存/缓冲。对于 CLIENT-CERT 身份验证,请求正文在 SSL 握手的持续时间内缓冲,并在请求处理时清空缓冲区。对于 FORM 身份验证,POST 在用户被重定向到登录表单时保存,并在用户成功验证或与身份验证请求关联的会话过期之前保留。对于 HTTP/1.1 升级,请求正文在升级过程的持续时间内缓冲。可以通过将此属性设置为 -1 来禁用此限制。将此属性设置为零将禁用在身份验证和 HTTP/1.1 升级期间保存请求正文数据。如果未指定,此属性将设置为 4096(4 千字节)。

parseBodyMethods

使用 application/x-www-form-urlencoded 的请求正文将被解析为与 POST 相同的请求参数的 HTTP 方法的逗号分隔列表。这对于希望为 PUT 请求支持 POST 样式语义的 RESTful 应用程序很有用。请注意,除了 POST 之外的任何设置都会导致 Tomcat 以违背 servlet 规范意图的方式运行。根据 HTTP 规范,此处明确禁止 HTTP 方法 TRACE。默认值为 POST

port

Connector 将在该 TCP 端口号上创建一个服务器套接字并等待传入连接。您的操作系统将只允许一个服务器应用程序侦听特定 IP 地址上的特定端口号。如果使用特殊值 0(零),则 Tomcat 将随机选择一个空闲端口供此连接器使用。这通常仅在嵌入式和测试应用程序中才有用。

protocol

设置处理传入流量的协议。默认值为 HTTP/1.1,它使用基于 Java NIO 的连接器。
要使用显式协议,可以使用以下值
org.apache.coyote.http11.Http11NioProtocol - 非阻塞 Java NIO 连接器
org.apache.coyote.http11.Http11Nio2Protocol - 非阻塞 Java NIO2 连接器
也可以使用自定义实现。
查看我们的 连接器比较 表格。Java 连接器的配置对于 http 和 https 来说是相同的。

proxyName

如果此 Connector 在代理配置中使用,请配置此属性以指定要为对 request.getServerName() 的调用返回的服务器名称。有关更多信息,请参见 代理支持

proxyPort

如果此 Connector 在代理配置中使用,请配置此属性以指定要为对 request.getServerPort() 的调用返回的服务器端口。有关更多信息,请参见 代理支持

redirectPort

如果此连接器支持非 SSL 请求,并且收到了请求,而匹配的 <security-constraint> 需要 SSL 传输,Catalina 会自动将请求重定向到此处指定的端口号。

rejectSuspiciousURIs

如果 URI 与 Servlet 6.0 规范识别的可疑 URI 模式之一匹配,此连接器是否应拒绝请求?默认值为 false

scheme

将此属性设置为希望通过调用 request.getScheme() 返回的协议的名称。例如,对于 SSL 连接器,将此属性设置为“https”。默认值为“http”。

secure

如果希望此连接器接收的请求的 request.isSecure() 调用返回 true,请将此属性设置为 true。你希望在 SSL 连接器或从 SSL 加速器(如加密卡、SSL 设备甚至 Web 服务器)接收数据的非 SSL 连接器上使用此属性。默认值为 false

URIEncoding

在对 URL 进行 %xx 解码后,此属性指定用于解码 URI 字节的字符编码。默认值为 UTF-8

useBodyEncodingForURI

此属性指定是否应将 contentType 中指定的编码用于 URI 查询参数,而不是使用 URIEncoding。此设置是为了与 Tomcat 4.1.x 兼容,在 Tomcat 4.1.x 中,contentType 中指定的编码或使用 Request.setCharacterEncoding 方法显式设置的编码也用于 URL 中的参数。默认值为 false

注释: 1) 此设置仅应用于请求的查询字符串。与 URIEncoding 不同,它不影响请求 URI 的路径部分。2) 如果不知道请求字符编码(浏览器未提供,并且未通过 SetCharacterEncodingFilter 或使用 Request.setCharacterEncoding 方法的类似过滤器设置),则默认编码始终为“ISO-8859-1”。URIEncoding 设置对此默认值没有影响。

useIPVHosts

将此属性设置为 true 以使 Tomcat 使用收到请求的 IP 地址来确定将请求发送到的主机。默认值为 false

xpoweredBy

将此属性设置为 true 以使 Tomcat 使用规范中推荐的标头来宣传对 Servlet 规范的支持。默认值为 false

标准实现

除上面列出的通用连接器属性外,标准 HTTP 连接器(NIO 和 NIO2)还支持以下属性。

属性 说明
acceptCount

当达到 maxConnections 时,用于传入连接请求的操作系统提供的队列的最大长度。操作系统可能会忽略此设置并为队列使用不同的尺寸。当此队列已满时,操作系统可能会主动拒绝其他连接或使这些连接超时。默认值为 100。

acceptorThreadPriority

接受器线程的优先级。用于接受新连接的线程。默认值为 5java.lang.Thread.NORM_PRIORITY 常量的值)。有关此优先级含义的更多详细信息,请参阅 java.lang.Thread 类的 JavaDoc。

address

对于具有多个 IP 地址的服务器,此属性指定将用于侦听指定端口的地址。默认情况下,连接器将侦听所有本地地址。除非使用系统属性以其他方式配置 JVM,否则基于 Java 的连接器(NIO、NIO2)在使用 0.0.0.0:: 配置时将侦听 IPv4 和 IPv6 地址。

allowHostHeaderMismatch

默认情况下,Tomcat 将拒绝在请求行中指定主机但在主机标头中指定不同主机的请求。可以通过将此属性设置为 true 来禁用此检查。如果未指定,则默认值为 false
此设置将在 Tomcat 11 及更高版本中删除,其中它将被硬编码为 false

allowedTrailerHeaders

默认情况下,Tomcat 在处理分块输入时将忽略所有尾部标头。要处理标头,必须将其添加到此以逗号分隔的标头名称列表中。

bindOnInit

控制连接器使用的套接字的绑定时间。如果设置为 true,则在连接器启动时绑定,在连接器销毁时取消绑定。如果设置为 false,则在连接器启动时绑定,在连接器停止时取消绑定。如果未指定,则默认值为 true

clientCertProvider

当客户端证书信息以非 java.security.cert.X509Certificate 实例的形式呈现时,需要在使用之前进行转换,此属性控制使用哪个 JSSE 提供程序来执行转换。

compressibleMimeType

该值是一个逗号分隔的 MIME 类型列表,可用于 HTTP 压缩。默认值为 text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml 。如果您明确指定类型,则默认值将被覆盖。

compression

连接器可以使用 HTTP/1.1 GZIP 压缩来节省服务器带宽。该参数的可接受值为“off”(禁用压缩)、“on”(允许压缩,导致文本数据被压缩)、“force”(在所有情况下强制压缩)或数字整数值(相当于“on”,但指定输出被压缩之前的数据最小量)。如果内容长度未知,并且压缩设置为“on”或更激进,则输出也将被压缩。如果未指定,此属性将设置为“off”。

注意:使用压缩(节省您的带宽)和使用 sendfile 功能(节省您的 CPU 周期)之间存在权衡。如果连接器支持 sendfile 功能,例如 NIO 连接器,则使用 sendfile 将优先于压缩。症状是大于 48 KiB 的静态文件将未经压缩地发送。您可以通过设置连接器的 useSendfile 属性(如下所述)来关闭 sendfile,或在默认 conf/web.xml 或 Web 应用程序的 web.xml 中更改 DefaultServlet 配置中的 sendfile 使用阈值。

compressionMinSize

如果 compression 设置为“on”,则可以使用此属性指定输出被压缩之前的数据最小量。如果未指定,此属性默认为“2048”。单位为字节。

connectionLinger

连接器 使用的套接字在关闭时将保留多少秒。默认值为 -1,禁用套接字保留。

connectionTimeout

连接器 在接受连接后将等待多少毫秒,以呈现请求 URI 行。使用 -1 值表示无(即无限)超时。默认值为 60000(即 60 秒),但请注意,随 Tomcat 一起提供的标准 server.xml 将其设置为 20000(即 20 秒)。除非 disableUploadTimeout 设置为 false,否则在读取请求正文(如果有)时也将使用此超时。

connectionUploadTimeout

指定在数据上传进行时要使用的超时(以毫秒为单位)。仅当 disableUploadTimeout 设置为 false 时才生效。

continueResponseTiming

何时使用 100 中间响应代码响应包含 Expect: 100-continue 标头的请求。可以使用以下值

  • immediately - 将尽快返回中间 100 状态响应
  • onRead - 仅当 Servlet 读取请求正文时,才会返回中间 100 状态响应,允许 Servlet 检查标头,并在用户代理发送可能较大的请求正文之前做出响应。

defaultSSLHostConfigName

如果客户端连接未提供 SNI,或者提供了 SNI 但与任何已配置的 SSLHostConfig 不匹配,则用于安全连接(如果此连接器已配置为安全连接)的默认 SSLHostConfig 的名称。如果未指定,将使用 _default_ 的默认值。提供的值始终转换为小写。

disableUploadTimeout

此标志允许 Servlet 容器在数据上传期间使用不同的、通常较长的连接超时。如果未指定,此属性将设置为 true,这将禁用此较长的超时。

executor

Executor 元素中名称的引用。如果设置了此属性,并且存在命名的执行器,则连接器将使用执行器,并且将忽略所有其他线程属性。请注意,如果未为连接器指定共享执行器,则连接器将使用私有内部执行器来提供线程池。

executorTerminationTimeoutMillis

在继续停止连接器的进程之前,私有内部执行器将等待请求处理线程终止的时间。如果未设置,则默认值为 5000(5 秒)。

keepAliveTimeout

Connector 在关闭连接之前等待另一个 HTTP 请求的毫秒数。默认值是使用已为 connectionTimeout 属性设置的值。使用 -1 的值表示没有(即无限)超时。

maxConnections

服务器在任何给定时间接受和处理的最大连接数。达到此数字后,服务器将接受但不会处理另一个连接。此附加连接将被阻止,直到正在处理的连接数降至 maxConnections 以下,此时服务器将开始再次接受和处理新连接。请注意,一旦达到限制,操作系统仍可能根据 acceptCount 设置接受连接。默认值为 8192

仅适用于 NIO/NIO2,将值设置为 -1 将禁用 maxConnections 功能,并且不会计算连接。

maxExtensionSize

限制块状 HTTP 请求中块扩展的总长度。如果值为 -1,则不施加限制。如果未指定,将使用 8192 的默认值。

maxHeaderCount

容器允许的请求中的最大标头数。包含多于指定限制的标头的请求将被拒绝。小于 0 的值表示没有限制。如果未指定,则使用 100 的默认值。

maxHttpHeaderSize

maxHttpRequestHeaderSizemaxHttpResponseHeaderSize 提供默认值。如果未指定,此属性将设置为 8192(8 KiB)。

maxHttpRequestHeaderSize

以字节为单位指定与 HTTP 请求关联的请求行和标头的最大允许大小。这与接收的字节数进行比较,因此包括行终止符和空格,以及请求行、标头名称和标头值。如果未指定,此属性将设置为 maxHttpHeaderSize 属性的值。

如果您看到“请求标头过大”错误,可以增加此值,但请注意,Tomcat 将为每个请求分配您指定的全部数量。例如,如果您指定 1 MB 的 maxHttpRequestHeaderSize,并且您的应用程序处理 100 个并发请求,您将看到请求标头消耗了 100 MB 的堆。

maxHttpResponseHeaderSize

以字节为单位指定与 HTTP 响应关联的响应行和标头的最大允许大小。这与写入的字节数进行比较,因此包括行终止符和空格,以及状态行、标头名称和标头值。如果未指定,此属性将设置为 maxHttpHeaderSize 属性的值。

maxKeepAliveRequests

在服务器关闭连接之前,可以通过管道传输的最大 HTTP 请求数。将此属性设置为 1 将禁用 HTTP/1.0 保持活动,以及 HTTP/1.1 保持活动和管道传输。将其设置为 -1 将允许无限数量的管道传输或保持活动的 HTTP 请求。如果未指定,此属性将设置为 100。

maxSwallowSize

对于中止的上传,Tomcat 将吞咽的最大请求正文字节数(不包括传输编码开销)。中止的上传是指 Tomcat 知道请求正文将被忽略,但客户端仍发送它。如果 Tomcat 不吞咽正文,客户端不太可能看到响应。如果未指定,将使用 2097152(2 MiB)的默认值。小于零的值表示不应强制执行任何限制。

maxThreads

连接器创建的最大请求处理线程数,因此决定了可同时处理的最大请求数。如果未指定,此属性将设置为 200。如果此连接器关联了执行器,此属性将被忽略,因为连接器将使用执行器而不是内部线程池执行任务。请注意,如果配置了执行器,此属性设置的任何值都将被正确记录,但将报告为 -1(例如通过 JMX),以明确表示未使用它。

maxTrailerSize

限制块状 HTTP 请求的最后一个块中的尾部标头的总长度。如果值为 -1,则不施加限制。如果未指定,将使用默认值 8192

minSpareThreads

始终保持运行的最小线程数。这包括活动线程和空闲线程。如果未指定,将使用默认值 10。如果此连接器关联了执行器,此属性将被忽略,因为连接器将使用执行器而不是内部线程池执行任务。请注意,如果配置了执行器,此属性设置的任何值都将被正确记录,但将报告为 -1(例如通过 JMX),以明确表示未使用它。

noCompressionUserAgents

该值是一个正则表达式(使用 java.util.regex),用于匹配 HTTP 客户端的 user-agent 标头,不应为其使用压缩,因为这些客户端虽然宣称支持该功能,但其实现已损坏。默认值为空字符串(禁用正则表达式匹配)。

processorCache

协议处理程序缓存 Processor 对象以提高性能。此设置规定了缓存这些对象的数量。-1 表示不限,默认值为 200。如果不使用 Servlet 3.0 异步处理,一个好的默认值是与 maxThreads 设置相同。如果使用 Servlet 3.0 异步处理,一个好的默认值是使用 maxThreads 和最大预期并发请求数(同步和异步)中较大的那个。

rejectIllegalHeader

如果接收到包含非法标头名称或值的 HTTP 请求(例如标头名称不是令牌),此设置决定是否使用 400 响应拒绝请求(true)或忽略非法标头(false)。默认值为 true,这将导致拒绝请求。
此设置将在 Tomcat 11 及更高版本中删除,其中它将硬编码为 true

relaxedPathChars

当在 URI 路径中使用时,HTTP/1.1 规范 要求某些字符进行 %nn 编码。遗憾的是,包括所有主流浏览器在内的许多用户代理都不符合此规范,并以未编码形式使用这些字符。为了防止 Tomcat 拒绝此类请求,可以使用此属性指定允许的附加字符。如果未指定,则不允许任何附加字符。该值可以是以下字符的任意组合:" < > [ \ ] ^ ` { | }。值中存在的任何其他字符都将被忽略。

relaxedQueryChars

当在 URI 查询字符串中使用时,HTTP/1.1 规范 要求某些字符进行 %nn 编码。遗憾的是,包括所有主流浏览器在内的许多用户代理都不符合此规范,并以未编码形式使用这些字符。为了防止 Tomcat 拒绝此类请求,可以使用此属性指定允许的附加字符。如果未指定,则不允许任何附加字符。该值可以是以下字符的任意组合:" < > [ \ ] ^ ` { | }。值中存在的任何其他字符都将被忽略。

restrictedUserAgents

该值是一个正则表达式(使用 java.util.regex),用于匹配 HTTP 客户端的 user-agent 标头,即使客户端宣告支持这些功能,也不应使用 HTTP/1.1 或 HTTP/1.0 保持活动状态。默认值是一个空字符串(禁用正则表达式匹配)。

server

覆盖 http 响应的 Server 标头。如果设置,此属性的值将覆盖 Web 应用程序设置的任何 Server 标头。如果未设置,则使用应用程序指定的任何值。如果应用程序未指定值,则不设置 Server 标头。

serverRemoveAppProvidedValues

如果为 true,则将删除 Web 应用程序设置的任何 Server 标头。请注意,如果设置了 server,则此属性实际上将被忽略。如果未设置,则将使用 false 的默认值。

SSLEnabled

使用此属性在连接器上启用 SSL 流量。要在连接器上启用 SSL 握手/加密/解密,请将此值设置为 true。默认值为 false。将此值变为 true 时,您需要同时设置 schemesecure 属性,以将正确的 request.getScheme()request.isSecure() 值传递给 servlet。有关详细信息,请参阅 SSL 支持

tcpNoDelay

如果设置为 true,则 TCP_NO_DELAY 选项将在服务器套接字上设置,这在大多数情况下可提高性能。默认设置为 true

threadPriority

JVM 中请求处理线程的优先级。默认值为 5java.lang.Thread.NORM_PRIORITY 常量的值)。有关此优先级含义的更多详细信息,请参阅 java.lang.Thread 类的 JavaDoc。如果将执行程序与此连接器关联,则此属性将被忽略,因为连接器将使用执行程序而不是内部线程池来执行任务。请注意,如果配置了执行程序,则为此属性设置的任何值都将被正确记录,但它将被报告(例如通过 JMX)为 -1,以明确表示它未使用。

threadsMaxIdleTime

如果执行程序中的线程数超过 minSpareThreads,则线程池将使线程保持活动的时间(以毫秒为单位)。如果未指定,则使用默认值 60000 毫秒。如果将执行程序与此连接器关联,则此属性将被忽略,因为连接器将使用执行程序而不是内部线程池来执行任务。请注意,如果配置了执行程序,则为此属性设置的任何值都将被正确记录,但它将被报告(例如通过 JMX)为 -1,以明确表示它未使用。

throwOnFailure

如果连接器在生命周期转换期间遇到异常,则应重新抛出异常还是记录异常?如果未指定,则使用默认值 false。请注意,可以通过 org.apache.catalina.startup.EXIT_ON_INIT_FAILURE 系统属性更改默认值。

useAsyncIO

(布尔值)使用此属性可启用或禁用异步 IO API 的使用。默认值为 true

useKeepAliveResponseHeader

(布尔值)使用此属性可启用或禁用 Keep-Alive HTTP 响应头的添加,如 此 Internet-Draft 中所述。默认值为 true

useVirtualThreads

(布尔值)使用此属性可启用或禁用内部执行程序的虚拟线程使用。如果将执行程序与此连接器关联,则此属性将被忽略。默认值为 false

Java TCP 套接字属性

除了上面列出的通用连接器和 HTTP 属性外,NIO 和 NIO2 实现还支持以下 Java TCP 套接字属性。

属性 说明
socket.rxBufSize

(int)套接字接收缓冲区 (SO_RCVBUF) 大小(以字节为单位)。如果未设置,则使用 JVM 默认值。

socket.txBufSize

(int)以字节为单位的套接字发送缓冲区(SO_SNDBUF)大小。如果未设置,则使用 JVM 默认值。如果显式设置此值,则应小心。已观察到某些 JVM 在值小于约 8k 时性能非常差。

socket.tcpNoDelay

(bool)这相当于标准属性 tcpNoDelay

socket.soKeepAlive

(bool)套接字保持活动设置(SO_KEEPALIVE)的布尔值。如果未设置,则使用 JVM 默认值。

socket.ooBInline

(bool)套接字 OOBINLINE 设置的布尔值。如果未设置,则使用 JVM 默认值。

socket.soReuseAddress

(bool)套接字重用地址选项(SO_REUSEADDR)的布尔值。如果未设置,则使用 JVM 默认值。

socket.soLingerOn

(bool)套接字 so linger 选项(SO_LINGER)的布尔值。标准属性 connectionLinger 的值大于或等于 0 等效于将其设置为 true。标准属性 connectionLinger 的值小于 0 等效于将其设置为 false。此属性和 soLingerTime 都必须设置,否则将对两者使用 JVM 默认值。

socket.soLingerTime

(int)套接字 so linger 选项(SO_LINGER)的以秒为单位的值。这相当于标准属性 connectionLinger。此属性和 soLingerOn 都必须设置,否则将对两者使用 JVM 默认值。

socket.soTimeout

这相当于标准属性 connectionTimeout

socket.performanceConnectionTime

(int)性能设置的第一个值。请参阅 套接字性能选项。所有三个性能属性都必须设置,否则将对所有三个属性使用 JVM 默认值。

socket.performanceLatency

(int)性能设置的第二个值。请参阅 套接字性能选项。所有三个性能属性都必须设置,否则将对所有三个属性使用 JVM 默认值。

socket.performanceBandwidth

(int)性能设置的第三个值。请参阅 套接字性能选项。所有三个性能属性都必须设置,否则将对所有三个属性使用 JVM 默认值。

socket.unlockTimeout

(int)套接字解锁的超时时间。当连接器停止时,它将尝试通过向自身打开连接器来释放接受器线程。默认值为 250,单位为毫秒

NIO 特定配置

以下属性特定于 NIO 连接器。

属性 说明
pollerThreadPriority

(int)轮询线程的优先级。默认值为5java.lang.Thread.NORM_PRIORITY常量的值)。有关此优先级含义的更多详细信息,请参阅java.lang.Thread类的 JavaDoc。

selectorTimeout

(int)轮询器在 select() 上超时的时间(以毫秒为单位)。此值很重要,因为连接清理是在同一线程上完成的,因此不要将此值设置得过高。默认值为1000毫秒。

useSendfile

(bool)使用此属性启用或禁用 sendfile 功能。默认值为true。请注意,使用 sendfile 将禁用 Tomcat 可能对响应执行的任何压缩。

socket.directBuffer

(bool)布尔值,表示是否使用直接 ByteBuffers 或 java 映射的 ByteBuffers。如果为true,则使用java.nio.ByteBuffer.allocateDirect()分配缓冲区,如果为false,则使用java.nio.ByteBuffer.allocate()。默认值为false
使用直接缓冲区时,请确保为直接内存空间分配适当数量的内存。在 Sun 的 JDK 上,这类似于-XX:MaxDirectMemorySize=256m

socket.directSslBuffer

(bool)布尔值,表示是否为 SSL 缓冲区使用直接 ByteBuffers 或 java 映射的 ByteBuffers。如果为true,则使用java.nio.ByteBuffer.allocateDirect()分配缓冲区,如果为false,则使用java.nio.ByteBuffer.allocate()。默认值为false
使用直接缓冲区时,请确保为直接内存空间分配适当数量的内存。在 Oracle 的 JDK 上,这类似于-XX:MaxDirectMemorySize=256m

socket.appReadBufSize

(int)在 Tomcat 中打开的每个连接都与一个读取 ByteBuffer 相关联。此属性控制此缓冲区的大小。默认情况下,此读取缓冲区的大小为8192字节。对于较低的并发性,可以增加此值以缓冲更多数据。对于大量的保持活动连接,请减小此数字或增加堆大小。

socket.appWriteBufSize

(int)Tomcat 中打开的每个连接都与一个写入 ByteBuffer 关联。此属性控制此缓冲区的大小。默认情况下,此写入缓冲区大小为 8192 字节。对于低并发,您可以增加此值以缓冲更多响应数据。对于大量保持活动连接,请减小此数字或增加堆大小。
此处的默认值相当低,如果您处理的并发连接少于数万个,则应提高此值。

socket.bufferPool

(int)NIOx 连接器使用一个名为 NioXChannel 的类,该类包含链接到套接字的元素。为了减少垃圾回收,NIOx 连接器会缓存这些通道对象。此值指定此缓存的大小。默认值为 -2。特殊值为 -1(表示无限制缓存)、0(表示无缓存)和 -2(表示使用 bufferPoolSize 属性计算的值)。

socket.bufferPoolSize

(int)NioXChannel 池也可以基于大小,而不是基于使用的对象。如果 bufferPool 不为 -2,则不会使用此值。
此值以字节为单位,但特殊值除外。特殊值为 -1(表示无限制缓存)、0(表示无缓存)和 -2(表示按如下方式计算的值)
NioXChannel 缓冲区大小 = 读取缓冲区大小 + 写入缓冲区大小
SecureNioXChannel 缓冲区大小 = 应用程序读取缓冲区大小 + 应用程序写入缓冲区大小 + 最大 SNI 解析大小的两倍。如果运行时报告的最大内存大于 1GB,则池大小值是内存除以缓冲区大小。否则,它将为 0。

socket.processorCache

(int)Tomcat 将缓存 SocketProcessor 对象以减少垃圾回收。整数值指定最多在缓存中保留多少个对象。默认值为 0。特殊值为 -1(表示无限制缓存)和 0(表示无缓存)。

socket.eventCache

(int)Tomcat 将缓存 PollerEvent 对象以减少垃圾回收。整数值指定最多在缓存中保留多少个对象。默认值为 0。特殊值为 -1(表示无限制缓存)和 0(表示无缓存)。

unixDomainSocketPath

在支持的情况下,此连接器将创建并等待传入连接的 Unix 域套接字的路径。指定此项后,可以省略其他强制性的port属性。有关详细信息,请参阅Unix 域套接字支持

unixDomainSocketPathPermissions

在支持的情况下,将应用于上面用unixDomainSocketPath指定的 Unix 域套接字的 posix 权限。权限指定为一个由九个字符组成的字符串,分为三组,每组三个字符:所有者、组和其他人的(r)读、(w)写和 e(x)执行权限。如果未授予权限,则使用连字符。如果未指定,则权限默认为rw-rw-rw-

useInheritedChannel

(布尔值)定义此连接器是否应继承 inetd/systemd 网络套接字。只有一个连接器可以继承网络套接字。此选项可用于在向 systemd 超级守护进程的端口发出连接请求后自动启动 Tomcat。默认值为false。有关详细信息,请参阅java.nio.channels.spi.SelectorProvider类的 JavaDoc。

NIO2 特定配置

以下属性特定于 NIO2 连接器。

属性 说明
useSendfile

(bool)使用此属性启用或禁用 sendfile 功能。默认值为true。请注意,使用 sendfile 将禁用 Tomcat 可能对响应执行的任何压缩。

socket.directBuffer

(bool)布尔值,表示是否使用直接 ByteBuffers 或 java 映射的 ByteBuffers。如果为true,则使用java.nio.ByteBuffer.allocateDirect()分配缓冲区,如果为false,则使用java.nio.ByteBuffer.allocate()。默认值为false
使用直接缓冲区时,请确保为直接内存空间分配适当数量的内存。在 Sun 的 JDK 上,这类似于-XX:MaxDirectMemorySize=256m

socket.directSslBuffer

(bool)布尔值,表示是否为 SSL 缓冲区使用直接 ByteBuffers 或 java 映射的 ByteBuffers。如果为true,则使用java.nio.ByteBuffer.allocateDirect()分配缓冲区,如果为false,则使用java.nio.ByteBuffer.allocate()。默认值为false
使用直接缓冲区时,请确保为直接内存空间分配适当数量的内存。在 Oracle 的 JDK 上,这类似于-XX:MaxDirectMemorySize=256m

socket.appReadBufSize

(int)在 Tomcat 中打开的每个连接都与一个读取 ByteBuffer 相关联。此属性控制此缓冲区的大小。默认情况下,此读取缓冲区的大小为8192字节。对于较低的并发性,可以增加此值以缓冲更多数据。对于大量的保持活动连接,请减小此数字或增加堆大小。

socket.appWriteBufSize

(int)Tomcat 中打开的每个连接都与一个写入 ByteBuffer 关联。此属性控制此缓冲区的大小。默认情况下,此写入缓冲区大小为 8192 字节。对于低并发,您可以增加此值以缓冲更多响应数据。对于大量保持活动连接,请减小此数字或增加堆大小。
此处的默认值相当低,如果您处理的并发连接少于数万个,则应提高此值。

socket.bufferPool

(int)NIO2 连接器使用一个名为 Nio2Channel 的类,该类保存链接到套接字的元素。为了减少垃圾回收,NIO2 连接器会缓存这些通道对象。此值指定此缓存的大小。默认值为500,表示缓存将保存 500 个 Nio2Channel 对象。其他值为-1(表示无限缓存)和0(表示无缓存)。

socket.processorCache

(int)Tomcat 将缓存 SocketProcessor 对象以减少垃圾回收。整数值指定最多在缓存中保留多少个对象。默认值为0。其他值为-1(表示无限缓存)和0(表示无缓存)。

嵌套组件

Tomcat 支持服务器名称指示 (SNI)。这允许将多个 SSL 配置与单个安全连接器关联,其中任何给定连接使用的配置由客户端请求的主机名决定。为了实现此目的,添加了SSLHostConfig元素,该元素可用于定义其中一个配置。任何数量的SSLHostConfig都可以嵌套在Connector中。同时,还添加了对将多个证书与单个SSLHostConfig关联的支持。因此,每个 SSL 证书都配置在SSLHostConfig中的Certificate元素中。有关详细信息,请参阅下面的 SSL 支持部分。

当 OpenSSL 提供 TLS 实现时,一个或多个 OpenSSLConfCmd 元素可以嵌套在 OpenSSLConf 元素内,以通过 OpenSSL 的 SSL_CONF API 配置 OpenSSL。一个 OpenSSLConf 元素可以嵌套在 SSLHostConfig 元素中。有关更多信息,请参阅下面的 SSL 支持部分

特殊功能

HTTP/1.1 和 HTTP/1.0 支持

Connector 支持 HTTP/1.1 协议的所有必需功能,如 RFC 7230-7235 中所述,包括持久连接、流水线、期望和分块编码。如果客户端仅支持 HTTP/1.0 或 HTTP/0.9,Connector 也会优雅地回退以支持此协议。无需特殊配置即可启用此支持。Connector 还支持 HTTP/1.0 保持活动状态。

RFC 7230 要求 HTTP 服务器始终以其声称支持的最高 HTTP 版本开始其响应。因此,此 Connector 始终在其响应的开头返回 HTTP/1.1

HTTP/2 支持

通过 HTTP 升级 (h2c) 和直接 HTTP/2 (h2c) 连接为 TLS (h2) 提供 HTTP/2 支持。要为 HTTP 连接启用 HTTP/2 支持,以下 UpgradeProtocol 元素必须嵌套在 Connector 中,className 属性为 org.apache.coyote.http2.Http2Protocol

<Connector ... >
  <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>

其他配置属性可用。有关详细信息,请参阅 HTTP/2 升级协议 文档。

代理支持

当 Tomcat 在代理服务器后面运行时,可以使用 proxyNameproxyPort 属性。这些属性修改了调用 request.getServerName()request.getServerPort() 方法的 Web 应用程序返回的值,这些方法通常用于为重定向构造绝对 URL。如果不配置这些属性,则返回的值将反映从代理服务器接收连接时的服务器名称和端口,而不是客户端将原始请求定向到的服务器名称和端口。

有关更多信息,请参阅 代理支持操作指南

Unix 域套接字支持

当使用 unixDomainSocketPath 属性时,支持 Unix 域套接字的连接器将绑定到给定路径处的套接字。

对于 Java 16 及更高版本的使用者,NIO 连接器中提供了支持。

套接字路径是为所有用户创建的,具有读写权限。要保护此套接字,请将其放在具有适当权限的目录中,并根据需要进行适当配置以限制访问。或者,在支持 posix 权限的平台上,可以使用 unixDomainSocketPathPermissions 选项直接设置套接字上的权限。

Tomcat 将在服务器关闭时自动移除套接字。如果套接字已存在,启动将失败。管理员必须在验证套接字尚未被现有 Tomcat 进程使用后小心移除套接字。

可以使用 curl 命令行客户端的 --unix-socket 选项和 Apache HTTP 服务器的 mod_proxy 模块中的 Unix 域套接字支持来访问 Unix 域套接字。

SSL 支持

您可以通过将 SSLEnabled 属性设置为 true 来为该 Connector 的特定实例启用 SSL 支持。

您还需要将 schemesecure 属性分别设置为值 httpstrue,以将正确的信息传递给 servlet。

NIO 和 NIO2 连接器使用 JSSE Java SSL 实现或 OpenSSL 实现。尽可能为 JSSE 和 OpenSSL 使用通用的配置属性。

每个安全连接器必须至少定义一个 SSLHostConfigSSLHostConfig 元素的名称必须唯一,其中一个必须与 ConnectordefaultSSLHostConfigName 属性匹配。

每个 SSLHostConfig 必须反过来至少定义一个 CertificateCertificate 的类型必须唯一。

除了 Servlet 规范第 3.10 节中定义的标准 TLS 相关请求属性外,Tomcat 还支持许多其他 TLS 相关属性。可以在 SSLSupport Javadoc 中找到完整列表。

有关更多信息,请参阅 SSL 配置操作指南

SSL 支持——SSLHostConfig

属性 说明
certificateRevocationListFile

包含证书颁发机构的连接证书吊销列表的文件的名称。格式为 PEM 编码。如果未定义,则不会根据证书吊销列表检查客户端证书(除非使用基于 OpenSSL 的连接器并且定义了 certificateRevocationListPath)。相对路径将针对 $CATALINA_BASE 解析。基于 JSSE 的连接器还可以为此属性指定一个 URL。

certificateRevocationListPath

仅限 OpenSSL。

包含证书颁发机构的证书吊销列表的目录的名称。格式为 PEM 编码。相对路径将针对 $CATALINA_BASE 解析。

certificateVerification

如果您希望 SSL 栈在接受连接之前从客户端要求有效的证书链,则设置为 required。如果您希望 SSL 栈请求客户端证书,但如果没有提供证书则不失败,则设置为 optional。如果您希望客户端证书为可选,并且您不希望 Tomcat 根据受信任 CA 的列表检查它们,则设置为 optionalNoCA。如果 TLS 提供程序不支持此选项(OpenSSL 支持,JSSE 不支持),则将其视为指定了 optional。如果配置了 optionalNoCA,则 OCSP 也将被禁用。none 值(这是默认值)不需要证书链,除非客户端请求受使用 CLIENT-CERT 身份验证的安全约束保护的资源。

certificateVerificationDepth

验证客户端证书时允许的最大中间证书数。如果未指定,将使用默认值 10。

caCertificateFile

仅限 OpenSSL。

包含受信任证书颁发机构的连接证书的文件名称。格式为 PEM 编码。

caCertificatePath

仅限 OpenSSL。

包含受信任证书颁发机构的证书的目录名称。格式为 PEM 编码。

ciphers

使用 OpenSSL 语法启用的密码。请参阅 OpenSSL 文档以了解支持的密码和语法列表。或者,可以使用使用标准 OpenSSL 密码名称或标准 JSSE 密码名称的以逗号分隔的密码列表。

不同版本的 OpenSSL 可能对同一密码字符串进行不同的解释。例如,CCM8 密码在 OpenSSL 3.2 中已从 HIGH 移至 MEDIUM。无论使用哪种 OpenSSL 或 JSSE 版本,Tomcat 都会以与最新 OpenSSL 开发分支一致的方式将提供的密码值转换为密码列表。然后将此密码列表传递给 SSL 实现。

将仅使用 SSL 实现支持的密码。当连接器启动时,从非默认密码字符串派生的且不受 SSL 实现支持的列表中的任何密码都将以 WARNING 消息记录。可以通过提供受配置的 SSL 实现支持的明确密码列表来避免此警告。

如果未指定,将使用默认值(使用 OpenSSL 表示法)HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!kRSA

请注意,默认情况下,定义密码的顺序被视为首选项顺序。请参阅 honorCipherOrder

disableCompression

仅限 OpenSSL。

配置是否禁用压缩。默认值为 true。如果所使用的 OpenSSL 版本不支持禁用压缩,则将使用该 OpenSSL 版本的默认值。

disableSessionTickets

仅限 OpenSSL。

如果设置为 true,则禁用使用 TLS 会话票证 (RFC 5077)。默认值为 false。请注意,当使用 TLS 会话票证时,完整的对等证书链仅在第一次连接时可用。后续连接(使用票证建立 TLS 会话)将仅具有对等证书,而不是完整链。

honorCipherOrder

设置为 true 以强制执行服务器的密码顺序(来自 ciphers 设置),而不是允许客户端选择密码。默认值为 false

hostName

SSL 主机名。这应该是完全限定域名(例如 tomcat.apache.org)或通配符域名(例如 *.apache.org)。如果未指定,将使用 _default_ 的默认值。提供的值始终转换为小写。

insecureRenegotiation

仅限 OpenSSL。

配置是否允许不安全的重新协商。默认值为 false。如果使用的 OpenSSL 版本不支持配置是否允许不安全的重新协商,则将使用该 OpenSSL 版本的默认值。

keyManagerAlgorithm

仅限 JSSE。

要使用的 KeyManager 算法。这默认为 KeyManagerFactory.getDefaultAlgorithm(),它为 Sun JVM 返回 SunX509。IBM JVM 返回 IbmX509。对于其他供应商,请查阅 JVM 文档以了解默认值。

protocols

与客户端通信时要支持的协议名称。这应该是以下任一组合的列表

  • SSLv2Hello
  • SSLv3
  • TLSv1
  • TLSv1.1
  • TLSv1.2
  • TLSv1.3
  • all

列表中的每个令牌都可以加上加号 (“+”) 或减号 (“-” ) 前缀。加号添加协议,减号从当前列表中删除它。列表从空列表开始构建。

令牌 allSSLv2Hello,TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 的别名。

请注意,仅当使用实现 TLSv1.3 的 JVM 时,才支持 JSSE 的 TLSv1.3

请注意,对于基于 OpenSSL 的安全连接器,将忽略 SSLv2Hello。如果为基于 OpenSSL 的安全连接器指定了多个协议,它将始终支持 SSLv2Hello。如果指定了一个协议,它将不支持 SSLv2Hello

请注意,SSLv2SSLv3 本质上是不安全的。

如果未指定,将使用 all 的默认值。

revocationEnabled

仅限 JSSE。

JSSE 提供程序是否应启用证书吊销检查?如果设置了 certificateRevocationListFile,则忽略此属性,并且始终启用吊销检查。此属性旨在启用已通过其他方式为当前 JSSE 提供程序配置的吊销检查。如果未指定,则使用 false 的默认值。

sessionCacheSize

会话缓存中要保留的 SSL 会话数。指定 -1 以使用实现的默认值。零及以上的值将传递给实现。零用于指定无限缓存大小,不推荐使用。如果未指定,将使用 -1 的默认值。

sessionTimeout

在创建 SSL 会话后,其超时的时间(以秒为单位)。指定 -1 以使用实现的默认值。零及以上的值将传递给实现。零用于指定无限超时,不推荐使用。如果未指定,将使用 86400(24 小时)的默认值。

sslProtocol

仅限 JSSE。

要使用的 SSL 协议(单个值可能启用多个协议 - 有关详细信息,请参阅 JVM 文档)。如果未指定,默认值为 TLS。允许的值可以从 JVM 文档中创建 SSLContext 实例时算法的允许值中获取,例如 Oracle Java 11。注意:此属性与 protocols 之间存在重叠。

trustManagerClassName

仅限 JSSE。

用于验证客户端证书的自定义信任管理器类的名称。该类必须具有零参数构造函数,还必须实现 javax.net.ssl.X509TrustManager。如果设置此属性,则可以忽略信任库属性。

truststoreAlgorithm

仅限 JSSE。

用于信任库的算法。如果未指定,将使用 javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm() 返回的默认值。

truststoreFile

仅限 JSSE。

用于验证客户端证书的信任库文件。默认值是 javax.net.ssl.trustStore 系统属性的值。如果未设置此属性或默认系统属性,则不会配置信任库。相对路径将针对 $CATALINA_BASE 进行解析。此属性还可以使用 URL。

truststorePassword

仅限 JSSE。

访问信任库的密码。默认值是 javax.net.ssl.trustStorePassword 系统属性的值。如果该属性为 null,则不会配置信任库密码。如果指定了无效的信任库密码,将记录警告,并将尝试在没有密码的情况下访问信任库,这将跳过对信任库内容的验证。

truststoreProvider

仅限 JSSE。

用于服务器证书的信任库提供程序的名称。默认值是 javax.net.ssl.trustStoreProvider 系统属性的值。如果该属性为 null,则使用 keystoreProvider 的值作为默认值。如果未设置此属性、默认系统属性或 keystoreProvider,则按优先顺序遍历已注册的提供程序列表,并使用第一个支持 truststoreType 的提供程序。

truststoreType

仅限 JSSE。

用于信任库的密钥库类型。默认值为 javax.net.ssl.trustStoreType 系统属性的值。如果该属性为 null,则已为此 TLS 虚拟主机配置了单个证书,并且该证书具有 keystoreType,该 keystoreType 不是 PKCS12,则默认值为单个证书的 keystoreType。如果这些都没有标识默认值,则默认值为 JKS。请参阅以下 密钥库类型 的说明。

SSL 支持——证书

属性 说明
certificateFile

包含服务器证书的文件的名称。格式为 PEM 编码。相对路径将针对 $CATALINA_BASE 解析。

除了证书之外,该文件还可以包含可选元素 DH 参数和/或用于临时密钥的 EC 曲线名称,分别由 openssl dhparamopenssl ecparam 生成。相应 OpenSSL 命令的输出可以简单地连接到证书文件。

除非指定了 certificateKeystoreFile,否则此属性是必需的。

certificateChainFile

包含与所使用的服务器证书关联的证书链的文件的名称。格式为 PEM 编码。相对路径将针对 $CATALINA_BASE 解析。

用于 Tomcat 的证书链不应将其服务器证书作为其第一个元素。

请注意,在对不同类型使用多个证书时,它们都必须使用相同的证书链。

certificateKeyAlias

仅限 JSSE。

用于密钥库中服务器密钥和证书的别名。如果未指定,则将使用从密钥库中读取的第一个密钥。从密钥库中读取密钥的顺序取决于实现。密钥可能不会按照添加到密钥库中的顺序从密钥库中读取。如果密钥库中存在多个密钥,则强烈建议配置 keyAlias 以确保使用正确的密钥。

certificateKeyFile

包含服务器私钥的文件的名称。格式为 PEM 编码。默认值为 certificateFile,在这种情况下,证书和私钥都必须在此文件中(不推荐)。相对路径将针对 $CATALINA_BASE 解析。

certificateKeyPassword

用于从指定文件中访问与服务器证书关联的私钥的密码。

如果未指定,则 JSSE 的默认行为是使用 certificateKeystorePassword。对于 OpenSSL,默认行为是不使用密码,但 OpenSSL 会在需要时提示输入密码。

certificateKeyPasswordFile

用于从指定文件中访问与服务器证书关联的私钥的密码文件。此属性优先于certificateKeyPassword

如果未指定,JSSE 的默认行为是使用 certificateKeystorePasswordFile。对于 OpenSSL,默认行为是不使用密码(文件),但 OpenSSL 会在需要时提示输入密码。

certificateKeystoreFile

仅限 JSSE。

已存储要加载的服务器证书和密钥的密钥库文件的路径名。默认情况下,路径名为运行 Tomcat 的用户的操作系统主目录中的文件 .keystore。如果您的 keystoreType 不需要文件,请为此参数使用 ""(空字符串)或 NONE。相对路径将解析为 $CATALINA_BASE。此属性也可以使用 URI。使用域密钥库(keystoreTypeDKS)时,此参数应为域密钥库的 URI。

除非指定了 certificateFile,否则此属性是必需的。

certificateKeystorePassword

仅限 JSSE。

用于访问包含服务器私钥和证书的密钥库的密码。如果未指定,将使用默认值 changeit

certificateKeystorePasswordFile

仅限 JSSE。

用于访问包含服务器私钥和证书的密钥库的密码文件。此属性优先于 certificateKeystorePassword

certificateKeystoreProvider

仅限 JSSE。

用于服务器证书的密钥库提供程序的名称。如果未指定,将使用系统属性 javax.net.ssl.keyStoreProvider 的值。如果未设置此属性或系统属性,则按优先顺序遍历已注册的提供程序列表,并使用支持 keystoreType 的第一个提供程序。

certificateKeystoreType

仅限 JSSE。

用于服务器证书的密钥库文件类型。如果未指定,将使用系统属性 javax.net.ssl.keyStoreType 的值。如果未设置此属性或系统属性,则使用默认值 "JKS"。请参见以下有关密钥库类型的说明。

type

证书类型。这用于识别与证书兼容的密码。它必须是 UNDEFINEDRSADSAEC 之一。如果 SSLHostConfig 中仅嵌套了一个 Certificate,则此属性不是必需的,并且将默认为 UNDEFINED。如果 SSLHostConfig 中嵌套了多个 Certificate,则此属性是必需的,并且每个 Certificate 必须具有唯一的类型。

SSL 支持——连接器——NIO 和 NIO2

启用 APR/native 时,连接器将默认通过 JSSE 使用 OpenSSL,这可能比 JSSE Java 实现更优化,具体取决于所使用的处理器,并且可以与许多商业加速器组件互补。

以下 NIO 和 NIO2 SSL 配置属性不特定于虚拟主机,因此必须在连接器上进行配置。

属性 说明
sniParseLimit

为了实现 SNI 支持,Tomcat 必须解析在新 TLS 连接上接收到的第一个 TLS 消息(客户端 hello),以提取请求的服务器名称。消息需要进行缓冲,以便可以将其传递给 JSSE 实现以进行正常的 TLS 处理。理论上,第一个消息可能非常大,但实际上通常只有几百个字节。此属性设置 Tomcat 将缓冲的最大消息大小。如果消息超过此大小,则将配置连接,就像客户端没有指示服务器名称一样。如果未指定,将使用默认值 65536 (64k)。

sslImplementationName

要使用的 SSL 实现的类名。如果未指定且未安装 tomcat-native 库,则将使用默认值 org.apache.tomcat.util.net.jsse.JSSEImplementation,它包装了 JVM 的默认 JSSE 提供程序。请注意,可以将 JVM 配置为使用不同的 JSSE 提供程序作为默认值。Tomcat 还捆绑了一个特殊的 SSL 实现,用于由 OpenSSL 支持的 JSSE。要启用它,应启用本机库,Tomcat 将自动启用它,并且此属性的默认值变为 org.apache.tomcat.util.net.openssl.OpenSSLImplementation。在这种情况下,只要不混合两种类型,就可以使用 JSSE 和 OpenSSL 配置样式的属性(例如,不允许定义使用 Java 密钥库并使用 OpenSSL 属性指定单独的 pem 私钥)。

SSL 支持——OpenSSL 的 SSL_CONF API

当 OpenSSL 提供 TLS 实现时,可以在 OpenSSLConf 元素内嵌一个或多个 OpenSSLConfCmd 元素,以通过 OpenSSL 的 SSL_CONF API 配置 OpenSSL。单个 OpenSSLConf 元素可以嵌套在 SSLHostConfig 元素中。

可用的配置文件命令集取决于所使用的 OpenSSL 版本。有关受支持的命令名称和值的列表,请参阅 OpenSSL 的 SSL_CONF_cmd(3) 手册页中的受支持的配置文件命令部分。一些配置文件命令可以用作 SSLHostConfig 属性的替代项。建议仅在无法使用 SSLHostConfig 属性配置功能时才使用配置文件命令。

OpenSSLConf 元素不支持任何属性。

OpenSSLConfCmd 元素支持以下属性。

属性 说明
名称

配置文件命令的名称。

用于配置文件命令的值。

密钥存储类型

除了标准密钥库类型(JKS 和 PKCS12)外,大多数 Java 运行时还支持其他密钥库类型,例如 Windows-ROOT、Windows-My、DKS 以及硬件安全模块。通常,要在 Tomcat 中将这些其他密钥库类型与 TLS 连接器一起使用

  • 将 certificateKeystoreType 和/或 truststoreType Connector 属性(视情况而定)设置为必要的类型
  • 如果需要配置文件,请将 certificateKeystoreFile 和/或 truststoreFile Connector 属性(视情况而定)设置为指向该文件
  • 如果不需要配置文件,则几乎肯定需要将 certificateKeystoreFile 和/或 truststoreFile Connector 属性(视情况而定)显式设置为一个空字符串("")
  • 如果需要密码,请将 certificateKeystorePassword 和/或 truststorePassword Connector 属性(视情况而定)设置为所需的密码
  • 如果不需要密码,则几乎肯定需要将 certificateKeystorePassword 和/或 truststorePassword Connector 属性(视情况而定)显式设置为一个空字符串("")

密钥库实现中的差异,加上 Tomcat 在后台进行的密钥库操作以允许 JSSE 和 OpenSSL 配置样式之间的互操作性,意味着某些密钥库可能需要稍微不同的配置。始终可以从 Apache Tomcat 用户邮件列表 获得帮助。我们的目标是记录任何与上述建议不同的密钥库。目前我们没有意识到任何密钥库。

连接器比较

下面是一个小图表,显示了连接器之间的差异。

Java Nio 连接器
NIO
Java Nio2 连接器
NIO2
类名 Http11NioProtocol Http11Nio2Protocol
Tomcat 版本 自 6.0.x 起 自 8.0.x 起
支持轮询
轮询大小 maxConnections maxConnections
读取请求头 非阻塞 非阻塞
读取请求正文 阻塞 阻塞
写入响应头和正文 阻塞 阻塞
等待下一个请求 非阻塞 非阻塞
SSL 支持 Java SSL 或 OpenSSL Java SSL 或 OpenSSL
SSL 握手 非阻塞 非阻塞
最大连接数 maxConnections maxConnections