workers.properties 配置

引言

Tomcat worker 是一个 Tomcat 实例,它等待执行 Servlet 或代表某个 Web 服务器执行任何其他内容。例如,我们可以有一个 Web 服务器,如 Apache HTTP Server,将 Servlet 请求转发到在其后运行的 Tomcat 进程(worker)。

上述场景是一个非常简单的场景;实际上,可以配置多个 Tomcat worker 来代表某个 Web 服务器提供 Servlet 服务。这种配置的原因可能是:

  • 我们希望不同的上下文由不同的 Tomcat worker 提供服务,以提供一个开发环境,其中所有开发人员共享相同的 Web 服务器,但拥有自己的 Tomcat worker。
  • 我们希望不同的虚拟主机由不同的 Tomcat 进程提供服务,以便在属于不同公司的网站之间提供清晰的分离。
  • 我们希望提供负载均衡,这意味着在各自的机器上运行多个 Tomcat worker,并在它们之间分发请求。

拥有多个 worker 的原因可能还有更多,但我想这个列表已经足够了...

Tomcat worker 在一个名为 workers.properties 的属性文件中定义,本教程将解释如何使用它。

配置文件基础

可以通过属性文件(conf/ 目录中提供了一个名为 workers.properties 的示例文件)为 Tomcat Web 服务器插件定义 worker。

格式、注释、空白

文件中的行定义了属性。通用格式是

<名称>=<值>

点用于名称的一部分,表示配置的层次结构。

无效指令将在 Web 服务器启动期间记录并阻止 Web 服务器正常工作。某些指令已被弃用。虽然它们仍然有效,但您应该用它们的继承者替换它们。

某些指令允许多次使用。这将在下面的表格中明确注明。

属性名称或值开头和结尾的空白字符将被忽略。注释可以放在任何行中,并以井号“#”开头。井号后面的任何行内容都将被忽略。

布尔属性可以使用数字 0(假)和 1(真)作为值,或者 off(假)和 on(真),或者任何以字母 f(假)、n(假)、t(真)或 y(真)开头的其他字符串来设置。这些值不区分大小写。在本文档中,我们将坚持使用 falsetrue

全局属性

这些指令具有全局范围。

指令默认值描述
worker.listajp13JK 将使用的 worker 名称的逗号分隔列表。启动时,Web 服务器插件将实例化其名称出现在 worker.list 属性中的 worker,这些 worker 也是您可以映射请求的 worker。

此指令可以多次使用。

worker.maintain60worker 连接池维护间隔(秒)。如果设置为正值,JK 将扫描 worker.list 指令中指定的所有 worker 的所有连接,并检查连接是否需要回收。

此外,任何负载均衡器每 worker.maintain 秒执行一次全局维护。在全局维护期间,负载计数器会衰减,并检查处于错误状态的 worker 的 recover_time

此功能已在 jk 1.2.13 中添加。

Worker 属性

每个 worker 配置指令由三个以点分隔的单词组成

worker.<worker 名称>.<指令>=<值>

第一个词始终是 worker。第二个词是您可以选择的 worker 名称。在负载均衡的情况下,worker 名称具有额外的含义。请查阅负载均衡器操作指南

worker 的名称只能包含字母数字字符 [a-z][A-Z][0-9][_\-],并且区分大小写。

变量、环境变量

您可以在 workers.properties 文件中定义和使用变量。要定义变量,请使用以下语法

<变量名>=<值>

变量名中允许使用点,但您必须小心,不要使用与标准指令冲突的变量名。因此,变量名绝不应以“worker.”开头。

要使用变量,您可以在属性行值的任意位置插入“$(variable_name)”。如果变量在使用前未定义,我们将搜索进程环境中的同名变量并使用其值。

属性继承

通常,人们希望为多个 worker 使用相同的属性值。为了减少配置行的重复并简化文件的维护,您可以将属性从一个 worker 继承到另一个 worker,甚至从模板继承到实际 worker。

指令“reference”允许以分层方式在 worker 或 worker 模板之间复制配置。如果 worker castor 设置了 worker.castor.reference=worker.pollux,那么它将继承 pollux 的所有属性,除了为 castor 明确设置的属性。

请注意,指令的值不仅是被引用 worker 的名称,还包括完整的“worker.”前缀。

要使用模板 worker,只需像定义真实 worker 一样定义它,但不要将其添加到 worker.list 或作为任何负载均衡器的成员。此类模板 worker 不必包含强制指令。如果负载均衡器中包含大量均衡 worker 并且这些 worker 共享大部分属性,则此方法特别有用。您可以在模板 worker 中设置所有这些属性,例如使用前缀“worker.template1”,然后简单地在所有均衡 worker 中引用这些公共属性。

引用可以用于以分层方式通过多个跳跃继承属性。嵌套引用的最大深度为 20。请注意不要引入引用循环!

此功能已在 jk 1.2.19 中添加。

所有 Worker 指令列表

强制指令

强制指令是每个 worker 必须包含的指令。没有它们,worker 将不可用或行为异常。这些指令将在下表中以 粗体 字体标记。

指令默认值描述
typeajp13worker 类型(可以是 ajp12ajp13ajp14jnilbstatus 之一)。worker 的类型定义了可以应用于 worker 的指令。

类型 ajp13 是 JK 用于 Web 服务器和 Tomcat 之间通信的首选 worker 类型。此类 worker 使用套接字作为通信通道。有关 ajp13 协议栈的详细说明,请浏览AJPv13 协议规范。类型 lb 用于负载均衡 worker,类型 status 用于状态 worker

类型 ajp14 处于实验阶段,不推荐使用,类型 ajp12 已过时。

JNI worker 不再受支持,并且可能无法工作。请勿使用它们。

连接指令

连接指令定义了连接和维护 JK 与远程 Tomcat 之间持久连接池所需的参数。

指令默认值描述
hostlocalhost后端 Tomcat 实例的主机名或 IP 地址。远程 Tomcat 必须支持 AJP13 协议栈。主机名可以嵌入用冒号(':')字符分隔的 port 号。
port8009远程 Tomcat 实例侦听已定义协议请求的端口号。默认值取决于 worker 类型。对于 ajp13 worker,默认端口是 8009,而对于 ajp14 类型的 worker,该值是 8011
source-用于连接源(出站地址)的名称或 IP 地址。它只应在多宿主主机上使用。

此功能是实验性的,已在 jk 1.2.41 中添加。

socket_timeout0JK 与远程主机之间通信通道使用的套接字超时(秒)。如果远程主机在指定超时内没有响应,JK 将生成错误并重试。如果设置为零(默认值),JK 将在所有套接字操作上无限期等待。
socket_connect_timeoutsocket_timeout*1000JK 与远程主机之间通信通道使用的套接字连接超时(毫秒)。如果远程主机在指定超时内没有响应,JK 将生成错误并重试。

请注意,socket_timeout 以秒为单位,而 socket_connect_timeout 以毫秒为单位,因此从绝对值来看,默认的 socket_connect_timeout 等于 socket_timeout

此功能已在 jk 1.2.27 中添加。

socket_keepalivefalse当您的 Web 服务器和 Tomcat 引擎之间存在防火墙且防火墙倾向于丢弃不活动连接时,应使用此指令。此标志将告诉操作系统在不活动连接上发送 KEEP_ALIVE 消息(间隔取决于全局操作系统设置,通常为 120 分钟),从而防止防火墙切断不活动连接。要启用 keepalive,请将此属性值设置为 true

防火墙切断不活动连接的问题在于,有时 Web 服务器或 Tomcat 都没有关于切断的信息,也无法处理它。

ping_mode-此标志确定在何种条件下探测已建立的连接以确保它们仍在工作。探测通过空 AJP13 数据包 (CPing) 完成,并期望在一定超时内收到适当的应答 (CPong)。

标志的值可以是以下标志的任意组合(多个值组合在一起,没有分隔符)

C (connect):如果设置,连接到后端后将探测一次连接。超时可以通过 connect_timeout 设置。如果未设置,则将使用 ping_timeout 的值。

P (prepost):如果设置,在向后端发送每个请求之前将探测连接。超时可以通过 prepost_timeout 设置。如果未设置,则将使用 ping_timeout 的值。

I (interval):如果设置,连接将在常规内部维护周期中进行探测,但仅当它空闲时间超过 connection_ping_interval 时。超时可以通过 ping_timeout 设置。

A:如果设置,将使用上述所有探测。

此功能已在 jk 1.2.27 中添加。从版本 jk 1.2.6 开始,通过 connect_timeoutprepost_timeout 已经可以使用连接和预发送探测。

ping_timeout10000等待 CPing 连接探测的 CPong 响应时使用的超时(毫秒)。探测的激活通过 ping_mode 完成。ping_mode 连接和预发送的超时可以通过 connect_timeoutprepost_timeout 分别覆盖。

出于兼容性原因,只要设置了 connect_timeoutprepost_timeout,即使 ping_mode 为空,也会使用 CPing/CPong。

此功能已在 jk 1.2.27 中添加。

connection_ping_interval0 / (ping_timeout/1000)*10当使用间隔连接探测时,空闲时间超过此间隔(秒)的连接将通过 CPing 数据包探测它们是否仍在工作。

间隔探测可以通过 ping_mode 激活,也可以通过将 connection_ping_interval 设置为大于零的值来激活。如果您通过 ping_mode 激活间隔探测,则 connection_ping_interval 的默认值为 (ping_timeout/1000) * 10。请注意,ping_timeout 以毫秒为单位,connection_ping_interval 以秒为单位,因此从绝对值来看,默认的 connection_ping_intervalping_timeout 的 10 倍。

此功能已在 jk 1.2.27 中添加。

connection_pool_size见正文这定义了作为连接池维护的与 AJP 后端建立的连接数。它将限制每个 Web 服务器子进程可以建立的连接数。

连接池大小属性仅用于多线程 Web 服务器,例如 Apache HTTP Server 和 Microsoft IIS。connection_pool_size 属性需要反映一个 Web 服务器进程可以并行发送到后端的请求数量。通常,这与每个 Web 服务器进程的线程数相同。JK 将自动为 Apache HTTP Server 发现此数字,并将池大小设置为此值。对于 IIS,默认值为 250(1.2.20 版之前:10)。

我们强烈建议为 IIS 调整此值,以使其与一个 Web 服务器进程可以并行发送到后端的请求数量相匹配。您应该测量在没有性能问题的情况下,高峰活动期间需要多少连接,然后根据您的增长率添加一定百分比。最后,您应该检查您的 Web 服务器进程是否能够使用至少与您配置的池大小一样多的线程。

Apache 2.x with prefork MPMApache 1.3.x 上,请勿使用大于 1 的 connection_pool_size 值!
connection_pool_minsize(pool+1)/2将维护的连接池的最小大小。

其默认值为 (connection_pool_size+1)/2。

Apache 2.x with prefork MPMApache 1.3.x 上,请勿使用大于 1 的 connection_pool_minsize 值!

此功能已在 jk 1.2.16 中添加。

connection_pool_timeout0应将缓存超时属性与 connection_pool_minsize 一起使用,以指定 JK 在关闭不活动套接字之前应在缓存中保留多长时间(秒)。此属性应用于减少 Tomcat Web 服务器上的线程数。默认值零禁用关闭(无限超时)。

每个子进程如果必须将请求转发到 Tomcat,则可以打开一个 ajp13 连接,在 Tomcat 侧创建一个新的 ajp13 线程。

问题在于,一旦创建了 ajp13 连接,子进程就不会将其丢弃,直到被终止。由于 Web 服务器将使其子进程/线程保持运行以处理高负载,即使子进程/线程只处理静态内容,您最终可能会在 Tomcat 侧拥有许多未使用的 ajp13 线程。

您应该将此时间间隔与 Tomcat 的 server.xml 中 AJP 连接器的 keepAliveTimeout 属性(如果已明确设置)或 connectionTimeout 属性保持同步。但请注意,mod_jk 的值以秒为单位,而 server.xml 中的值必须使用毫秒。

connection_acquire_timeoutretries*retry_intervalworker 等待缓存中可用套接字直到放弃的超时。

其默认值为 retries * retry_interval

此功能已在 jk 1.2.27 中添加。

lbfactor1仅用于负载均衡器的成员 worker。

整数 lbfactor(负载均衡因子)是我们期望此 worker 工作多少,或者此 worker 的工作配额。负载均衡因子与构成负载均衡器的其他 worker 进行比较。例如,如果一个 worker 的 lbfactor 比另一个 worker 高 5 倍,那么它将收到五倍的请求。

负载均衡指令

负载均衡器是一个虚拟 worker,它不真正与 Tomcat worker 通信。相反,它负责管理多个“真实”worker。如果 worker 类型为 lb,则该 worker 应为负载均衡器。请参阅 worker 的 type 指令。

负载均衡器指令定义了创建连接到后端 Tomcat 服务器远程集群的 worker 所需的参数。每个集群节点都必须定义一个 worker。

负载均衡器管理包括:

  • 在 Web 服务器中实例化 worker。
  • 使用 worker 的负载均衡因子,执行加权轮询负载均衡,其中高 lbfactor 意味着更强的机器(将处理更多请求)。
  • 将属于同一会话的请求保留在同一 Tomcat worker 上执行。
  • 识别失败的 Tomcat worker,暂停对其的请求,转而故障转移到由 lb worker 管理的其他 worker。

总体结果是,由同一 lb worker 管理的 worker 会进行负载均衡(基于其 lbfactor 和当前用户会话),并且还会进行故障转移,因此单个 Tomcat 进程的死亡不会“杀死”整个站点。

如果您想使用会话粘滞性,则必须在 Tomcat 的 server.xml 中 Engine 元素中设置不同的 jvmRoute 属性。此外,由均衡器管理的 worker 的名称必须与其连接的 Tomcat 实例的 jvmRoute 相等。

如果您为 worker 使用 route 属性,则可以取消对 worker 名称的限制。

下表指定了 lb worker 可以接受的属性

指令默认值描述
balance_workers-负载均衡器需要管理的 worker 的逗号分隔列表。

此指令可用于同一负载均衡器多次。

此指令取代了旧的 balanced_workers 指令,并且只能与 mod_jk 1.2.7 及更高版本一起使用。

只要这些 worker 应该只通过负载均衡器 worker 使用,就没有必要将它们也放入 worker.list 属性中。
sticky_sessiontrue指定是否应将带有 SESSION ID 的请求路由回同一 Tomcat worker。如果 sticky_session 设置为 true,则会话是粘滞的,否则 sticky_session 设置为 false。当 Tomcat 使用可以跨多个 Tomcat 实例持久化会话数据的 Session Manager 时,将 sticky_session 设置为 false

可以使用 Apache HTTP Server 环境变量 JK_STICKY_IGNORE 和 worker 映射扩展的 sticky_ignore 覆盖 sticky_session 设置。此功能已在 1.2.33 版中添加。

sticky_session_forcefalse指定是否应拒绝针对处于错误状态的 worker 的 SESSION ID 请求。如果 sticky_session_force 设置为 true 且与该 SESSION ID 匹配的 worker 处于错误状态,客户端将收到 500(服务器错误)。如果设置为 false,则会故障转移到另一个 worker,并丢失客户端会话。此指令仅在您设置 sticky_session=true 时使用。

此功能已在 jk 1.2.9 中添加。

methodRequest指定负载均衡器用于选择最佳 worker 的方法。请注意,会话粘滞性和完美负载均衡是相互冲突的目标,尤其是当会话数量很少或会话使用情况极其多变时。对于大量的会话,这通常不是问题。

有些方法指出它们在滑动时间窗口中聚合。它们将访问次数相加,并且在每次运行全局维护方法时,负载计数器除以 2。这通常每分钟发生一次,具体取决于 worker.maintain 的设置。负载计数器的值可以使用状态 worker 进行检查。

如果 method 设置为 R[equest],则均衡器将使用请求数量来查找最佳 worker。访问将根据 lbfactor 在滑动时间窗口中分发。这是默认值,应该适用于大多数应用程序。

如果 method 设置为 S[ession],则均衡器将使用会话数量来查找最佳 worker。访问将根据 lbfactor 在滑动时间窗口中分发。如果会话是您的限制资源,例如当您只有有限的内存并且您的会话需要大量内存时,应使用此方法。由于均衡器不保留任何状态,它实际上不知道会话数量。相反,它将每个没有会话 cookie 或 URL 编码的请求计为新会话。此方法既不会知道会话何时失效,也不会根据会话超时或 worker 故障转移来更正其负载编号。如果您知道没有会话 ID 但不应计为新会话的请求 URL,则应将它们添加到 stateless 映射规则扩展或为其设置 Apache HTTP Server 环境变量 JK_STATELESS

如果 method 设置为 N[ext],则均衡器将再次使用会话数量来查找最佳 worker。关于 Session 方法的所有备注也适用。与 Session 方法的区别在于滑动时间窗口中会话计数如何处理。Next 方法不除以 2,而是减去当前最小数量。这应该有效地导致轮询会话均衡,因此得名 Next。在高负载下,两种会话均衡方法将导致类似的分布,但如果您需要分发少量会话,则 Next 将更好。

如果设置为 T[raffic],则均衡器将使用 JK 和 Tomcat 之间的网络流量来查找最佳 worker。访问将根据 lbfactor 在滑动时间窗口中分发。如果到和从后端网络的流量是您的限制资源,则应使用此方法。

如果设置为 B[usyness],则均衡器将根据 worker 当前正在服务的请求数量来选择负载最低的 worker。此数字除以 worker 的 lbfactor,并选择值最低(最不繁忙)的 worker。如果您的请求处理时间很长,例如下载应用程序,则此方法特别有趣。不建议一般使用此方法,因为在高负载下,在某些硬件架构上,繁忙计数器可能会出错。

此功能已在 1.2.9 版中添加。Session 方法已在 1.2.20 版中添加,Next 方法在 1.2.33 版中添加。

lockOptimistic指定负载均衡器用于同步共享内存运行时数据的锁方法。如果 lock 设置为 O[ptimistic],均衡器将不使用共享内存锁来查找最佳 worker。如果设置为 P[essimistic],均衡器将使用共享内存锁。在悲观锁定情况下,均衡器将更准确地工作,但会降低平均响应时间。

此功能已在 jk 1.2.13 中添加。

retries2 此指令也存在于普通 worker 中。对于它们,它具有不同的含义发出请求时,负载均衡器 worker 会将请求分配给一个成员 worker。如果该成员 worker 无法处理请求或未能处理请求,则请求将被传递给另一个成员 worker,直到请求被处理、每个成员 worker 都尝试处理请求或 lb_retries 个成员 worker 尝试处理请求。

如果请求仍未处理,负载均衡器 worker 将重复上述过程最多 retries 次(包括原始尝试)。每次重试之前,负载均衡器 worker 将暂停由 retry_interval 指令定义的时间。

请注意,这意味着,如果所有 worker 都失败,在向客户端返回 504 响应之前,总共会有 worker.retries * min(lb.lb_retries,member worker count) * lb.retries 个请求。因此,对于一个具有四个成员和默认配置的 lb worker,如果所有 worker 都失败,在向客户端返回 504 响应之前,总共会有 8 个请求。

直到 1.2.16 版本,默认值为 3。

lb_retries2发出请求时,负载均衡器 worker 会将请求分配给一个成员 worker。如果该成员 worker 无法处理请求或未能处理请求,则请求将被传递给另一个成员 worker,直到请求被处理、每个成员 worker 都尝试处理请求或 lb_retries 个成员 worker 尝试处理请求。

如果请求仍未处理,负载均衡器 worker 将重复上述过程最多 retries 次(包括原始尝试)。每次重试之前,负载均衡器 worker 将暂停由 retry_interval 指令定义的时间。

请注意,这意味着,如果所有 worker 都失败,在向客户端返回 504 响应之前,总共会有 worker.retries * min(lb.lb_retries,member worker count) * lb.retries 个请求。因此,对于一个具有四个成员和默认配置的 lb worker,如果所有 worker 都失败,在向客户端返回 504 响应之前,总共会有 8 个请求。

此功能已在 jk 1.2.44 中添加。在此功能添加之前,负载均衡器 worker 的行为就像 lb_retries 等于成员 worker 数量一样。

状态 Worker 指令

状态 worker 不与 Tomcat 通信。相反,它负责负载均衡器管理。

指令默认值描述
css-指定要使用的级联样式表 (CSS) 的 URL。
read_onlyfalseread_only=true 的状态 worker 将不允许任何更改其他 worker 运行时状态或配置的操作。这些操作包括编辑/更新/重置/恢复。

此功能已在 jk 1.2.20 中添加。

user-这是一个用户列表,将与 Web 服务器验证的用户名称进行比较。如果名称不在此列表中,则拒绝访问。默认情况下,列表为空,则允许任何人访问。

此指令可以多次使用。

此功能已在 jk 1.2.20 中添加。

user_case_insensitivefalse默认情况下,用户名称区分大小写。您可以设置 user_case_insensitive=true 以使比较不区分大小写。这在 Windows 平台上可能特别有用。

此功能已在 jk 1.2.21 中添加。

gooda.o,a.n,a.b,a.r对于每个负载均衡器 worker,状态 worker 显示其成员状态的摘要。有三种状态:“good”、“bad”和“degraded”。

这些状态取决于成员的激活(active、disabled、stopped)及其运行时状态(ok、n/a、busy、recovering、probing、forced recovery、error)。默认情况下,如果成员的激活为“active”且运行时状态不是“error”,则假定其为“good”。

您可以通过为属性“good”分配一个值列表来更改此映射。每个值都为成员提供一个可能的匹配,并且一个匹配就足够了。每个值都是单个字符,或由点“.”组合的两个字符。单个字符是“active”、“disabled”、“stopped”、“ok”、“na”、“busy”、“recovering”、“error”这些单词的首字母。附加状态“probing”和“forced recovery”始终被视为等同于“recovering”。如果值仅由单个字符组成,则所有具有此激活或运行时状态的成员都将被假定为 good。激活和运行时状态与点“.”连接的组合仅适用于具有完全此激活和状态的成员。

负载均衡器的成员将首先匹配“bad”状态,如果它们不匹配,则将尝试“good”状态,如果它们仍然不匹配,则其状态将是“degraded”。

此指令可以多次使用。

此功能已在 jk 1.2.20 中添加。

bads,e参见:“good”。

默认情况下,如果成员的激活为“stopped”或其运行时状态为“error”,则假定其为“bad”。

此指令可以多次使用。

此功能已在 jk 1.2.20 中添加。

prefixworker状态 worker 生成属性输出 (mime=prop) 时将使用的前缀。每个属性键都将以此值作为前缀。

此功能已在 jk 1.2.20 中添加。

nsjk此指令可用于自定义状态 worker 的 XML 输出。如果设置为 -,则不使用命名空间。

此功能已在 jk 1.2.20 中添加。

xmlns-此指令可用于自定义状态 worker 的 XML 输出。如果设置为 -,则不使用 xmlns。

默认值设置为 xmlns:jk="https://tomcat.net.cn"

此功能已在 jk 1.2.20 中添加。

doctype-此指令可用于自定义状态 worker 的 XML 输出。此值将插入到 XML 头之后的输出 XML 中。

此功能已在 jk 1.2.20 中添加。

高级 Worker 指令

此表列出了更高级的配置选项。它们中的大多数只适用于某些类型的 worker。我们使用缩写 AJP 表示通过 workers.list 直接使用的 ajp13/ajp14 worker,LB 表示负载均衡器 worker,SUB 表示在负载均衡器 worker 中作为子 worker 或成员间接使用的 worker。

指令Worker 类型默认值描述
connect_timeoutAJP,SUB0连接超时属性告诉 Web 服务器在连接建立后向 ajp13 连接发送 PING 请求。该参数是等待 PONG 回复的延迟时间(毫秒)。默认值零禁用超时(无限超时)。

此功能已在 jk 1.2.6 中添加,以避免 Tomcat 挂起问题,并需要 ajp13 ping/pong 支持,该支持已在 Tomcat 3.3.2+、4.1.28+ 和 5.0.13+ 中实现。默认情况下禁用。

prepost_timeoutAJP,SUB0预发送超时属性告诉 Web 服务器在将请求转发到 ajp13 连接之前向其发送 PING 请求。该参数是等待 PONG 回复的延迟时间(毫秒)。默认值零禁用超时(无限超时)。

此功能已在 jk 1.2.6 中添加,以避免 Tomcat 挂起问题,并需要 ajp13 ping/pong 支持,该支持已在 Tomcat 3.3.2+、4.1.28+ 和 5.0.13+ 中实现。默认情况下禁用。

reply_timeoutAJP,SUB0该参数是在读取事件期间等待成功响应的毫秒数。因此,这不是请求完整响应时间的超时,而只是从 Tomcat 接收到两个数据包之间的最长时间。通常,最长的暂停时间是在发送请求和获取第一个响应数据包之间。

如果超时过去而未从 Tomcat 收到任何数据,Web 服务器将不再等待响应的其余部分,并向客户端(浏览器)发送错误。通常,这并不意味着 Tomcat 后端上的请求也被中止。如果 worker 是负载均衡器的成员,负载均衡器可能会将 worker 置于错误状态,并在另一个成员上重试请求。另请参见 max_reply_timeoutsretriesrecovery_options

默认情况下(值为零),Web 服务器将永远等待,这可能会成为您的问题。如果您设置了 reply_timeout,请在有长时间运行的 servlet 时仔细调整它。

可以使用 Apache HTTP Server 环境变量 JK_REPLY_TIMEOUT 和 worker 映射扩展的 reply_timeout 覆盖 reply_timeout

此功能已在 jk 1.2.6 中添加,以避免 Tomcat 挂起问题,并且适用于所有支持 ajp13 的 servlet 引擎。变量 JK_REPLY_TIMEOUT 和 worker 映射扩展已在 1.2.27 版中添加。

retriesAJP,SUB2 此指令也存在于负载均衡器 worker 中。对于它们,它具有不同的含义在通信错误的情况下,worker 向 Tomcat 发送请求的最大次数。每次重试都将通过另一个连接完成。第一次已经计算在内,所以 retries=2 表示错误后重试一次。重试之前,worker 会等待一个可配置的休眠时间。

另请参见属性 recovery_options 以进行更细粒度的重试控制,以及 retry_interval 以进行休眠时间配置。

直到 1.2.16 版本,默认值为 3。

retry_intervalAJP,SUB100worker 在进行任何重试之前休眠的时间量(毫秒)。

此功能已在 jk 1.2.27 中添加。

recovery_optionsAJP,SUB0恢复选项影响我们如何在检测到 Tomcat 问题时处理重试。我们重试的次数由属性 retries 控制。

此属性是一个位掩码。允许使用以下位:
1:如果 Tomcat 在收到请求后失败,则不恢复
2:如果 Tomcat 在向客户端发送头部后失败,则不恢复
4:如果我们在将响应写回客户端(浏览器)时检测到错误,则关闭与 Tomcat 的连接
8:始终恢复 HTTP 方法 HEAD 的请求(即使设置了位 1 或 2)
16:始终恢复 HTTP 方法 GET 的请求(即使设置了位 1 或 2)

此功能已在 jk 1.2.6 中添加。选项 4 已在 1.2.16 版本中添加,选项 8 和 16 在 1.2.24 版本中添加。

fail_on_statusAJP,SUB0将此值设置为如果 Servlet 容器返回,则会导致 worker 失败的 HTTP 状态码。使用此指令处理 Servlet 容器可能在短时间内(例如在重新部署期间)临时返回非 200 响应的情况。

原始响应的错误页面、头部和状态码将不会发送回客户端。相反,请求将导致 503 响应。如果 worker 是负载均衡器的成员,则该成员将被置于错误状态。请求故障转移和 worker 恢复将按照通常的负载均衡器程序处理。

此功能已在 jk 1.2.20 中添加。

jk 1.2.22 开始,可以定义多个状态码,用空格或逗号分隔。例如:worker.xxx.fail_on_status=500,503

jk 1.2.25 开始,您还可以告诉负载均衡器不要将成员置于错误状态,如果响应返回的状态码在 fail_on_status 中。通过在这些状态码前面放置一个负号来启用此功能。例如:worker.xxx.fail_on_status=-404,-500,503

busy_limitAJP,SUB0如果设置为正数,则只有当 worker 当前处理的并发请求少于此数量时,才会将其用于请求。

请注意,这与 Busyness 负载均衡 方法 无关。

此功能是实验性的,已在 jk 1.2.41 中添加。

max_packet_sizeAJP,SUB8192此属性设置 AJP 数据包的最大大小(字节)。它应该是 1024 的倍数。非 1024 倍数的配置值将对齐到下一个 1024 的倍数。最大值为 65536。如果您更改其默认值,则必须同时更改 Tomcat 端 AJP 连接器的 packetSize 属性!packetSize 属性在 Tomcat 6.0.2 及更高版本中可用。

通常不需要更改最大数据包大小。在发送证书或证书链时,已报告默认值存在问题。

此功能已在 jk 1.2.19 中添加。

prefer_ipv6AJP,SUBfalse编译时支持 IPV6 时,此指令强制主机名为同时具有 IPV6 和 IPV4 地址的名称解析为 IPV6 地址。如果给定主机名没有定义 IPV6 地址,则此指令无效。如果只定义了 IPV6 地址,或者“host”使用了 IP 地址(IPV4 或 IPV6 表示法),此指令也将无效。

此功能已在 jk 1.2.38 中添加。

secretAJP,SUB,LB-您可以在 Tomcat AJP 连接器上设置一个秘密关键字。然后,只有来自具有相同秘密关键字的 worker 的请求才会被接受。

在您的 Tomcat AJP 连接器配置中使用属性 secret="secret key word"。(历史说明:在 2020 年 2 月之前发布的 Tomcat 9.0、8.x、7.0 版本中,属性名为 requiredSecret;在 Tomcat 6.0 及更早版本中为 request.secret。)

如果您在负载均衡器上设置了秘密,则其所有成员都将继承此秘密。

此功能已在 jk 1.2.12 中添加。

mountAJP,LB-worker 应处理的 URI 映射的空格分隔列表。仅当 worker 包含在 worker.list 中时才使用。

此指令可用于同一 worker 多次。

max_reply_timeoutsLB0如果您为负载均衡器 worker 的成员使用 reply_timeout,并且您想容忍一些请求的处理时间超过 reply_timeout,您可以将此属性设置为某个正值。

长时间运行的请求在等待数据时仍会超时(reply_timeout 毫秒后),但只有当超过 max_reply_timeouts 个请求超时时,相应的成员 worker 才会被置于错误状态。更准确地说,每当负载均衡器执行其内部维护时(默认每 60 秒一次),这些错误请求的计数器都会除以二。

此功能已在 jk 1.2.24 中添加,以使 reply_timeout 对偶发长时间运行的请求不那么敏感。

recover_timeLB60恢复时间是负载均衡器在 worker 进入错误状态后,不再尝试使用该 worker 的秒数。只有在此时间过去后,处于错误状态的 worker 才会被标记为正在恢复,以便可以尝试将其用于新请求。

此间隔并非每次处理请求时都会检查。相反,它是在全局维护期间检查的。两次全局维护运行之间的时间由 worker.maintain 控制。

除非您了解其影响,否则不要将 recover_time 设置为非常短的时间。每个针对处于错误状态的 worker 的恢复尝试都是由实际请求完成的!

error_escalation_timeLBrecover_time / 2将负载均衡器的成员置于错误状态是相当严重的。例如,这意味着如果您需要粘滞性,则对相应节点会话的所有访问都将被阻止。

某些类型的错误检测无法提供节点是否完全损坏的精确信息。在这些情况下,LB 不会立即将节点置于错误状态。只有在此类错误发生后,error_escalation_time 秒内没有成功的响应,节点才会被置于错误状态。

此功能已在 jk 1.2.28 中添加。

session_cookieLBJSESSIONID包含会话粘滞性所需路由标识符的 cookie 名称。路由标识符是 cookie 值中“.”字符之后的所有内容。

此功能已在 jk 1.2.27 中添加。

session_pathLB;jsessionid包含会话粘滞性所需路由标识符的路径参数名称。路由标识符是路径参数值中“.”字符之后的所有内容。

此功能已在 jk 1.2.27 中添加。

set_session_cookieLBfalse激活会话粘滞性 cookie 的生成。通常您不需要此功能。

一些 Web 框架替换了 Tomcat 会话管理,并使用不同的方式生成会话 ID。因此,Tomcat 添加到会话 ID 末尾的路由 ID 会丢失,我们无法再进行粘滞负载均衡。作为一种变通方法,您可以执行以下步骤:

  • 使用“session_cookie”属性选择一个非标准 cookie 名称。
  • 通过将属性“set_session_cookie”设置为 true 来激活 cookie 发送。
  • 将属性“session_cookie_path”设置为正确的应用程序 URI,例如“/myapp/”。

只有当请求不包含同名 cookie,或者该 cookie 不包含负载均衡器可以满足的路由 ID 时,才会发送 cookie。特别是节点故障转移后,我们将发送一个新 cookie 以将粘滞性切换到新节点。

此功能已在 jk 1.2.38 中添加。

session_cookie_pathLB-此属性仅在“set_session_cookie”设置为 true 时使用。有关说明,请参见“set_session_cookie”。如果“session_cookie_path”的值为空(默认),则发送的 cookie 将不包含 PATH 信息。

此功能已在 jk 1.2.38 中添加。

activationSUBActive使用此指令,负载均衡器的均衡 worker 可以配置为禁用或停止。禁用的 worker 只接收属于该 worker 会话的请求。停止的 worker 不接收任何请求。停止的 worker 的用户将失去其会话,除非使用集群进行会话复制。

使用 dD 禁用,使用 sS 停止。如果此指令不存在,则使用已弃用的指令“disabled”或“stopped”。

此标志可以在运行时使用状态 worker 更改。

此功能已在 jk 1.2.19 中添加。

routeSUBworker 名称通常,负载均衡器中均衡 worker 的名称与相应 Tomcat 实例的 jvmRoute 相等。如果您希望将与 Tomcat 实例对应的 worker 包含到具有不同均衡配置(例如禁用、停止)的多个负载均衡器中,则可以使用此属性。

为每个 lb 和每个 Tomcat 实例定义一个单独的 worker,使用任意 worker 名称,并将 worker 的 route 属性设置为与目标 Tomcat 实例的 jvmRoute 相等。

如果此属性留空,则将使用 worker 的名称。

此属性可以在运行时使用状态 worker 更改。

如果路由名称包含句点,则第一个句点之前的部分将用作域名,除非明确设置了 domain。

此功能已在 jk 1.2.16 中添加。
自动域名规则已在 jk 1.2.20 中添加。
该属性已在 jk 1.2.20 中从 jvm_route 重命名为 route。

distanceSUB0一个整数,用于表达 lb worker 的均衡 worker 之间的偏好。如果存在另一个距离更低的可用 worker,负载均衡器绝不会选择某个均衡 worker。

只有当给定距离以下的所有 worker 都处于错误、禁用或停止状态时,距离较大的 worker 才符合均衡条件。

此功能已在 jk 1.2.16 中添加。

domainSUB-域指令只能在 worker 是负载均衡器成员时使用。共享相同域名的 worker 被视为单个 worker。如果使用 sticky_session,则域名用作会话路由。

此指令用于拥有 6 个以上 Tomcat 的大型系统,以便能够将 Tomcat 分为两组,从而降低它们之间的会话复制传输。

此功能已在 jk 1.2.8 中添加。

redirectSUB-设置为首选故障转移 worker 的名称。如果与 SESSION ID 匹配的 worker 处于错误状态,则将改用 redirect worker。即使其被禁用,它也会被使用,从而提供热备用。

如果您通过“route”属性明确设置了路由,则必须将“redirect”设置为此首选故障转移 worker 的路由,而不是其名称。

此功能已在 jk 1.2.9 中添加。

已弃用的 Worker 指令

以下指令已在过去弃用。我们在此处包含其文档,以防您需要使用旧版本的 mod_jk。我们强烈建议您更新并停止使用它们。请迁移您现有的配置。

指令继承者默认值描述
cachesizeconnection_pool_size见正文 此指令自 1.2.16 起已弃用。Cachesize 定义了作为连接池维护的与 AJP 后端建立的连接数。它将限制每个 Web 服务器子进程可以建立的连接数。

Cachesize 属性仅用于多线程 Web 服务器,例如 Apache HTTP Server 2.x(除 prefork 之外的所有 MPM)和 IIS。cachesize 属性应反映每个子进程的线程数。JK 将在具有线程 MPM 的 Apache HTTP Server 上自动发现每个子进程的线程数,并将其默认值设置为与当前 ThreadsPerChild Apache 配置匹配。对于 IIS,默认值为 10。

Apache 2.x with prefork MPMApache 1.3.x 上,请勿使用大于 1 的 cachesize 值!
cache_timeoutconnection_pool_timeout0 此指令自 1.2.16 起已弃用。缓存超时属性应与 cachesize 一起使用,以指定 JK 在关闭开放套接字之前应在缓存中保留多长时间。此属性应用于减少 Tomcat Web 服务器上的线程数。

每个子进程如果必须将请求转发到 Tomcat,则可以打开一个 ajp13 连接,在 Tomcat 侧创建一个新的 ajp13 线程。

问题在于,一旦创建了 ajp13 连接,子进程就不会将其丢弃,直到被终止。由于 Web 服务器将使其子进程/线程保持运行以处理高负载,即使子进程/线程只处理静态内容,您最终可能会在 Tomcat 侧拥有许多未使用的 ajp13 线程。

recycle_timeoutconnection_pool_timeout0 此指令自 1.2.16 起已弃用。指示 Web 服务器在一段时间不活动后切断 ajp13 连接的秒数。当为请求选择端点并且分配的套接字处于打开状态时,如果在配置的时间内未使用,它将被关闭。这是确保 Tomcat 端不会有太多旧线程的好方法,但代价是下次转发请求时需要重新打开套接字。此属性与 cache_timeout 非常相似,但也适用于非缓存模式。如果设置为零(默认值),则不会进行回收。
balanced_workersbalance_workers- 此指令自 1.2.7 起已弃用。负载均衡器需要管理的 worker 的逗号分隔列表。
disabledactivationfalse 此指令自 1.2.19 起已弃用。如果设置为 true,则如果 worker 是负载均衡器成员,它将被禁用。此标志可以在运行时使用状态 worker 更改。

此功能已在 jk 1.2.9 中添加。

stoppedactivationfalse 此指令自 1.2.19 起已弃用。如果设置为 true,则如果 worker 是负载均衡器成员,它将被停止。此标志用于停止粘滞会话 worker 的完整流量。仅当您拥有复制会话的集群时才有用。此标志可以在运行时使用状态 worker 更改。

此功能已在 jk 1.2.11 中添加。

jvm_routerouteworker 名称 此指令自 1.2.20 起已弃用。通常,负载均衡器中均衡 worker 的名称与相应 Tomcat 实例的 jvmRoute 相等。如果您希望将与 Tomcat 实例对应的 worker 包含到具有不同均衡配置(例如禁用、停止)的多个负载均衡器中,则可以使用此属性。

为每个 lb 和每个 Tomcat 实例定义一个单独的 worker,使用任意 worker 名称,并将 worker 的 jvm_route 属性设置为与目标 Tomcat 实例的 jvmRoute 相等。

如果此属性留空,则将使用 worker 的名称。

此属性可以在运行时使用状态 worker 更改。

此功能已在 jk 1.2.16 中添加。