HTTP 连接器

目录

简介

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

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

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

属性

通用属性

所有连接器实现都支持以下属性

属性描述
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 查找是禁用的。

encodedReverseSolidusHandling

当设置为reject时,包含%5c序列的请求路径将被拒绝并返回 400 响应。当设置为decode时,包含%5c序列的请求路径将同时将该序列解码为\,同时解码其他%nn序列。当设置为passthrough时,包含%5c序列的请求路径将以%5c序列不变的方式进行处理。

当设置为decoded时,allowBackslash属性将在解码后应用。

如果使用passthrough,则应用程序负责执行任何进一步的%nn解码。请求路径中任何%25序列(编码的%)也将以%25序列不变的方式处理,以避免路径随后被应用程序%nn解码时可能出现的损坏和/或解码失败。

如果未指定,默认值为decode

encodedSolidusHandling

当设置为reject时,包含%2f序列的请求路径将被拒绝并返回 400 响应。当设置为decode时,包含%2f序列的请求路径将同时将该序列解码为/,同时解码其他%nn序列。当设置为passthrough时,包含%2f序列的请求路径将以%2f序列不变的方式进行处理。

如果使用passthrough,则应用程序负责执行任何进一步的%nn解码。请求路径中任何%25序列(编码的%)也将以%25序列不变的方式处理,以避免路径随后被应用程序%nn解码时可能出现的损坏和/或解码失败。

如果未指定,默认值为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 的值表示无限制。如果未指定,默认使用 1000。

maxPartCount

内容类型为multipart/form-data的请求中允许的最大部分总数。此限制是maxParameterCount之外的额外限制。超过此限制的请求将被拒绝。小于 0 的值表示无限制。如果未指定,默认使用 10。

maxPartHeaderSize

内容类型为multipart/form-data的请求中每个部分允许的最大头部字节数。超过此限制的请求将被拒绝。小于 0 的值表示无限制。如果未指定,默认使用 512。

maxPostSize

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

maxSavePostSize

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

parseBodyMethods

一个逗号分隔的 HTTP 方法列表,对于这些方法,使用application/x-www-form-urlencoded的请求体将与 POST 请求一样解析请求参数。这对于希望支持 PUT 请求的 POST 样式语义的 RESTful 应用程序很有用。请注意,任何非POST的设置都会导致 Tomcat 的行为与 Servlet 规范的意图相悖。根据 HTTP 规范,HTTP 方法 TRACE 在此处是明确禁止的。默认值为POST

port

连接器将创建服务器套接字并等待传入连接的 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

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

proxyPort

如果此连接器在代理配置中使用,请配置此属性以指定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

这指定了用于解码 URI 字节的字符编码,在对 URL 进行 %xx 解码之后。默认值为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 地址。

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

指定数据上传过程中使用的超时时间(毫秒)。如果未指定,默认值为 300000(即 300 秒)。此设置仅在disableUploadTimeout设置为false时生效。

continueResponseTiming

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

  • immediately - 尽快返回中间 100 状态响应
  • onRead - 只有当 Servlet 读取请求体时,才会返回中间 100 状态响应,这允许 Servlet 检查头部并在用户代理发送可能很大的请求体之前做出响应。

defaultSSLHostConfigName

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

disableUploadTimeout

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

executor

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

executorTerminationTimeoutMillis

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

keepAliveTimeout

连接器在关闭连接之前等待另一个 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 将为每个请求分配您指定的全部内存。例如,如果您指定 maxHttpRequestHeaderSize 为 1 MB,并且您的应用程序处理 100 个并发请求,您将看到 100 MB 的堆内存被请求头部消耗。

maxHttpResponseHeaderSize

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

maxKeepAliveRequests

在服务器关闭连接之前,可以进行管线化的 HTTP 请求的最大数量。将此属性设置为 1 将禁用 HTTP/1.0 keep-alive,以及 HTTP/1.1 keep-alive 和管线化。将其设置为 -1 将允许无限量的管线化或 keep-alive HTTP 请求。如果未指定,此属性设置为 100。

maxQueueSize

(int) 在被拒绝之前,可以排队等待执行的可运行任务的最大数量。默认值为Integer.MAX_VALUE

maxSwallowSize

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

maxThreads

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

maxTrailerSize

限制分块 HTTP 请求的最后一个分块中尾随头部的总长度。这必须是一个正整数值。如果未指定,将使用默认值8192

minSpareThreads

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

noCompressionUserAgents

该值是一个正则表达式(使用java.util.regex),匹配不应使用压缩的 HTTP 客户端的user-agent头部,因为这些客户端尽管声称支持该功能,但其实现存在缺陷。默认值为空字符串(禁用正则表达式匹配)。

processorCache

协议处理器缓存 Processor 对象以加快性能。此设置决定了这些对象缓存的数量。-1表示无限制,默认值为2000表示不重用请求处理器。这取决于工作负载,对性能和垃圾回收有非常显著的影响,但通过避免重用所有请求处理对象来提供额外的安全保障。如果未使用 Servlet 3.0 异步处理,则适当的值应与 maxThreads 设置相同。如果使用 Servlet 3.0 异步处理,则适当的值应取 maxThreads 和预期最大并发请求数(同步和异步)中的较大值。

relaxedPathChars

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

relaxedQueryChars

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

restrictedUserAgents

该值是一个正则表达式(使用java.util.regex),匹配不应使用 HTTP/1.1 或 HTTP/1.0 keep-alive 的 HTTP 客户端的user-agent头部,即使客户端声称支持这些功能。默认值为空字符串(禁用正则表达式匹配)。

server

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

serverRemoveAppProvidedValues

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

SSLEnabled

使用此属性可在连接器上启用 SSL 流量。要开启连接器上的 SSL 握手/加密/解密,请将此值设置为true。默认值为false。当将此值设置为true时,您还需要设置schemesecure属性,以便向 Servlet 传递正确的request.getScheme()request.isSecure()值。有关更多信息,请参阅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

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

useKeepAliveResponseHeader

(bool) 使用此属性启用或禁用添加此互联网草案中描述的Keep-Alive HTTP 响应头部。默认值为true

useVirtualThreads

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

Java TCP 套接字属性

NIO 和 NIO2 实现除了支持上述通用连接器和 HTTP 属性外,还支持以下 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 选项的布尔值。标准属性connectionLinger的值 >=0 等效于将其设置为true。标准属性connectionLinger的值 <0 等效于将其设置为false。此属性和soLingerTime都必须设置,否则两者都将使用 JVM 默认值。

socket.soLingerTime

(int) 套接字 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) 布尔值,是否使用直接 ByteBuffer 或 Java 映射 ByteBuffer。如果为true,则使用java.nio.ByteBuffer.allocateDirect()分配缓冲区;如果为false,则使用java.nio.ByteBuffer.allocate()。默认值为false
当您使用直接缓冲区时,请确保为直接内存空间分配了适当的内存量。在 Sun 的 JDK 上,这可能是类似-XX:MaxDirectMemorySize=256m的设置。

socket.directSslBuffer

(bool) 布尔值,SSL 缓冲区是否使用直接 ByteBuffer 或 Java 映射 ByteBuffer。如果为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)和执行(x)。如果未授予权限,则使用连字符。如果未指定,权限默认为rw-rw-rw-

useInheritedChannel

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

NIO2 特有配置

以下属性是 NIO2 连接器特有的。

属性描述
useSendfile

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

socket.directBuffer

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

socket.directSslBuffer

(bool) 布尔值,SSL 缓冲区是否使用直接 ByteBuffer 或 Java 映射 ByteBuffer。如果为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都可以嵌套在连接器中。同时,还增加了对将多个证书与单个SSLHostConfig关联的支持。因此,每个 SSL 证书都在SSLHostConfig中的Certificate元素中配置。有关更多信息,请参阅下面的 SSL 支持部分。

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

特殊功能

HTTP/1.1 和 HTTP/1.0 支持

连接器支持 HTTP/1.1 协议的所有必需功能,如 RFC 7230-7235 中所述,包括持久连接、管线化、期望和分块编码。如果客户端仅支持 HTTP/1.0 或 HTTP/0.9,则连接器也将优雅地回退到支持此协议。启用此支持不需要特殊配置。此连接器还支持 HTTP/1.0 keep-alive。

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

HTTP/2 支持

HTTP/2 支持包括 TLS (h2)、通过 HTTP 升级的非 TLS (h2c) 和直接 HTTP/2 (h2c) 连接。要为 HTTP 连接器启用 HTTP/2 支持,必须在连接器内嵌套以下UpgradeProtocol元素,其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 进程使用后,再删除该套接字。

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

SSL 支持

通过将SSLEnabled属性设置为true,您可以为此连接器的特定实例启用 SSL 支持。

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

NIO 和 NIO2 连接器使用 JSSE Java SSL 实现或 OpenSSL 实现。在可能的情况下,JSSE 和 OpenSSL 都使用通用的配置属性。

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

每个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 可能会以不同方式解释相同的密码字符串。例如,在 OpenSSL 3.2 中,CCM8密码已从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仅在使用实现TLSv1.3的 JVM 时才受 JSSE 支持。

请注意,对于基于 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 并且此 TLS 虚拟主机已配置单个证书,则默认值为该单个证书的keystoreProvider值。如果这些都没有识别出默认值,则将按偏好顺序遍历已注册提供程序的列表,并使用第一个支持truststoreType的提供程序。

truststoreType

仅限 JSSE。

信任库使用的密钥库类型。默认值为javax.net.ssl.trustStoreType系统属性的值。如果该属性为 null,并且此 TLS 虚拟主机已配置单个证书,且该证书的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 实现更优化(取决于所使用的处理器),并且可以与许多商业加速组件互补。

启用 OpenSSL FFM 支持后,连接器将默认通过 JSSE 使用 OpenSSL,这与前者等效,但使用 Java 22 中的 Java FFM API 访问 OpenSSL。

以下 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 还捆绑了一个由 OpenSSL 支持的特殊 JSSE SSL 实现。要启用它,应启用 native 库,Tomcat 将自动启用它,此属性的默认值将变为 org.apache.tomcat.util.net.openssl.OpenSSLImplementation。Java 22 中的 FFM API 也可以用于启用 OpenSSL 支持,在这种情况下,属性的默认值将变为 org.apache.tomcat.util.net.openssl.panama.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 元素支持以下属性。

属性描述
name

配置文件命令的名称。

value

配置文件命令要使用的值。

密钥库类型

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

  • 将 certificateKeystoreType 和/或 truststoreType 连接器属性(酌情)设置为必要的类型
  • 如果需要配置文件,将 certificateKeystoreFile 和/或 truststoreFile 连接器属性(酌情)设置为指向该文件
  • 如果不需要配置文件,那么您几乎肯定需要将 certificateKeystoreFile 和/或 truststoreFile 连接器属性(酌情)显式设置为空字符串("")
  • 如果需要密码,将 certificateKeystorePassword 和/或 truststorePassword 连接器属性(酌情)设置为所需的密码
  • 如果不需要密码,那么您几乎肯定需要将 certificateKeystorePassword 和/或 truststorePassword 连接器属性(酌情)显式设置为空字符串("")

密钥库实现的差异,加上 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