为 Apache HTTP Server 配置 mod_jk

配置指令

大多数指令允许在 Apache HTTP Server 全局配置部分出现一次,并在每个 <VirtualHost> 元素中出现一次。此规则的例外情况在下表中明确列出。

大多数值从主服务器继承到虚拟主机。自版本 1.2.20 起,它们可以在虚拟主机中被覆盖。此规则的例外情况再次在下表中明确列出。特别请参阅 JkMountCopy。

警告:如果 Apache 和 Tomcat 配置为从相同的文件系统位置提供内容,则必须注意确保 Apache 无法提供不适当的内容,例如 WEB-INF 目录的内容或 JSP 源代码。

如果 Apache 的 DocumentRoot 与 Tomcat Host 的 appBase 或任何 Context 的 docBase 重叠,则可能会发生这种情况。在使用 Apache Alias 指令与 Tomcat Host 的 appBase 或任何 Context 的 docBase 时也可能发生这种情况。

以下是 Apache 支持的所有指令

属性描述
JkWorkersFile

Tomcat servlet 容器的 worker 文件名。
此指令只允许出现一次。它必须放在配置的全局部分。
如果您不使用 JkWorkerProperty 指令,则必须使用有效的 JkWorkersFile 定义您的 workers。没有默认值。

JkWorkerProperty

允许在 Apache 配置文件中设置 worker 属性。语法与 JkWorkersFile(通常是 workers.properties)中的相同。只需在每行前面加上 "JkWorkerProperty",即可将其直接放入 Apache 配置文件中。
此指令允许多次出现。它必须放在配置的全局部分。
如果您不使用 JkWorkerProperty 指令,则必须使用有效的 JkWorkersFile 定义您的 workers。没有默认值。
此指令在 jk1.2.7 版本及更高版本中可用。

JkShmFile

共享内存文件名。仅在 Unix 平台上使用。shm 文件由 balancer 和 status workers 使用。
此指令只允许出现一次。它必须放在配置的全局部分。
默认值为 logs/jk-runtime-status。强烈建议将 shm 文件放在本地驱动器上,而不是 NFS 共享上。

共享内存包含负载均衡器 workers 及其成员的配置和运行时信息。它需要确保所有 Apache 子进程

  • 共享负载均衡成员的相同状态信息(OK、ERROR 等),
  • 共享各个 worker 承担的负载信息,
  • 共享配置中可在运行时由状态 worker 更改的部分信息。

JkShmSize

共享内存文件的大小。
此指令只允许出现一次。它必须放在配置的全局部分。
默认值取决于平台。通常小于 64KB。

JkMountFile

包含从上下文到 Tomcat worker 的多个映射的文件。它通常被称为 uriworkermap.properties。
有关继承规则,请参阅:JkMountCopy。
没有默认值。

JkMountFileReload

此指令配置重新加载检查间隔(以秒为单位)。JkMountFile 会定期检查是否有更改。更改的文件会自动重新加载。如果您将此指令设置为 "0",则会关闭重新加载检查。
默认值为 60 秒。
此指令已在 mod_jk 的 1.2.20 版本中添加。

JkMount

从上下文到 Tomcat worker 的挂载点。
此指令允许多次出现。它允许在全局配置和 VirtualHost 中使用。
您也可以在 Location 中使用它,但语法不同。在 Location 内部,省略第一个参数(路径),该参数将原样继承自 Location 参数。而 <Location /myapp> 匹配以 "/myapp" 开头的任何 URI,但在这样的 Location 块中嵌套的任何 JkMount 将只匹配 URI 恰好为 /myapp 的请求。因此,在 Location 中嵌套 JkMount 通常不是正确的做法。
默认情况下,JkMount 条目不会从全局服务器继承到其他 VirtualHost 或 VirtualHost 之间。有关完整的继承规则,请参阅:JkMountCopy。
您可以将规则扩展附加到 worker 名称。扩展名与 worker 名称之间用分号 ";" 分隔,使用的语法与 uriworkermap.properties 文件中相同。

JkUnMount

从上下文到 Tomcat worker 的排除挂载点。在将请求映射到 Tomcat worker 后,会检查所有排除挂载。如果请求也映射到排除项,则不会将其转发到 Tomcat,而是由本地提供服务。
此指令允许多次出现。它允许在全局配置和 VirtualHost 中使用。
您也可以在 Location 中使用它,但语法不同。在 Location 内部,省略第一个参数(路径),该参数将原样继承自 Location 参数。而 <Location /myapp> 匹配以 "/myapp" 开头的任何 URI,但在这样的 Location 块中嵌套的任何 JkUnMount 将只匹配 URI 恰好为 /myapp 的请求。因此,在 Location 中嵌套 JkUnMount 通常不是正确的做法。
有关继承规则,请参阅:JkMountCopy。
此指令在 jk1.2.7 版本及更高版本中可用。

JkAutoAlias

自动将 webapp 上下文目录别名到 Apache 文档空间中。
使用此指令时应注意确保仅通过 Apache 提供静态内容。由 Apache 提供的任何静态内容都将绕过应用程序 web.xml 中定义的任何安全约束。
有关继承规则,请参阅:JkMountCopy。
没有默认值。

JkMountCopy

如果此指令在某个虚拟服务器中设置为 "On",则来自全局服务器的挂载将被复制到此虚拟服务器,更准确地说,是 JkMount 或 JkUnMount 定义的所有挂载。JkMountFile 和 JkAutoAlias 定义的挂载只有在 VirtualHost 未定义自己的 JkMountFile 或 JkAutoAlias 时才会继承。
如果您希望所有虚拟主机都继承主服务器的挂载,您可以在主服务器中将 JkMountCopy 设置为 'All'。
此指令只允许在 VirtualHost 内部(值为 "On")和全局服务器中(值为 "All")使用。
默认值为 Off,因此不会从全局服务器继承任何挂载到任何 VirtualHost。
从版本 1.2.26 开始,您也可以在全局虚拟服务器中将其设置为 "All"。这将把默认值切换为 On。

JkWorkerIndicator

Apache 环境变量的名称,可用于与 SetHandler jakarta-servlet 结合设置 worker 名称。
此指令每个虚拟服务器只允许出现一次。它允许在全局配置和 VirtualHost 中使用。
默认值为 JK_WORKER_NAME。

JkWatchdogInterval

此指令配置 watchdog 线程的间隔(以秒为单位)。workers 由一个后台线程定期维护,该线程每 watchdog_interval 秒运行一次。Worker 维护检查空闲连接、纠正负载状态并能够检测后端健康状态。
维护操作仅在上次维护以来至少 worker.maintain 秒过去后才会发生。因此,将 JkWatchdogInterval 设置得远小于 worker.maintain 是没有用的。
默认值为 0 秒,表示不会创建 watchdog 线程,维护将与正常请求结合进行。
此指令只允许出现一次。它必须放在配置的全局部分。
此指令已在 mod_jk 的 1.2.27 版本中添加。它仅适用于使用包含线程支持的 APR 库的 Apache 2.x 及更高版本。

JkLogFile

mod_jk 日志文件的完整路径或服务器相对路径。它也可以通过使用 "| ..." 形式的值来与管道一起工作。
默认值为 logs/mod_jk.log。
管道仅在 1.2.16 版本后才支持 Apache 1.3。默认值仅在 1.2.20 版本后才存在。

JkLogLevel

mod_jk 日志级别,可以是 debug、info、warn error 或 trace。
默认值为 info。

JkLogStampFormat

mod_jk 日期 日志格式,使用扩展的 strftime 语法。此格式将用于 JkLogFile 中的时间戳。格式的最大长度为 63 个字符。
从 mod_jk 的 1.2.24 版本开始,您还可以使用 %Q 添加日志中的毫秒,使用 %q 添加微秒。这些转换说明符是 strftime 的扩展。它们只适用于具有 gettimeofday() 函数的平台。您只能在模式中各使用一次 %Q 和 %q,并且不能在同一模式中同时使用两者。
默认值为 "[%a %b %d %H:%M:%S %Y] ",从 1.2.24 版本开始,在具有 gettimeofday() 函数的平台上,默认值为 "[%a %b %d %H:%M:%S.%Q %Y] "。

JkRequestLogFormat

请求日志格式字符串。请参阅下面的详细说明。
没有默认值。如果不定义值,则关闭请求日志记录。

JkExtractSSL

启用 mod_jk 的 SSL 处理和信息收集
默认值为 On。
为了使 SSL 数据在 Apache 中对 mod_jk 可用,您需要设置 SSLOptions +StdEnvVars。对于证书信息,您还需要添加 SSLOptions +ExportCertData

具体来说,mod_jk 将根据 Servlet 规范 3.0 第 3.8 节,将 Apache 中的以下环境变量作为请求属性导出到 Tomcat:

环境变量请求属性名称类型示例
SSL_CIPHER
(或 JkKEYSIZEIndicator
javax.servlet.request.cipher_suite java.lang.String DHE-RSA-AES256-SHA
SSL_CIPHER_USEKEYSIZE
(或 JkKEYSIZEIndicator
javax.servlet.request.key_size java.lang.Integer 256
SSL_SESSION_ID
(或 JkSESSIONIndicator
javax.servlet.request.ssl_session java.lang.String 905...32E(十六进制字符串)
SSL_CLIENT_CERT_CHAIN_n
(或 JkCERTCHAINPrefixn
javax.servlet.request.X509Certificate java.security.X509Certificate[] (证书链按信任升序排列,第一个是客户端证书,第二个是该证书的签名者,依此类推)

此外,mod_jk 将使用的 SSL 协议名称作为名为 AJP_SSL_PROTOCOL 的专有请求属性发送。现代 Tomcat 版本将以 org.apache.tomcat.util.net.secure_protocol_version 的名称公开此属性。此功能已在 mod_jk 的 1.2.41 版本中添加。另请参阅 JkSSLPROTOCOLIndicator。

对于所有其他与 SSL 相关的变量,请为您想要的每个变量使用 JkEnvVar。请注意,与 JkEnvVar 一样,这些变量可从请求属性中获取,而不是作为环境变量或请求头。

JkRequestIdIndicator

包含唯一请求 ID 的 Apache 环境变量名称。该环境变量的值将添加到大多数 mod_jk 错误日志行中,并且通过将该环境变量也添加到 Apache 日志中,可以轻松地与 Apache 日志进行关联。
默认值为 "UNIQUE_ID"。加载 "mod_unique_id" 模块将自动在该名称下提供唯一的请求 ID。

此功能已在 mod_jk 的 1.2.49 版本中添加。

如果客户端或前面的另一个反向代理通过 HTTP 请求头发送请求 ID,可以使用 mod_setenvif 将其复制到环境变量中,从而使其可供 mod_jk 使用
SetEnvIf X-REQUEST-ID-HEADER "(.+)" X-REQUEST-ID=$1
将传入头 X-REQUEST-ID-HEADER 的值复制到环境变量 X-REQUEST-ID 中。mod_jk 可以通过 JkRequestIdIndicator X-REQUEST-ID 从中获取它。

JkHTTPSIndicator

包含 SSL 指示的 Apache 环境变量名称。
默认值为 "HTTPS"。

JkSSLPROTOCOLIndicator

包含 SSL 协议名称的 Apache 环境变量名称。
默认值为 "SSL_PROTOCOL"。
此指令已在 mod_jk 的 1.2.41 版本中添加。

JkCERTSIndicator

包含 SSL 客户端证书的 Apache 环境变量名称。
默认值为 "SSL_CLIENT_CERT"。

JkCIPHERIndicator

包含 SSL 客户端密码的 Apache 环境变量名称。
默认值为 "SSL_CIPHER"。

JkCERTCHAINPrefix

包含 SSL 客户端链证书的 Apache 环境变量(前缀)名称。
默认值为 "SSL_CLIENT_CERT_CHAIN_"。

JkSESSIONIndicator

包含 SSL 会话的 Apache 环境变量名称。
默认值为 "SSL_SESSION_ID"。

JkKEYSIZEIndicator

包含正在使用的 SSL 密钥大小的 Apache 环境变量名称。
默认值为 "SSL_CIPHER_USEKEYSIZE"。

JkLocalNameIndicator

可用于覆盖转发的本地名称的 Apache 环境变量名称。仅在需要调整数据时才使用此功能(请参阅代理文档)。
默认值为 "JK_LOCAL_NAME"。
此指令已在 mod_jk 的 1.2.28 版本中添加。

JkIgnoreCLIndicator

强制忽略现有 Content-Length 请求头的 Apache 环境变量名称。这可用于使 mod_jk 与 mod_deflate 请求体膨胀兼容(参见下文)。
默认值为 "JK_IGNORE_CL"。
此指令已在 mod_jk 的 1.2.41 版本中添加。

JkLocalAddrIndicator

可用于覆盖转发的本地 IP 地址的 Apache 环境变量名称。仅在需要调整数据时才使用此功能(请参阅代理文档)。
默认值为 "JK_LOCAL_ADDR"。
此指令已在 mod_jk 的 1.2.41 版本中添加。

JkLocalPortIndicator

可用于覆盖转发的本地端口的 Apache 环境变量名称。仅在需要调整数据时才使用此功能(请参阅代理文档)。
默认值为 "JK_LOCAL_PORT"。
此指令已在 mod_jk 的 1.2.28 版本中添加。

JkRemoteHostIndicator

可用于覆盖转发的远程(客户端)主机名的 Apache 环境变量名称。仅在需要调整数据时才使用此功能(请参阅代理文档)。
默认值为 "JK_REMOTE_HOST"。
此指令已在 mod_jk 的 1.2.28 版本中添加。

JkRemoteAddrIndicator

可用于覆盖转发的远程(客户端)IP 地址的 Apache 环境变量名称。仅在需要调整数据时才使用此功能(请参阅代理文档)。
默认值为 "JK_REMOTE_ADDR"。
此指令已在 mod_jk 的 1.2.28 版本中添加。

JkRemotePortIndicator

可用于覆盖转发的远程(客户端)IP 地址的 Apache 环境变量名称。仅在需要调整数据时才使用此功能(请参阅代理文档)。
默认值为 "JK_REMOTE_PORT"。
此指令已在 mod_jk 的 1.2.32 版本中添加。

JkRemoteUserIndicator

可用于覆盖转发的用户名的 Apache 环境变量名称。仅在需要调整数据时才使用此功能(请参阅代理文档)。
默认值为 "JK_REMOTE_USER"。
此指令已在 mod_jk 的 1.2.28 版本中添加。

JkAuthTypeIndicator

可用于覆盖转发的认证类型的 Apache 环境变量名称。仅在需要调整数据时才使用此功能(请参阅代理文档)。
默认值为 "JK_AUTH_TYPE"。
此指令已在 mod_jk 的 1.2.28 版本中添加。

JkOptions

设置一个或多个选项来配置 mod_jk 模块。有关此指令的详细信息,请参阅下文。
此指令每个虚拟服务器可以使用多次。
从 1.2.24 版本开始,默认值为 "ForwardURIProxy"。在 1.2.23 版本中是 "ForwardURICompatUnparsed",在 1.2.22 版本之前是 "ForwardURICompat"。

JkEnvVar

添加一个环境变量的名称和可选默认值,该环境变量应作为请求属性发送到 servlet-engine。如果未明确给出默认值,则该变量只会在运行时设置时发送。
默认值为空,因此不会发送其他变量。
此指令每个虚拟服务器可以使用多次。设置将在全局服务器和任何虚拟服务器之间合并。
您可以在 Tomcat 上通过 request.getAttribute(attributeName) 作为请求属性检索这些变量。请注意,通过 JkEnvVar 发送的变量不会在 request.getAttributeNames() 中列出。
自 1.2.20 版本起支持空默认值。自 1.2.21 版本起引入了不发送具有空默认值和空运行时值的变量的功能。

JkStripSession

如果此指令在某些虚拟服务器中设置为 On,则对于未转发而是由本地服务器处理的 URL,会删除会话 ID ;jsessionid=...
此指令只允许在 VirtualHost 内部使用。
默认值为 Off。
此指令已在 1.2.21 版本中引入。
在 1.2.27 及更高版本中,此指令可以具有可选的会话 ID 标识符。如果未指定,则默认为 ;jsessionid

配置指令类型

我们将在此处讨论 mod_jk 指令类型。

定义 workers

JkWorkersFile 指定 mod_jk 查找 worker 定义的位置。有关详细说明,请参阅Worker 文档

JkWorkersFile     /etc/httpd/conf/workers.properties

日志记录

JkLogFile 指定 mod_jk 将放置其日志文件的位置。

JkLogFile     /var/log/httpd/mod_jk.log

自 JK 1.2.3(适用于 Apache 2.x)和 JK 1.2.16(适用于 Apache 1.3)起,此功能也可用于管道日志记录。

JkLogFile     "|/usr/bin/rotatelogs /var/log/httpd/mod_jk.log 86400"

JkLogLevel 设置日志级别,可在以下级别之间选择

  • info 日志将包含标准的 mod_jk 活动(默认)。
  • warn 日志将包含非致命错误报告。
  • error 日志也将包含错误报告。
  • debug 日志将包含所有 mod_jk 活动信息
  • trace 日志将包含所有 mod_jk 活动的跟踪信息
JkLogLevel    info

info 应该是您正常操作的默认选择。

JkLogStampFormat 将配置 mod_jk 日志文件中的日期/时间格式。有关详细信息,请参阅上文。

JkLogStampFormat "[%Y-%m-%d %H:%M:%S.%Q] "

您可以使用 Apache 标准模块 mod_log_config 记录 mod_jk 信息。该模块在 Apache 备注表中设置了多条备注。它们大多数仅在与负载均衡器 worker 结合使用时才有用。

属性描述
JK_WORKER_NAMEURI 映射选择的 worker 名称
JK_WORKER_TYPEURI 映射选择的 worker 类型
JK_WORKER_ROUTEURI 映射选择的实际 worker 名称(通常是负载均衡器的成员)。
在 1.2.26 版本之前,只有在设置 JkRequestLogFormat 时才可用。
JK_REQUEST_DURATION请求持续时间,以秒和微秒为单位。
在 1.2.26 版本之前,只有在设置 JkRequestLogFormat 时才可用。
JK_LB_FIRST_NAME负载均衡器:尝试的第一个 worker 的名称
JK_LB_FIRST_TYPE负载均衡器:尝试的第一个 worker 的类型
JK_LB_FIRST_ACCESSED负载均衡器:尝试的第一个 worker 的访问计数
JK_LB_FIRST_SESSIONS负载均衡器:尝试的第一个 worker 的会话创建计数
JK_LB_FIRST_READ负载均衡器:尝试的第一个 worker 读取的字节数
JK_LB_FIRST_TRANSFERRED负载均衡器:尝试的第一个 worker 传输的字节数
JK_LB_FIRST_ERRORS负载均衡器:尝试的第一个 worker 的错误计数
JK_LB_FIRST_BUSY负载均衡器:尝试的第一个 worker 的繁忙计数
JK_LB_FIRST_ACTIVATION负载均衡器:尝试的第一个 worker 的激活状态
JK_LB_FIRST_STATE负载均衡器:尝试的第一个 worker 的错误状态
JK_LB_LAST_NAME负载均衡器:尝试的最后一个 worker 的名称
JK_LB_LAST_TYPE负载均衡器:尝试的最后一个 worker 的类型
JK_LB_LAST_ACCESSED负载均衡器:尝试的最后一个 worker 的访问计数
JK_LB_LAST_SESSIONS负载均衡器:尝试的最后一个 worker 的会话创建计数
JK_LB_LAST_READ负载均衡器:尝试的最后一个 worker 读取的字节数
JK_LB_LAST_TRANSFERRED负载均衡器:尝试的最后一个 worker 传输的字节数
JK_LB_LAST_ERRORS负载均衡器:尝试的最后一个 worker 的错误计数
JK_LB_LAST_BUSY负载均衡器:尝试的最后一个 worker 的繁忙计数
JK_LB_LAST_ACTIVATION负载均衡器:尝试的最后一个 worker 的激活状态
JK_LB_LAST_STATE负载均衡器:尝试的最后一个 worker 的错误状态
LogFormat     "%h %l %u %t \"%r\" %>s %b %{JK_WORKER_NAME}n %{JK_LB_FIRST_NAME}n \
               %{JK_LB_FIRST_BUSY}n %{JK_LB_LAST_NAME}n %{JK_LB_LAST_BUSY}n" mod_jk_log
CustomLog     logs/access_log     mod_jk_log

您还可以将请求协议记录在 mod_jk 日志文件中,而不是访问日志中。不推荐这样做,这主要是为了向后兼容的功能。指令 JkRequestLogFormat 将配置此协议的格式。它按每个虚拟主机的基础进行配置和启用。要为虚拟主机启用请求日志记录,只需添加一个 JkRequestLogFormat 配置。格式字符串的语法类似于 Apache LogFormat 命令,以下是可用请求日志格式选项的列表

属性描述
%b发送的字节数,不包括 HTTP 头(CLF 格式)
%B发送的字节数,不包括 HTTP 头
%H请求协议
%m请求方法
%p服务请求的服务器的规范端口
%q查询字符串(如果存在查询字符串,则前缀为 ?,否则为空字符串)
%r请求的第一行
%s请求 HTTP 状态码
%T请求持续时间,处理请求的耗时,以秒 '.' 微秒表示
%U请求的 URL 路径,不包括任何查询字符串。
%v服务请求的服务器的规范 ServerName
%V根据 UseCanonicalName 设置的服务器名称
%wTomcat worker 名称
%R实际 worker 名称
JkRequestLogFormat     "%w %V %T"

转发

指令 JkOptions 允许您设置许多转发选项,这些选项将启用 (+) 或禁用 (-) 后续选项。没有前导符号时,选项将被启用。

以下四个选项 +ForwardURIxxx 互斥。其中必须选择一个,不允许使用负号前缀。从 1.2.24 版本开始,默认值为 "ForwardURIProxy"。在 1.2.23 版本中是 "ForwardURICompatUnparsed",在 1.2.22 版本之前是 "ForwardURICompat"。您可以通过开启其他两个选项中的一个来关闭默认值。除非您有充分的理由更改它,否则应将其保留为默认值。

所有选项都从全局服务器继承到虚拟主机。支持启用(加选项)和禁用(减选项)的选项,按以下方式继承
options(vhost) = plus_options(global) - minus_options(global) + plus_options(vhost) - minus_options(vhost)

使用 JkOptions ForwardURIProxy,转发的 URI 在 Apache 内部处理后和转发到 Tomcat 之前会进行部分重新编码。这将与 mod_rewrite 的本地 URL 操作以及 URL 编码的会话 ID 兼容。

JkOptions     +ForwardURIProxy

使用 JkOptions ForwardURICompatUnparsed,转发的 URI 将保持未解析状态。它符合规范且安全。它将始终转发原始请求 URI,因此使用 mod_rewrite 重写 URI 然后转发重写后的 URI 将不起作用。

JkOptions     +ForwardURICompatUnparsed

使用 JkOptions ForwardURICompat,转发的 URI 将由 Apache 解码。编码字符将被解码,并且像 ".." 这样的显式路径组件将已被解析。这不太符合规范,并且如果您使用前缀 JkMount,则不安全。此选项将允许在转发之前使用 mod_rewrite 重写 URI。

JkOptions     +ForwardURICompat

使用 JkOptions ForwardURIEscaped,转发的 URI 将是 ForwardURICompat 使用的 URI 的编码形式。像 ".." 这样的显式路径组件将已被解析。这不会与 URL 编码的会话 ID 结合使用,但它允许在转发之前使用 mod_rewrite 重写 URI。

JkOptions     +ForwardURIEscaped

JkOptions RejectUnsafeURI 将阻止所有在解码后包含百分号 '%' 或反斜杠 '\' 的 URL。

大多数 Web 应用程序不使用此类 URL。使用 RejectUnsafeURI 选项,您可以阻止几种众所周知的 URL 编码攻击。默认情况下,此选项未设置。

您还可以使用 mod_rewrite 实现此类检查,它更强大但也稍微复杂一些。

JkOptions     +RejectUnsafeURI

JkOptions CollapseSlashesAll 自 1.2.44 版本起已弃用,如果使用将忽略。

JkOptions CollapseSlashesUnmount 自 1.2.44 版本起已弃用,如果使用将忽略。

JkOptions CollapseSlashesNone 自 1.2.44 版本起已弃用,如果使用将忽略。

JkOptions ForwardDirectories 与 Apache 的 DirectoryIndex 指令结合使用。因此,mod_dir 应该对 Apache 可用,无论是静态还是动态(DSO)加载

当配置 DirectoryIndex 时,Apache 将为指令中指定的每个本地 URL 创建子请求,以确定是否存在匹配的本地文件(这是通过 stat 文件来完成的)。

如果 ForwardDirectories 设置为 false(默认),并且 Apache 未找到任何匹配文件,则 Apache 将提供目录内容(如果指令 Options 为该目录指定了 Indexes)或 403 Forbidden 响应(如果指令 Options 未为该目录指定 Indexes)。

如果 ForwardDirectories 设置为 true,并且 Apache 未找到任何匹配文件,则请求将转发到 Tomcat 进行解析。这用于 Apache 因各种原因无法在文件系统上看到索引文件的情况:Tomcat 在不同的机器上运行,JSP 文件已预编译等。

请注意,本地可见文件优先于仅对 Tomcat 可见的文件(即,如果 Apache 可以看到文件,则将提供该文件)。如果 Tomcat 通常提供多种类型的文件(例如 Velocity 页面和 JSP 页面),这一点很重要。

JkOptions     +ForwardDirectories

设置 JkOptions ForwardLocalAddress,您要求 mod_jk 发送 Apache HTTP Server 的本地地址,而不是远程客户端地址。这可以被 Tomcat 远程地址阀用于仅允许来自已配置 Apache 服务器的连接。

JkOptions     +ForwardLocalAddress

设置 JkOptions ForwardPhysicalAddress,您要求 mod_jk 将物理对等 TCP IP 地址作为客户端地址发送。默认情况下,mod_jk 使用 Web 服务器提供的逻辑地址。例如,模块 mod_remoteip 将逻辑 IP 地址设置为代理在 X-Forwarded-For 头中转发的客户端 IP。

JkOptions     +ForwardPhysicalAddress

JkOptions FlushPackets,您要求 mod_jk 在从 Tomcat 接收到每个 AJP 数据包块后刷新 Apache 的连接缓冲区。此选项可能会对 Apache 和 Tomcat 造成严重的性能损失,因为写入操作执行的频率比通常需要的多(即:在每个响应结束时)。

JkOptions     +FlushPackets

JkOptions FlushHeader,您要求 mod_jk 在从 Tomcat 接收到响应头后刷新 Apache 的连接缓冲区。

JkOptions     +FlushHeader

JkOptions DisableReuse,您要求 mod_jk 在连接使用后立即关闭它们。通常 mod_jk 使用持久连接并池化空闲连接,以便在需要向 Tomcat 发送新请求时重用它们。

使用此选项将对 Apache 和 Tomcat 造成严重的性能损失。仅在出现无法解决的网络问题时才将其作为最后手段使用。如果 Apache 和 Tomcat 之间的防火墙悄悄地终止空闲连接,请尝试结合操作系统中适当的 TCP keepalive 值使用 worker 属性 socket_keepalive。

JkOptions     +DisableReuse

JkOptions ForwardKeySize,当使用 ajp13 时,您要求 mod_jk 也转发 Servlet API 2.3 所需的 SSL 密钥大小。当 servlet 引擎是 Tomcat 3.2.x 时(默认开启),不应设置此标志。

JkOptions     +ForwardKeySize

JkOptions ForwardSSLCertChain,当使用 ajp13 时,您要求 mod_jk 转发 SSL 证书链(默认关闭)。Mod_jk 只将 SSL_CLIENT_CERT 传递给 AJP 连接器。对于自签名证书或由根 CA 证书直接签名的证书,这不是问题。然而,有大量由中间 CA 证书签名的证书,这构成了一个重大问题:servlet 将无法自行验证客户端证书。通过 AJP 连接器将 SSL_CLIENT_CERT_CHAIN 传递给 Tomcat 可以修复此错误。
此指令仅在 1.2.22 版本后存在。

JkOptions     +ForwardSSLCertChain

指令 JkEnvVar 允许您将环境变量从 Apache 服务器转发到 Tomcat 引擎。您可以将默认值作为第二个参数添加到指令中。如果未明确给出默认值,则该变量只会在运行时设置时发送。
这些变量可以在 Tomcat 端通过 request.getAttribute(attributeName) 作为请求属性检索。请注意,通过 JkEnvVar 发送的变量不会在 request.getAttributeNames() 中列出。
这些变量从全局服务器继承到虚拟主机。

JkEnvVar     SSL_CLIENT_V_START     undefined

将 URL 分配给 Tomcat

如果您创建了如上所述的 mod_jk.conf-local 的自定义或本地版本,则可以更改 workers 或 URL 前缀等设置。

JkMount 指令将特定的 URL 分配给 Tomcat。通常,JkMount 指令的结构是

JkMount [URL prefix] [Worker name]
# send all requests ending in .jsp to worker1
JkMount /*.jsp worker1
# send all requests ending /servlet to worker1
JkMount /*/servlet/ worker1
# send all requests jsp requests to files located in /otherworker will go worker2
JkMount /otherworker/*.jsp worker2

您可以在 httpd.conf 文件的顶级或 <VirtualHost> 部分中使用 JkMount 指令。

JkUnMount 指令与 JkMount 相反,并阻止对特定 URL 的访问。目的是能够从已挂载的上下文中过滤出特定的内容类型。以下示例挂载 /servlet/* 上下文,但属于该上下文的所有 .gif 文件都不会被提供服务。

# send all requests ending with /servlet to worker1
JkMount /servlet/* worker1
# do not send requests ending with .gif to worker1
JkUnMount /servlet/*.gif worker1

JkUnMount 优先于 JkMount 指令,这意味着 JK 会首先尝试挂载,然后检查是否存在由 JkUnMount 定义的排除项。只有当 JkMount 和 JkUnMount 中的 worker 名称相同时,JkUnMount 才会覆盖 JkMount。

以下示例将阻止所有 .gif 文件,即使它们存在 JkMount

# do not send requests ending with .gif to worker1
JkUnMount /*.gif worker1
# The .gif files will not be mounted cause JkUnMount takes
# precedence over JkMount directive
JkMount /servlet/*.gif worker1

从 JK 的 1.2.26 版本开始,您可以通过在 JkUnMount 中使用星号字符 '*' 作为 worker 名称,将 JkUnMount 应用于任何 worker。JkUnMount worker 名称中不允许使用更复杂的模式。

# Mapping the webapps myapp1 and myapp2:
/myapp1/*=worker1
/myapp2/*=worker2
# Exclude the all subdirectories static for all workers:
!/*/static/*=*
# Exclude some suffixes for all workers:
!*.html=*

JkAutoAlias 指令自动将 webapp 上下文目录别名到 Apache 文档空间。它使 Apache 能够提供静态上下文,而 Tomcat 提供动态上下文。使用此指令是为了方便,这样您就不必为 Tomcat 的 webapp 目录中的每个应用程序目录放置 Apache Alias 指令。出于安全原因,强烈建议默认使用 JkMount 将所有请求传递给 Tomcat,并使用 JkUnMount 明确排除由 Apache 提供的静态内容。还应注意,由 Apache 提供的内容将绕过应用程序 web.xml 中定义的任何安全约束。此指令仅适用于单个路径元素且没有版本标记的简单上下文。它不支持

  • ROOT 上下文(即 .../webapps/ROOT)
  • 多级上下文(例如 .../webapps/foo#bar)
  • 并行部署(例如 .../webapps/foo##v00.05.12)

# enter the full path to the tomcat webapps directory
JkAutoAlias /opt/tomcat/webapps

以下示例展示了如何使用 Tomcat 提供动态上下文,并使用 Apache 提供静态内容。webapps 目录必须对 Apache 可访问。

# enter the full path to the tomcat webapps directory
JkAutoAlias /opt/tomcat/webapps

# Mount 'examples' directory. It's physical location
# is assumed to be in the /opt/tomcat/webapps/examples
# ajp13w is a worker defined in the workers.properties
JkMount /examples/* ajp13w

# Unmount desired static content from examples webapp.
# This content will be served by the Apache directly.
JkUnMount /*.gif ajp13w

请注意,您的 httpd.conf 中每个虚拟主机只能有一个 JkAutoAlias 指令

JkWorkerProperty 是从 JK 1.2.7 版本开始提供的新指令。这是一种方便的方法,用于设置通常在 workers.properties 文件中设置的指令。该指令的参数是 workers.properties 文件中的原始行。

# Just like workers.properties but exact line is prefixed
# with JkWorkerProperty

# Minimal jk configuration
JkWorkerProperty worker.list=ajp13w
JkWorkerProperty worker.ajp13w.type=ajp13
JkWorkerProperty worker.ajp13w.host=localhost
JkWorkerProperty worker.ajp13w.port=8009   

JkMountFile 是从 JK 1.2.9 版本开始提供的新指令。它用于在运行时动态更新挂载点。当挂载文件更改时,JK 将重新加载其内容。

# Load mount points

JkMountFile conf/uriworkermap.properties

如果挂载点 URI 以感叹号 '!' 开头,它将以与 JkUnMount 相同的方式定义一个排除项。如果挂载点 URI 以减号 '-' 开头,则该挂载点将被禁用。通过删除减号并等待 JkMountFile 重新加载,可以重新启用禁用的挂载。排除项可以通过在其前面添加减号来禁用。

# Sample uriworkermap.properties file

/examples/*=ajp13w
# Do not map .gif files
!/*.gif=ajp13w
# Make jsp examples initially disabled  
-/examples/jsp/*=ajp13w

在运行时,您可以更改此文件的内容。例如,删除减号将启用以前禁用的 URI 映射。您可以在运行时添加任意数量的新条目,以反映新部署的应用程序。Apache 将在 60 秒内重新加载文件并更新挂载点。

无法通过动态重新加载删除条目,但您可以禁用或排除映射。

使用 SetHandler 和环境变量

除了 mod_jk 特定的指令之外,您还可以使用 SetHandler 和环境变量来控制哪些请求通过哪个 worker 进行转发。这为您提供了更大的灵活性,但结果可能更难理解。如果您混合使用两种定义转发的方式,通常 mod_jk 指令将优先。

SetHandler jakarta-servlet 强制请求由 mod_jk 处理。您可以在 Location 块中使用 SetHandler,或者在 Apache 2.2 及更高版本中也在 RewriteRule 中使用。

为了使用 SetEnvIfRewriteRule 控制 worker 以实现更复杂的规则,您可以将环境变量 JK_WORKER_NAME 设置为您选择的目标 worker 的名称。这使您能够以更灵活的方式决定选择的 worker,包括对 cookie 值的依赖。此功能已在 mod_jk 的 1.2.19 版本中添加。此外,您可以将规则扩展附加到 worker 名称。扩展名与 worker 名称之间用分号 ";" 分隔,使用的语法与 uriworkermap.properties 文件中相同。在 worker 名称中支持规则扩展已在 1.2.33 版本中添加。

为了使用除 JK_WORKER_NAME 之外的其他变量,您可以通过 JkWorkerIndicator 指令设置此变量的名称。

您还可以通过设置环境变量 no-jk 来定义 mod_jk 转发的排除项。

# Automatically map all encoded urls
<Location *;jsessionid=>
  SetHandler jakarta-servlet
  SetEnv JK_WORKER_NAME my_worker
</Location>

# Map all subdirs to workers via naming rule
# and exclude static content.
<Location /apps/>
  SetHandler jakarta-servlet
  SetEnvIf REQUEST_URI ^/apps/([^/]*)/ JK_WORKER_NAME=$1
  SetEnvIf REQUEST_URI ^/apps/([^/]*)/static no-jk
</Location>

高级环境变量

环境变量允许根据请求属性(例如请求 URI、头值或 cookie)覆盖 mod_jk 的默认行为。这可以使用 SetEnvIfRewriteRule 指令来完成。

环境变量 JK_ROUTE 可以设置来明确选择负载均衡器 worker 的一个成员。该值必须等于成员的路由属性,如果未使用该属性,则等于成员名称。请注意,只有当会话 ID 和路由在请求中以非标准方式编码时才需要此功能。默认情况下支持使用符合 Java Servlet 规范的方式编码 ID 的粘性会话。此功能自 1.2.33 版本起可用。

环境变量 JK_REPLY_TIMEOUT 可以设置来动态定义回复超时。该值必须以毫秒为单位。此功能自 1.2.27 版本起可用。

环境变量 JK_STICKY_IGNORE 可以设置来禁用单个请求的会话粘性。如果变量设置为空字符串或非零数字,会话粘性将被禁用。将其设置为 0 将重置为 worker 配置定义的行为。此功能自 1.2.33 版本起可用。

当使用基于 cookie 的会话粘性时,此功能有助于优化负载均衡。在这种情况下,只要用户保持浏览器打开,即使他离开了使用会话的应用程序部分,由启动会话的用户发出的任何请求都将发送到相同的 Tomcat 实例。例如,当用户请求登录表单时,您可以设置此环境变量,以确保此初始会话请求以非粘性方式进行负载均衡。

环境变量 JK_STATELESS 可用于改进基于会话的均衡方法 SessionNext 的负载均衡。在这种情况下,通常任何不带会话 ID 的请求都会被视为新会话。如果例如在没有会话 ID 的情况下检索静态内容,这可能会有问题。如果您为请求设置环境变量 JK_STATELESS,则即使该请求不带会话 ID,也不会被视为新会话。此功能自 1.2.33 版本起可用。

环境变量 JK_IGNORE_CL 可以设置来强制忽略请求的 Content-Length 头(如果存在)。然后 mod_jk 将流式传输请求体,直到 Web 服务器指示已读取完整体。不会向后端发送 Content-Length 头。此功能自 1.2.41 版本起可用。

此功能可用于使 mod_jk 与更改请求体大小的过滤器兼容。其中一个过滤器是 mod_deflate,当用于膨胀带有 gzip 编码体的请求体时。在这种情况下,mod_jk 默认会转发一个被截断的请求体,因为它从 Web 服务器获取了错误的请求体大小。指示 mod_jk 忽略 Content-Length 头将导致将其可以从 Web 服务器读取的所有请求体数据流式传输到后端。

您应该只为实际需要 JK_IGNORE_CL 环境变量的请求设置它。不幸的是,mod_jk 无法自动检测到此需求。