workers.properties 配置

简介

Tomcat 工作进程是等待执行 servlet 或任何其他内容以代表某些 Web 服务器的 Tomcat 实例。例如,我们可以让 Web 服务器(如 Apache HTTP Server)将 servlet 请求转发到在其后面运行的 Tomcat 进程(工作进程)。

上面描述的场景非常简单;事实上,可以配置多个 Tomcat 工作进程来代表某个 Web 服务器提供 servlet。此类配置的原因可能是

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

可能还有更多理由需要多个工作进程,但我猜这个列表已经足够了...

Tomcat 工作进程在名为 workers.properties 的属性文件中定义,本教程将说明如何使用它。

配置文件基础知识

可以使用属性文件将工作进程定义为 Tomcat Web 服务器插件(conf/ 目录中提供名为 workers.properties 的示例文件)。

格式、注释、空格

文件中的行定义了属性。一般格式为

<name>=<value>

点被用作名称的一部分来表示配置层次结构。

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

某些指令允许多次使用。这将在下表中明确指出。

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

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

全局属性

这些指令具有全局范围。

指令 默认值 说明
worker.listajp13 JK 将使用的以逗号分隔的工作程序名称列表。在启动时,Web 服务器插件将实例化worker.list属性中出现的名称的工作程序,这些也是您可以将请求映射到的工作程序。

此指令可多次使用。

worker.maintain60 以秒为单位的工作程序连接池维护间隔。如果设置为正值,JK 将扫描worker.list指令中指定的所有工作程序的所有连接,并检查是否需要回收连接。

此外,任何负载均衡器每worker.maintain秒执行一次全局维护。在全局维护期间,负载计数器会衰减,并且会检查错误中的工作程序的recover_time

此功能已在jk 1.2.13中添加。

工作程序属性

每个工作程序配置指令由三个以点分隔的单词组成

worker.<worker name>.<directive>=<value>

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

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

变量、环境变量

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

<variable_name>=<value>

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

要使用变量,您可以在属性行的值一侧的任何位置插入“$(variable_name)”。如果在使用变量之前尚未定义该变量,我们将搜索进程环境以查找具有相同名称的变量并使用其值。

属性继承

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

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

请注意,该指令的值不仅是所引用工作程序的名称,还包括“worker.”在内的完整前缀。

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

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

此功能已添加到 jk 1.2.19 中。

所有工作程序指令列表

强制指令

强制指令是每个工作程序必须包含的指令。如果没有它们,工作程序将不可用或出现异常。这些指令将在下表中以加粗字体标记。

指令 默认值 说明
类型ajp13 工作程序类型(可以是 ajp12ajp13ajp14jnilbstatus 之一)。工作程序的类型定义了可应用于工作程序的指令。

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

类型 ajp14 为实验性,不推荐使用,类型 ajp12 已过时。

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

连接指令

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

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

此功能为实验性,已添加到 jk 1.2.41 中。

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

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

此功能已添加到 jk 1.2.27 中。

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

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

ping_mode- 此标志确定在哪些条件下探测已建立的连接以确保它们仍在工作。探测使用一个空的 AJP13 数据包 (CPing) 进行,并期望在某个超时时间内收到适当的应答 (CPong)。

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

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

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

I(间隔):如果设置,则将在常规内部维护周期内探测连接,但仅当连接空闲时间超过 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,就会使用 CPing/CPong,即使 ping_mode 为空。

此功能已添加到 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)。

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

不要在 Apache 2.x with prefork MPMApache 1.3.x 上将 connection_pool_size 与高于 1 的值一起使用!
connection_pool_minsize(pool+1)/2 将维护的连接池的最小大小。

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

不要在 Apache 2.x with prefork MPMApache 1.3.x 上将 connection_pool_minsize 与高于 1 的值一起使用!

此功能已添加到 jk 1.2.16 中。

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

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

问题在于,在创建 ajp13 连接后,子进程不会在终止之前放弃它。由于 Web 服务器会让其子进程/线程继续运行以处理高负载,即使子进程/线程只处理静态内容,您最终也会在 Tomcat 端拥有许多未使用的 ajp13 线程。

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

connection_acquire_timeoutretries*retry_interval 放弃之前,工作进程将在缓存中等待一个空闲套接字的超时时间。

其默认值为 retries * retry_interval

此功能已添加到 jk 1.2.27 中。

lbfactor1 仅用于负载均衡器的成员工作进程。

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

负载均衡指令

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

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

负载均衡器管理包括

  • 在 Web 服务器中实例化工作进程。
  • 使用工作负载均衡因子,执行加权循环负载均衡,其中较高的 lbfactor 表示更强大的机器(将处理更多请求)
  • 保持属于同一会话的请求在同一 Tomcat 工作程序上执行。
  • 识别失败的 Tomcat 工作程序,暂停向它们发送请求,并改为故障转移到 lb 工作程序管理的其他工作程序上。

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

如果您想使用会话粘性,则必须在 Tomcat 的 server.xml 中的 Engine 元素中设置不同的 jvmRoute 属性。此外,平衡器管理的工作程序的名称必须等于它们连接的 Tomcat 实例的 jvmRoute。

如果您为工作程序使用 route 属性,则可以解除对工作程序名称的限制。

下表指定了 lb 工作程序可以接受的属性

指令 默认值 说明
balance_workers- 负载均衡器需要管理的工作程序的逗号分隔列表。

此指令可针对同一负载均衡器多次使用。

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

只要这些工作程序应该仅通过负载均衡器工作程序使用,则无需将它们也放入 worker.list 属性中。
sticky_sessiontrue 指定是否应将带有会话 ID 的请求路由回同一 Tomcat 工作程序。如果 sticky_session 设置为 true,则会话具有粘性,否则 sticky_session 设置为 false。当 Tomcat 使用可以跨多个 Tomcat 实例保留会话数据的会话管理器时,将 sticky_session 设置为 false

可以使用 Apache HTTP Server 环境变量 JK_STICKY_IGNOREsticky_ignore 的工作程序映射扩展来覆盖 sticky_session 设置。这已添加到版本 1.2.33 中。

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

此功能已添加到 jk 1.2.9 中。

method请求 指定负载均衡器用于选择最佳工作程序的方法。请注意,会话粘性和完美的负载均衡是相互冲突的目标,尤其是在会话数量较少或会话使用情况差异极大的情况下。对于大量的会话,这通常不是问题。

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

如果方法设置为 R[equest],均衡器将使用请求数来查找最佳工作进程。访问将根据滑动时间窗口中的 lbfactor 进行分配。这是默认值,并且应该适用于大多数应用程序。

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

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

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

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

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

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

此功能已在jk 1.2.13中添加。

重试2 此指令也适用于普通工作进程。对于这些工作进程,它具有不同的含义在发出请求时,负载均衡器工作进程会将请求分配给成员工作进程。如果该成员工作进程无法处理请求或未能处理请求,则请求将传递给另一个成员工作进程,直到处理请求、每个成员工作进程都尝试处理请求或 lb_retries 个成员工作进程尝试处理请求为止。

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

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

1.2.16 版本之前,默认值为 3。

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

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

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

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

状态工作进程指令

状态工作进程不会与 Tomcat 通信。相反,它负责负载均衡器管理。

指令 默认值 说明
css- 指定要使用的级联样式表的 URL。
read_onlyfalse read_only=true 的状态工作进程将不允许任何操作,这些操作会更改其他工作进程的运行时状态或配置。这些操作包括编辑/更新/重置/恢复。

此功能已在 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 对于每个负载均衡器工作进程,状态工作进程都会显示其成员状态的摘要。有三种此类状态,“正常”、“异常”和“降级”。

这些状态根据成员的激活(活动、禁用、停止)及其运行时状态(正常、不可用、繁忙、恢复、探测、强制恢复、错误)来确定。默认情况下,如果成员的激活为“活动”且其运行时状态不为“错误”,则假定成员为“正常”。

你可以通过将值列表分配给属性“good”来更改此映射。每个值都为成员提供一个可能的匹配,并且一个匹配就足够了。每个值要么是单个字符,要么是与点“.”组合的两个字符。单个字符是单词“active”、“disabled”、“stopped”、“ok”、“na”、“busy”、“recovering”、“error”中的第一个字符。其他状态“probing”和“forced recovery”始终被评为等同于“recovering”。如果一个值仅包含一个字符,则所有具有此激活或运行时状态的成员都将被假定为正常。激活和运行时状态的组合与点“.”连接仅适用于具有此激活和状态的成员。

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

此指令可多次使用。

此功能已在 jk 1.2.20 中添加。

bads,e 参见:“好”。

默认情况下,如果成员的激活状态为“已停止”,或者其运行时状态为“错误”,则认为该成员为“差”。

此指令可多次使用。

此功能已在 jk 1.2.20 中添加。

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

此功能已在 jk 1.2.20 中添加。

nsjk 此指令可用于自定义状态工作进程的 XML 输出。如果设置为 -,则不会使用任何命名空间。

此功能已在 jk 1.2.20 中添加。

xmlns- 此指令可用于自定义状态工作进程的 XML 输出。如果设置为 -,则不会使用任何 xmlns。

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

此功能已在 jk 1.2.20 中添加。

doctype- 此指令可用于自定义状态工作进程的 XML 输出。此值将在 XML 标头后插入到输出 XML 中。

此功能已在 jk 1.2.20 中添加。

高级工作进程指令

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

指令工作进程类型默认值说明
connect_timeoutAJP、SUB0 连接超时属性告知 Web 服务器在建立连接后在 ajp13 连接上发送 PING 请求。参数是在等待 PONG 答复时等待的毫秒数延迟。默认值零禁用超时(无限超时)。

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

prepost_timeoutAJP、SUB0 预发布超时属性告知 Web 服务器在将请求转发给它之前在 ajp13 连接上发送 PING 请求。参数是在等待 PONG 答复时等待的毫秒数延迟。默认值零禁用超时(无限超时)。

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

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

如果在未从 Tomcat 接收任何数据的情况下超时,Web 服务器将不再等待响应的其余部分,并向客户端(浏览器)发送错误。通常,这并不意味着请求也在 Tomcat 后端中止。如果工作进程是负载平衡器的成员,负载平衡器可能会将工作进程置于错误状态,并在其他成员上重试请求。另请参阅 max_reply_timeoutsretriesrecovery_options

默认情况下(值为零),Web 服务器将无限期地等待,这对你来说可能是个问题。如果你设置了 reply_timeout,如果你有长时间运行的 servlet,请仔细调整它。

可以使用 Apache HTTP 服务器环境变量 JK_REPLY_TIMEOUTreply_timeout 的工作进程映射扩展覆盖 reply_timeout

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

重试AJP、SUB2 此指令也适用于负载平衡器工作进程。对于那些,它有 不同的含义在通信错误的情况下,工作进程将向 Tomcat 发送请求的最大次数。每次重试都将通过另一个连接进行。第一次已经计算在内,因此重试=2 表示错误后重试一次。在重试之前,工作进程将等待可配置的休眠时间。

另请参阅属性 recovery_options 以更精细地控制重试和 retry_interval 以进行休眠时间配置。

1.2.16 版本之前,默认值为 3。

retry_intervalAJP、SUB100 工作进程在执行任何重试之前休眠的毫秒数。

此功能已在 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 将此值设置为 HTTP 状态代码,如果 Servlet 容器返回该代码,则会使工作进程失败。使用此指令处理 servlet 容器在短时间内(例如重新部署期间)可以临时返回非 200 响应的情况。

原始响应的错误页面、标头和状态代码不会发送回客户端。相反,该请求将导致 503 响应。如果工作进程是负载均衡器的成员,则该成员将进入错误状态。请求故障转移和工作进程恢复将使用通常的负载均衡器程序处理。

此功能已在 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 如果设置为正数,则只有当工作进程当前处理的并发请求数少于此数字时,才会将该工作进程用于请求。

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

此功能为实验性,已添加到 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 地址,或者使用 IP 地址(以 IPV4 或 IPV6 表示法)表示“主机”,则此指令也无效。

此功能已添加到 jk 1.2.38 中。

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

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

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

此功能已添加到 jk 1.2.12 中。

mountAJP、LB- 工作进程应处理的 URI 的空格分隔列表。仅当工作进程包含在 worker.list 中时才使用它。

此指令可对同一工作进程多次使用。

max_reply_timeoutsLB0 如果您对负载均衡器工作进程的成员使用 reply_timeout,并且希望容忍一些请求花费的时间超过 reply_timeout,则可以将此属性设置为某个正值。

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

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

recover_timeLB60 恢复时间是指负载均衡器在工作进程进入错误状态后不会尝试使用该工作进程的时间(以秒为单位)。只有在经过此时间后,处于错误状态的工作进程才会被标记为正在恢复,以便对其进行新请求的尝试。

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

除非您了解含义,否则不要将 recover_time 设置为很短的时间。对处于错误状态的工作进程进行的每次恢复尝试都是通过实际请求完成的!

error_escalation_timeLB恢复时间/2 将负载均衡器的成员设置为错误状态非常严重。例如,这意味着如果您需要粘性,则将阻止对相应节点会话的所有访问。

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

此功能已添加到jk 1.2.28中。

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

此功能已添加到 jk 1.2.27 中。

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

此功能已添加到 jk 1.2.27 中。

设置会话 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 中。

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

此功能已添加到 jk 1.2.38 中。

激活SUB活动 使用此指令,可以将负载均衡器的平衡工作器配置为禁用或停止。禁用的工作器仅获取属于该工作器的会话的请求。停止的工作器不会收到任何请求。停止的工作器的用户将丢失其会话,除非使用群集通过会话复制。

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

此标志可以使用状态工作进程在运行时更改。

此功能已添加到 jk 1.2.19 中。

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

为每个负载均衡器和每个 Tomcat 实例定义一个单独的工作进程,并使用任意工作进程名称,并将工作进程的路由属性设置为目标 Tomcat 实例的 jvmRoute。

如果此属性留空,则将使用工作进程的名称。

此属性可以使用状态工作进程在运行时更改。

如果路由名称包含句点,则句点之前的部分将用作域名,除非显式设置了域名。

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

距离SUB0 一个整数,用于表达负载均衡器工作进程之间的偏好。如果存在距离较低的其他可用工作进程,则负载均衡器绝不会选择某个平衡工作进程。

仅当低于给定距离的所有工作进程处于错误、禁用或停止状态时,距离较大的工作进程才有资格进行平衡。

此功能已添加到 jk 1.2.16 中。

域名SUB- 仅当工作进程是负载均衡器的成员时,才可以使用域名指令。共享相同域名的工作进程被视为单个工作进程。如果使用 sticky_session,则域名将用作会话路由。

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

此功能已添加到 jk 1.2.8 中。

重定向SUB- 设置为首选故障转移工作进程的名称。如果与会话 ID 匹配的工作进程处于错误状态,则将使用重定向工作进程。即使被禁用,它也将被使用,从而提供热备用。

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

此功能已添加到 jk 1.2.9 中。

已弃用的工作程序指令

以下指令已在过去弃用。如果您需要使用较早版本的 mod_jk,我们会在其中包含其文档。我们敦促您更新,不再使用它们。请迁移您现有的配置。

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

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

请勿在 Apache 2.x 与 prefork MPMApache 1.3.x 中使用 cachesize,其值高于 1!
cache_timeoutconnection_pool_timeout0 此指令自 1.2.16 起已弃用。Cache timeout 属性应与 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 的逗号分隔列表。
disabled激活false 此指令已从 1.2.19 版开始弃用。 如果设置为 true,如果 worker 是负载均衡器的成员,则该 worker 将被禁用。此标志可以使用状态 worker 在运行时更改。

此功能已添加到 jk 1.2.9 中。

stopped激活false 此指令已从 1.2.19 版开始弃用。 如果设置为 true,如果 worker 是负载均衡器的成员,则该 worker 将被停止。此标志对于停止粘性会话 worker 的完整流量是必需的。仅当您拥有复制会话的集群时,它才有用。此标志可以使用状态 worker 在运行时更改。

此功能已在 jk 1.2.11 中添加。

jvm_route路由工作进程名称 此指令已从 1.2.20 版开始弃用。 通常,负载均衡器中平衡 worker 的名称等于相应 Tomcat 实例的 jvmRoute。如果您想将对应于 Tomcat 实例的 worker 包含到具有不同平衡配置(例如,disabled、stopped)的多个负载均衡器中,则可以使用此属性。

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

如果此属性留空,则将使用工作进程的名称。

此属性可以使用状态工作进程在运行时更改。

此功能已添加到 jk 1.2.16 中。