为 Microsoft IIS 配置 ISAPI 重定向器

要求

Tomcat 重定向器需要三个实体

  • isapi_redirect.dll - IIS ISAPI 重定向器插件,可获取预构建的 DLL 或自行构建(参见构建部分)。
  • workers.properties - 描述 worker(Tomcat 进程)使用的主机和端口的文件。示例 workers.properties 可以在 conf 目录下找到。
  • uriworkermap.properties - 将 URL 路径模式映射到 worker 的文件。示例 uriworkermap.properties 也可以在 conf 目录下找到。

安装包括以下部分

  • 配置带有默认 /examples 上下文的 ISAPI 重定向器,并检查您是否可以使用 IIS 提供 Servlet 服务。
  • 向配置中添加更多上下文。

请注意,在 64 位环境下,至少对于 IIS 7,所使用的 IIS 应用程序池应将“启用 32 位应用程序”设置为“False”。否则重定向器将不会被调用并返回 HTTP 404 错误。如果您认为 32 位版本的 isapi_redirect.dll 可以替代完成工作,您将得到 HTTP 500 错误,因为该库无法加载到 64 位 IIS 中。

注册表设置

ISAPI 重定向器从注册表读取配置,创建一个名为

"HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0"

下面描述为“表示布尔值的字符串值”的属性可以使用数字 0 (false) 和 1 (true) 作为值,或者 off (false) 和 on (true),或者任何以字母 f (false)、n (false)、t (true) 或 y (true) 开头的其他字符串进行设置。这些值不区分大小写。在此文档中,我们将坚持使用 falsetrue

属性描述
extension_uri

指向 ISAPI 扩展 /jakarta/isapi_redirect.dll 的字符串值

log_file

指向将创建日志文件的位置的值。(例如 c:\tomcat\logs\isapi.log
如果指定了任一日志轮换设置(log_rotationtimelog_filesize),则实际的日志文件名将基于此设置。如果日志文件名包含任何 '%' 字符,则将其视为 strftime(3) 的格式字符串,例如 c:\tomcat\logs\isapi-%Y-%m-%d-%H_%M_%S.log。否则,会自动添加后缀 .nnnnnnnnnn,表示时间(秒)。完整的格式字符串替换列表可在 Apache rotatelogs 文档中找到。

log_level

日志级别的字符串值(可以是 debug、info、warn、error 或 trace)。

此指令在版本 1.2.31 中添加

log_rotationtime

日志文件轮换之间的时间间隔(秒)。设置为 0(默认值)会禁用基于时间的日志轮换。

此指令在版本 1.2.31 中添加

log_filesize

日志文件的最大大小(兆字节),达到该大小后日志文件将进行轮换。设置为 0(默认值)会禁用基于文件大小的日志轮换。
该值可以带可选的 M 后缀,即 55M 都将在日志文件增长到 5MB 时进行轮换。
如果指定了 log_rotationtime,则此设置将被忽略。

worker_file

workers.properties 文件的完整路径的字符串值(例如 c:\tomcat\conf\workers.properties

worker_mount_file

uriworkermap.properties 文件的完整路径的字符串值(例如 c:\tomcat\conf\uriworkermap.properties

rewrite_rule_file

rewrite.properties 文件的完整路径的字符串值(例如 c:\tomcat\conf\rewrite.properties

request_id_header

一个字符串值,表示从中提取请求 ID 的请求头名称,该请求 ID 是每行日志的一部分。

此指令已在版本 1.2.49 中添加

shm_size

共享内存的 DWORD 值大小。将此值设置为所有已定义 worker 数量 * 400。(仅当您有超过 64 个 worker 时才设置此值)

此指令已在版本 1.2.20 中添加

从版本 1.2.27 开始,即使 worker 数量很大,共享内存的大小也会自动确定。此属性不再需要。

worker_mount_reload

一个 DWORD 值,指定重新加载 worker_mount_file 的时间(秒)。

此指令已在版本 1.2.20 中添加

strip_session

表示布尔值的字符串值。如果设置为 true,则如果 URL 的会话后缀形式为 ";jsessionid=..." 且由 Web 服务器本地提供服务,则该后缀会被从 URL 中移除。

默认值为 false。

此指令已在版本 1.2.21 中添加

auth_complete

表示“0”或“1”的 DWORD 值。这对于解决与 IIS 5.1 的轻微不兼容性是必需的。

默认值为 1,表示我们使用 SF_NOTIFY_AUTH_COMPLETE 事件。如果将其设置为 0,则我们使用 SF_NOTIFY_PREPROC_HEADERS。IIS 5.1 在处理使用 PUT HTTP 方法的请求时可能需要此设置。

此指令已在版本 1.2.21 中添加

uri_select

一个字符串值,它影响 IIS 和 Tomcat 之间 URI 的解码和重新编码方式。除非有充分理由,否则您应保留其默认值。

如果值为“parsed”,则转发的 URI 将被解码,并且显式路径组件(如“..”)将已解析。这不符合规范,并且如果您使用前缀转发规则,则不安全

如果值为“unparsed”,则转发的 URI 将是原始请求 URI。它符合规范,也是最安全的选择。重写 URI 然后转发重写后的 URI 将不起作用。

如果值为“escaped”,则转发的 URI 将是“parsed”使用的 URI 的重新编码形式。显式路径组件(如“..”)将已解析。这与 URL 编码的会话 ID 结合使用将不起作用。

如果值为“proxy”,则转发的 URI 将是“parsed”使用的 URI 的部分重新编码形式。显式路径组件(如“..”)将已解析,并且有问题的内容会被重新编码。

自版本 1.2.24 起的默认值为“proxy”。之前是“parsed”。

reject_unsafe

表示布尔值的字符串值。如果设置为 true,则在解码后仍包含百分号 '%' 或反斜杠 '\' 的 URL 将被拒绝。

大多数 Web 应用程序不使用此类 URL。通过启用 reject_unsafe,您可以阻止几种众所周知的 URL 编码攻击。

默认值为 false。

此指令已在版本 1.2.24 中添加

collapse_slashes

此选项自 1.2.44 版本起已弃用,如果使用将忽略。

在 1.2.41 版本之前从未进行折叠。从 1.2.41 版本开始,在查找卸载匹配之前进行折叠是默认设置,以防止轻松绕过卸载规则。从 1.2.44 版本开始,在查找安装或卸载规则之前始终执行折叠。

此指令已在版本 1.2.41 中添加

watchdog_interval

一个 DWORD 值,表示看门狗线程间隔(秒)。Worker 由一个每 watchdog_interval 秒定期运行的后台线程进行维护。Worker 维护会检查空闲连接,纠正负载状态,并能够检测后端健康状态。

只有自上次维护以来至少过去了 worker.maintain 秒,才会进行维护。因此,将 watchdog_interval 设置得远小于 worker.maintain 是没有用的。

默认值为 0 秒,这意味着不会创建看门狗线程,维护将与正常请求结合进行。

此指令已在版本 1.2.27 中添加

error_page

当后端返回非 200 响应时,表示错误页面 URL 重定向的字符串值。此指令可用于自定义从后端服务器返回的错误消息。

URL 必须指向一个有效的服务器 URL,并且可以包含格式字符串数字 (%d),用于按错误编号分离页面。在这种情况下,重定向 URL 的格式是通过将 error_page 中的 %d 替换为返回的错误编号来完成的。

此指令已在版本 1.2.27 中添加

enable_chunked_encoding

一个表示布尔值的字符串值。如果设置为 true,则服务器支持分块编码。

默认值为 false。

此指令已在版本 1.2.27 中添加。直到版本 1.2.30,它都被认为是实验性的,并且仅在使用了包含分块支持的特殊构建时才可用。从 1.2.30 开始,它不再被认为是实验性的。

flush_packets

一个表示布尔值的字符串值。如果设置为 true,则每当接收到 AJP 数据包时,数据都会立即刷新到客户端。否则,IIS 会缓冲数据,并且只有当缓冲区已满或响应完成时才写入客户端。

默认值为 false。

此指令已在版本 1.2.42 中添加

使用属性文件进行配置

ISAPI 重定向器可以从属性文件而非注册表读取其配置。这使得您可以在同一台服务器上使用多个具有独立配置的 ISAPI 重定向器。重定向器将在初始化期间检查属性文件,如果存在,则优先使用它而不是注册表。

在 ISAPI 重定向器所在的同一目录下创建一个名为 isapi_redirect.properties 的属性文件,即与 ISAPI 重定向器 DLL 同名但扩展名为 .properties。示例 isapi_redirect.properties 可以在 conf 目录下找到。

属性文件中的属性名称和值与上述注册表设置相同。例如

# Configuration file for the Tomcat ISAPI Redirector

# The path to the ISAPI Redirector Extension, relative to the website
# This must be in a virtual directory with execute privileges
extension_uri=/jakarta/isapi_redirect.dll

# Full path to the log file for the ISAPI Redirector
log_file=c:\tomcat\logs\isapi_redirect.log

# Log level (debug, info, warn, error or trace)
log_level=info

# Full path to the workers.properties file
worker_file=c:\tomcat\conf\workers.properties

# Full path to the uriworkermap.properties file
worker_mount_file=c:\tomcat\conf\uriworkermap.properties

注释

  • 反斜杠 - '\' - 不是转义字符。
  • 注释行以 '#' 开头。

从 1.2.27 版本开始,会自动将两个环境变量添加到环境中,这些变量可以在 .properties 文件中使用。

  • JKISAPI_PATH - ISAPI 重定向器的完整路径。
  • JKISAPI_NAME - 不带扩展名的 ISAPI 重定向器 DLL 名称

# Use the logs in the installation path of ISAPI Redirector
log_file=$(JKISAPI_PATH)\$(JKISAPI_NAME).log

日志文件轮换

版本 1.2.31 的 ISAPI 重定向器可以执行日志轮换,其配置和行为类似于 Apache HTTP Server 提供的 rotatelogs 程序。

要配置日志轮换,请配置 log_filelog_rotationtimelog_filesize 选项之一。如果两者都指定,则 log_rotationtime 将优先,log_filesize 将被忽略。
例如,要配置日志文件每日轮换

# Configuration file for the Tomcat ISAPI Redirector
...

# Full path to the log file for the ISAPI Redirector
log_file=c:\tomcat\logs\isapi_redirect.%Y-%m-%d.log

# Log level (debug, info, warn, error or trace)
log_level=info

# Rotate the log file every day
log_rotationtime=86400

...

或者配置日志文件达到 5MB 时进行轮换

# Configuration file for the Tomcat ISAPI Redirector
...

# Full path to the log file for the ISAPI Redirector
log_file=c:\tomcat\logs\isapi_redirect.%Y-%m-%d-%H.log

# Log level (debug, info, warn, error or trace)
log_level=info

# Rotate the log file at 5 MB
log_filesize=5M

...

只要达到配置的限制,日志就会轮换,但前提是日志文件名会改变。如果您配置的日志文件名中包含 strftime(3) 格式代码,请确保它指定的粒度与配置的轮换时间相同,例如,如果每日轮换 (log_rotationtime=86400),则使用 %Y-%m-%d
更多示例请参阅 rotatelogs 文档。

使用简单的重写规则

版本 1.2.16 的 ISAPI 重定向器可以执行简单的 URL 重写。尽管不如 Apache HTTP Server 的 mod_rewrite 强大,但它允许请求 URI 的简单交换。

规则的形式是 original-url-prefix=forward-url-prefix。例如

# Simple rewrite rules, making examples
# available under shorter URLs
/jsp/=/examples/jsp/
/servlets/=/examples/servlets/

您也可以使用正则表达式,如果规则以波浪号 ~ 为前缀。

# Complex rewrite rule, prefixing "/examples/"
# to the first path component of all requests
~/([^/]*)=/examples/$1

请注意,uriworkermap.properties 必须使用重写前的 URL。