为 Microsoft IIS 配置 ISAPI 重定向器
要求
Tomcat 重定向器需要三个实体
-
isapi_redirect.dll - IIS ISAPI 重定向器插件,获取预构建的 DLL 或自行构建(请参阅构建部分)。
-
workers.properties - 描述工作程序(Tomcat 进程)使用的主机和端口的文件。可以在 conf 目录下找到示例 workers.properties。
-
uriworkermap.properties - 将 URL 路径模式映射到工作程序的文件。也可以在 conf 目录下找到示例 uriworkermap.properties。
安装包括以下部分
-
使用默认 /examples 上下文配置 ISAPI 重定向器,并检查是否可以使用 IIS 提供 servlet。
-
向配置中添加更多上下文。
请注意,在 64 位环境中 - 至少对于 IIS 7 - 所使用的 IIS 应用程序池应将“启用 32 位应用程序”设置为“否”。否则,将不会调用重定向器并返回 http 代码 404。如果您认为 isapi_redirect.dll 的 32 位版本可以完成这项工作,那么您将收到 http 代码 500,因为无法将该库加载到 64 位 IIS 中。
注册表设置
ISAPI 重定向器从注册表读取配置,创建一个名为
"HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0"
下面描述为“表示布尔值的字符串值”的属性可以使用数字 0(假)和 1(真)作为值,或 off(假)和 on(真)或任何其他以字母 f(假)、n(假)、t(真)或 y(真)开头的字符串来设置。值不区分大小写。在本说明中,我们将坚持使用 false 和 true。
属性
|
说明
|
---|
extension_uri |
指向 ISAPI 扩展 /jakarta/isapi_redirect.dll 的字符串值
|
日志文件 |
指向将创建日志文件的位置的值。(例如 c:\tomcat\logs\isapi.log)
如果指定了其中一个日志轮换设置(log_rotationtime 或 log_filesize),则实际日志文件名将基于此设置。如果日志文件名包含任何“%”字符,则将其视为 strftime(3) 的格式字符串,例如 c:\tomcat\logs\isapi-%Y-%m-%d-%H_%M_%S.log。否则,将自动添加后缀 .nnnnnnnnnn,表示时间(以秒为单位)。可以在 Apache rotatelogs 文档 中找到格式字符串替换的完整列表。
|
日志级别 |
日志级别的字符串值(可以是 debug、info、warn、error 或 trace)。
此指令已在 1.2.31 版中添加。
|
日志轮换时间 |
日志文件轮换之间的时间(以秒为单位)。将其设置为 0(默认值)将禁用基于时间的日志轮换。
此指令已在 1.2.31 版中添加。
|
日志文件大小 |
日志文件的最大大小(以兆字节为单位),达到此大小后日志文件将轮换。将其设置为 0(默认值)将禁用基于文件大小的日志轮换。
该值可以有一个可选的 M 后缀,即 5 和 5M 在日志文件增长到 5MB 时都会轮换日志文件。
如果指定了 log_rotationtime,则将忽略此设置。
|
工作程序文件 |
workers.properties 文件的完整路径的字符串值(例如 c:\tomcat\conf\workers.properties)
|
工作程序装入文件 |
uriworkermap.properties 文件的完整路径的字符串值(例如 c:\tomcat\conf\uriworkermap.properties)
|
重写规则文件 |
rewrite.properties 文件的完整路径的字符串值(例如 c:\tomcat\conf\rewrite.properties)
|
请求 ID 标头 |
请求标头的名称,将从中提取请求 ID,该 ID 是每行日志的一部分。
此指令已在 1.2.49 版中添加。
|
共享内存大小 |
共享内存的 DWORD 值大小。将此值设置为所有已定义工作程序 * 400 的数量。(仅当您有 超过 64 个工作程序时才设置此值)
此指令已在 1.2.20 版中添加。
从 1.2.27 版本开始,即使对于大量的 worker,共享内存的大小也会自动确定。不再需要此属性。
|
worker_mount_reload |
指定 worker_mount_file 将被重新加载的时间(以秒为单位)的 DWORD 值。
此指令已在 1.2.20 版中添加。
|
strip_session |
表示布尔值的字符串值。如果将其设置为 true,则如果 URL 由 Web 服务器在本地提供,则会剥离形式为“;jsessionid=...”的 URL 会话后缀。
默认值为 false。
此指令已在 1.2.21 版本中添加
|
auth_complete |
表示“0”或“1”的 DWORD 值。由于与 IIS 5.1 存在轻微的不兼容性,因此需要此值。
默认情况下,其值为 1,这意味着我们使用 SF_NOTIFY_AUTH_COMPLETE 事件。如果将其设置为 0,则我们使用 SF_NOTIFY_PREPROC_HEADERS。在使用 PUT HTTP 方法处理请求时,IIS 5.1 可能需要此值。
此指令已在 1.2.21 版本中添加
|
uri_select |
一个字符串值,它影响 URI 在 IIS 和 Tomcat 之间如何解码和重新编码。除非你有充分的理由更改它,否则应将其保留为默认值。
如果值为“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 值,表示看门狗线程间隔(以秒为单位)。后台线程每隔 watchdog_interval 秒定期运行一次,以定期维护工作进程。工作进程维护检查空闲连接、更正负载状态并能够检测后端运行状况状态。
仅在自上次维护以来至少经过 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。可以在 conf 目录下找到一个示例 isapi_redirect.properties。
属性文件中的属性名称和值与上面描述的注册表设置相同。例如
# 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_file,以及 log_rotationtime 或 log_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。