AJP 连接器

目录

简介

AJP 连接器元素表示一个连接器组件,该组件通过AJP协议与 Web 连接器通信。这用于希望将 Tomcat 无形地集成到现有(或新的)Apache 安装中,并且希望 Apache 处理 Web 应用程序中包含的静态内容和/或利用 Apache 的 SSL 处理的情况。

使用 AJP 协议需要额外的安全考虑,因为它允许对 Tomcat 的内部数据结构进行比 HTTP 连接器更直接的操作。应特别注意addresssecretsecretRequiredallowedRequestAttributesPattern属性所用的值。

此连接器在与引擎jvmRoute属性结合使用时支持负载平衡。

此 Tomcat 版本支持的本机连接器是

  • 任何受支持的服务器上的 JK 1.2.x。有关详细信息,请参阅JK 文档
  • 启用 AJP 的 Apache httpd 2.x 上的 mod_proxy(默认包含在 Apache HTTP Server 2.2 中):有关详细信息,请参阅httpd 文档

其他支持 AJP 的本机连接器可能有效,但不再受支持。

属性

通用属性

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

属性 说明
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 筛选器 可用于拒绝超出限制的请求。

maxPostSize

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

maxSavePostSize

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

parseBodyMethods

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

port

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

protocol

设置用于处理传入流量的协议。若要配置 AJP 连接器,必须指定此项。如果未提供协议值,则将配置 HTTP 连接器 而不是 AJP 连接器。
AJP 连接器的标准协议值为 AJP/1.3,它使用基于 Java NIO 的连接器。
若要使用显式协议,可以使用以下值
org.apache.coyote.ajp.AjpNioProtocol - 非阻塞 Java NIO 连接器。
org.apache.coyote.ajp.AjpNio2Protocol - 非阻塞 Java NIO2 连接器。
还可以使用自定义实现。
查看我们的 连接器比较 图表。

proxyName

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

proxyPort

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

redirectPort

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

rejectSuspiciousURIs

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

scheme

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

安全

如果希望对该连接器接收的请求返回 true,则将此属性设置为 true 以调用 request.isSecure()。您希望在 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

注释:请参阅 HTTP 连接器 文档中有关此属性的注释。

useIPVHosts

将此属性设置为 true 以使 Tomcat 使用本机 Web 服务器传递的 IP 地址来确定将请求发送到的主机。默认值为 false

xpoweredBy

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

标准实现

要使用 AJP,您必须指定 protocol 属性(见上文)。

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

属性 说明
acceptCount

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

acceptorThreadCount

用于接受连接的线程数。在多 CPU 机器上增加此值,尽管您实际上永远不需要超过 2。此外,对于大量非保持活动连接,您可能还想增加此值。默认值为 1

acceptorThreadPriority

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

address

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

ajpFlush

布尔值,可用于启用或禁用在发生显式刷新时向前端代理发送 AJP 刷新消息。默认值为 true
AJP 刷新消息是一个不带正文内容的 SEND_BODY_CHUNK 数据包。当收到这样的数据包时,诸如 mod_jk 或 mod_proxy_ajp 之类的代理实现会将缓冲在 Web 服务器中的数据刷新到客户端。将其设置为 false 可以减少 AJP 数据包流量,但可能会延迟向客户端发送数据包。在响应的末尾,AJP 始终刷新到客户端。

allowedRequestAttributesPattern

AJP 协议使用请求属性从反向代理传递一些信息到 AJP 连接器。这些属性是

  • javax.servlet.request.cipher_suite
  • javax.servlet.request.key_size
  • javax.servlet.request.ssl_session
  • javax.servlet.request.X509Certificate
  • AJP_LOCAL_ADDR
  • AJP_REMOTE_PORT
  • AJP_SSL_PROTOCOL
  • JK_LB_ACTIVATION
  • CERT_ISSUER(仅限 IIS)
  • CERT_SUBJECT(仅限 IIS)
  • CERT_COOKIE(仅限 IIS)
  • HTTPS_SERVER_SUBJECT(仅限 IIS)
  • CERT_FLAGS(仅限 IIS)
  • HTTPS_SECRETKEYSIZE(仅限 IIS)
  • CERT_SERIALNUMBER(仅限 IIS)
  • HTTPS_SERVER_ISSUER(仅限 IIS)
  • HTTPS_KEYSIZE(仅限 IIS)

AJP 协议支持传递任意请求属性。包含任意请求属性的请求将被拒绝,并返回 403 响应,除非整个属性名称与该正则表达式匹配。如果未指定,则默认值为 null

bindOnInit

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

clientCertProvider

当客户端证书信息以 java.security.cert.X509Certificate 实例以外的形式呈现时,需要在使用前进行转换,此属性控制用于执行转换的 JSSE 提供程序。如果未指定,将使用默认提供程序。

connectionLinger

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

connectionTimeout

连接器 在接受连接后等待请求 URI 行呈现的毫秒数。AJP 协议连接器的默认值为 -1(即无限)。

executor

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

executorTerminationTimeoutMillis

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

keepAliveTimeout

连接器在关闭连接之前等待另一个 AJP 请求的毫秒数。默认值是使用已为 connectionTimeout 属性设置的值。

maxConnections

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

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

maxHeaderCount

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

maxThreads

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

minSpareThreads

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

packetSize

此属性设置最大 AJP 数据包大小(以字节为单位)。最大值为 65536。它应与为 mod_jk 配置的 max_packet_size 指令相同。通常无需更改最大数据包大小。在发送证书或证书链时,已报告默认值存在问题。默认值为 8192。如果设置为小于 8192,则将忽略该设置并使用默认值 8192。

processorCache

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

secret

只有来自具有此密钥的工人的请求才会被接受。默认值为 null。此属性必须使用非空、非零长度的值指定,除非 secretRequired 明确配置为 false。如果此属性配置为非空、非零长度的值,则工人 必须 提供匹配的值,否则请求将被拒绝,而不管 secretRequired 的设置如何。

secretRequired

如果此属性为 true,则只有在 secret 属性配置为非空、非零长度值时,AJP 连接器才会启动。此属性仅控制是否需要为 AJP 连接器指定 secret 属性才能启动。它控制是否需要工作人员提供密钥。默认值为 true。仅当在受信任的网络上使用连接器时,才应将此属性设置为 false

tcpNoDelay

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

threadPriority

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

throwOnFailure

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

tomcatAuthentication

如果设置为 true,则身份验证将在 Tomcat 中完成。否则,经过身份验证的主体将从本机 Web 服务器传播,并在 Tomcat 中用于授权。

Web 服务器必须将用户主体(用户名)作为名为 REMOTE_USER 的请求属性发送。

请注意,此主体不会有任何与之关联的角色。

默认值为 true。如果 tomcatAuthorization 设置为 true,则此属性无效。

tomcatAuthorization

如果设置为 true,则经过身份验证的主体将从本机 Web 服务器传播,并被视为已在 Tomcat 中进行身份验证。如果 Web 应用程序有一个或多个安全约束,则授权将由 Tomcat 执行,并将角色分配给经过身份验证的主体。如果请求的相应 Tomcat 领域无法识别提供的用户名,则仍将创建一个主体,但它没有任何角色。默认值为 false

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 连接器。

属性 说明
socket.directBuffer

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

socket.appReadBufSize

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

socket.appWriteBufSize

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

socket.bufferPool

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

socket.bufferPoolSize

(int)NioChannel 池也可以基于大小,而不是基于已使用的对象。大小计算如下
NioChannel 缓冲区大小 = 读取缓冲区大小 + 写入缓冲区大小
SecureNioChannel 缓冲区大小 = 应用程序读取缓冲区大小 + 应用程序写入缓冲区大小 + 网络读取缓冲区大小 + 网络写入缓冲区大小
值以字节为单位,默认值为 1024*1024*100(100 MiB)。

socket.processorCache

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

socket.eventCache

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

NIO2 特定配置

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

属性 说明
useCaches

(bool)使用此属性启用或禁用对象缓存以减少产生的 GC 对象数量。默认值为 false

socket.directBuffer

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

socket.appReadBufSize

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

socket.appWriteBufSize

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

socket.bufferPoolSize

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

socket.processorCache

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

嵌套组件

目前没有。

特殊功能

代理支持

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

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

连接器比较

下面是一个小图表,显示了连接器的不同之处。

Java Nio 连接器
NIO
Java Nio2 连接器
NIO2
类名 AjpNioProtocol AjpNio2Protocol
Tomcat 版本 7.x 及更高版本 8.x 及更高版本
支持轮询
轮询大小 maxConnections maxConnections
读取请求标头 阻塞 阻塞
读取请求正文 阻塞 阻塞
写入响应头和正文 阻塞 阻塞
等待下一个请求 非阻塞 非阻塞
最大连接数 maxConnections maxConnections