Apache HTTP 服务器 HowTo

简介

本文档介绍如何将 Tomcat 连接到流行的开源 Web 服务器 Apache HTTP Server。您可以使用连接模块 mod_jk 与任何支持的 Apache 版本和任何支持的 Tomcat 版本一起使用。

建议您还阅读 Workers HowTo 文档,了解如何在 Web 服务器和 Tomcat 引擎之间设置工作实体。有关更详细的配置信息,请参阅 workers.propertiesuriworkermapApache 的参考指南。

警告:如果 Apache 和 Tomcat 配置为从同一个文件系统位置提供内容,则必须注意确保 Apache 无法提供不适当的内容,例如 WEB-INF 目录的内容或 JSP 源代码。 这种情况可能发生在 Apache DocumentRoot 与 Tomcat Host 的 appBase 或任何 Context 的 docBase 重叠时。当使用 Apache Alias 指令与 Tomcat Host 的 appBase 或任何 Context 的 docBase 时,也可能发生这种情况。

本文档最初是 Gal Shachor 编写的 Tomcat:最小用户指南 的一部分,但出于组织原因已拆分出来。

文档约定和假设

${tomcat_home} 是 tomcat 的根目录。您的 Tomcat 安装应该具有以下子目录

  • ${tomcat_home}\conf - 您可以放置各种配置文件的位置
  • ${tomcat_home}\webapps - 包含示例应用程序
  • ${tomcat_home}\bin - 您放置 Web 服务器插件的位置

在本文档的所有示例中,${tomcat_home} 将为 /var/tomcat3。一个 worker 被定义为一个接受来自 Apache 服务器工作的 Tomcat 进程。

支持的配置

mod_jk 模块支持

  • 所有当前支持的 Apache Web 服务器 (httpd) 版本
  • Apache Web 服务器支持的任何操作系统
  • 所有当前支持的 Tomcat 版本

mod_jk 模块可能与较旧的、不支持的 Apache Web 服务器和/或 Tomcat 版本一起使用,但此类配置不受支持。

AJP 协议?

mod_jk 模块使用 AJP 协议将请求发送到 Tomcat 容器。使用的 AJP 版本为 ajp13。所有当前版本的 Tomcat 都支持 ajp13 协议。其他 servlet 引擎,如 JettyJBoss,也支持 ajp13 协议。

ajp12 协议已被弃用,您不应该再使用它。ajp14 协议被认为是实验性的。

它是如何工作的?

简而言之,Web 服务器正在等待客户端 HTTP 请求。当这些请求到达时,服务器会执行任何必要的操作来通过提供必要的内容来服务这些请求。

添加 servlet 容器可能会稍微改变这种行为。现在,Web 服务器还需要执行以下操作

  • 加载 servlet 容器适配器库并初始化它(在服务请求之前)。
  • 当请求到达时,它需要检查并查看某个请求是否属于 servlet,如果是,它需要让适配器接收请求并处理它。

另一方面,适配器需要知道它将要服务哪些请求,通常基于请求 URL 中的某种模式,以及将这些请求定向到哪里。

当用户想要设置使用虚拟主机的配置,或者当他们希望多个开发人员在同一个 Web 服务器上但不同的 servlet 容器 JVM 上工作时,事情会变得更加复杂。我们将在高级部分介绍这两个案例。

获取 mod_jk

mod_jk 可以以两种格式获得 - 二进制和源代码。根据您运行 Web 服务器的平台,可能提供 mod_jk 的二进制版本。

建议使用二进制版本(如果可用)。如果二进制版本不可用,请按照下面“构建 mod_jk”部分中给出的说明从源代码构建 mod_jk。mod_jk 源代码可以从镜像 这里 下载。

mod_jk 的二进制文件现在可用于多个平台。二进制文件位于按平台划分的子目录中。

对于某些平台(如 Windows),这是获取 mod_jk 的典型方式,因为大多数 Windows 系统没有 C 编译器。

对于其他平台,mod_jk 的二进制发行版提供了更简单的安装。

例如,JK 1.2.x 可以从镜像 这里 下载(查找 JK 1.2 二进制发行版)。“JK 1.2 二进制发行版”链接包含适用于 Apache 1.3 和 Apache 2.x 的各种操作系统的二进制版本。

安装

mod_jk 需要两个实体

  • mod_jk.xxx - Apache HTTP 服务器模块,根据您的操作系统,它将是 mod_jk.so、mod_jk.nlm 或 MOD_JK.SRVPGM(参见构建部分)。
  • workers.properties - 描述工作者(Tomcat 进程)使用的主机和端口的文件。在源代码下载的 conf 目录下可以找到一个示例 workers.properties 文件。

此外,与其他 Apache 模块一样,mod_jk 应该首先安装在 Apache HTTP 服务器的模块目录中,例如:/usr/lib/apache,并且您应该更新您的 httpd.conf 文件。

禁用旧的 mod_jserv

如果您之前已将 Apache 配置为使用 mod_jserv,请从您的 httpd.conf 中删除所有 ApJServMount 指令。

如果您包含 tomcat-apache.conftomcat.conf,您也需要将其删除 - 它们是特定于 mod_jserv 的。

mod_jserv 配置指令与 mod_jk 不兼容!

使用 Tomcat 自动配置

Tomcat 自动配置已弃用,并在 Tomcat 7 及更高版本中被删除。

自动配置仅适用于在 Apache HTTP 服务器运行的同一台机器上运行的单个 Tomcat。将 Apache HTTP 服务器配置为使用 mod_jk 的最简单方法是在 Tomcat 中打开 Apache HTTP 服务器自动配置设置,并在 Apache httpd.conf 文件的末尾添加以下包含指令(确保将 $TOMCAT_HOME 替换为 Tomcat 安装的正确路径)

# To be added at the end of your httpd.conf
Include $TOMCAT_HOME/conf/jk/mod_jk.conf-auto

注意:此文件也可能生成为 $TOMCAT_HOME/conf/auto/mod_jk.conf

这将告诉 Apache HTTP 服务器使用 Apache 配置中的 mod_jk.conf-auto 文件中的指令。通过在 $TOMCAT_HOME/conf/jk/workers.properties 中创建您的 workers.properties 文件并在 server.xml 文件中将侦听器添加到 Engine 元素(如以下示例所示)来启用 Apache 自动配置,从而创建此文件。请注意,此示例特定于 Tomcat 5.x,与本文档其他部分不同,其他部分也适用于之前的 Tomcat 分支。

...
<Engine ...>
  ...
    <Listener className="org.apache.jk.config.ApacheConfig" modJk="/path/to/mod_jk.so" />
  ...
</Engine>
...

然后重启 Tomcat,mod_jk.conf 应该会生成。有关此主题的更多信息,请参阅 Tomcat 文档网站 上的 API 文档。

自定义 mod_jk 配置

您应该在以下情况下使用自定义配置

  • 您无法使用 mod_jk.conf-auto,因为 Tomcat 引擎不在与您的 Apache Web 服务器相同的机器上,例如,当您在 Tomcat 集群前面有一个 Apache 时。
  • 自定义配置的另一种情况是,当您的 Apache 在许多不同的 Tomcat 引擎前面,每个引擎都有自己的配置,这是 ISP 托管中的一个普遍情况。
  • 此外,大多数 Apache Web 管理员会保留自定义配置,以便能够根据自己的实际需求调整设置。

简单配置示例

这是一个简单的配置

# Load mod_jk module
LoadModule    jk_module  modules/mod_jk.so
# Add the module (activate this lne for Apache 1.3)
# AddModule     mod_jk.c
# Where to find workers.properties
JkWorkersFile /etc/httpd/conf/workers.properties
# Where to put jk shared memory
JkShmFile     /var/log/httpd/mod_jk.shm
# Where to put jk logs
JkLogFile     /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel    info
# Send requests for context /examples to worker named worker1
JkMount  /examples/* worker1

mod_jk 指令

我们将在这里讨论 mod_jk 指令及其背后的细节

定义工作者

JkWorkersFile 指定 mod_jk 将在其中查找工作者定义的位置。

JkWorkersFile     /etc/httpd/conf/workers.properties

日志记录

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

JkLogFile     /var/log/httpd/mod_jk.log

自 Apache 2.x 的 JK 1.2.3 和 Apache 1.3 的 JK 1.2.16 以来,这也可以用于管道日志记录

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

JkLogLevel 设置日志级别,介于

  • info 日志将包含标准 mod_jk 活动(默认)。
  • error 日志还将包含错误报告。
  • debug 日志将包含有关 mod_jk 活动的所有信息
JkLogLevel    info

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

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

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

您可以使用 Apache 标准模块 mod_log_config 记录 mod_jk 信息。该模块在 Apache notes 表中设置了几个 notes。其中大多数仅在与负载均衡器工作者结合使用时才有用。有关详细信息,请参阅 mod_jk Apache HTTP Server 参考

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 将配置此协议的格式。它在每个虚拟主机基础上进行配置和启用。有关详细信息,请参阅 mod_jk Apache HTTP Server 参考

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 服务器的本地地址,而不是远程客户端地址。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 之间的防火墙静默地杀死了空闲连接,请尝试使用 worker 属性 socket_keepalive 并结合操作系统中适当的 TCP keepalive 值。

JkOptions     +DisableReuse

JkOptions ForwardKeySize,您要求 mod_jk 在使用 ajp13 时,也转发 SSL 密钥大小,如 Servlet API 2.3 所需。当 servlet 引擎为 Tomcat 3.2.x 时,不应设置此标志(默认情况下关闭)。

JkOptions     +ForwardKeySize

JkOptions ForwardSSLCertChain,您要求 mod_jk 在使用 ajp13 时,转发 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(如上所述),您可以更改设置,例如 worker 或 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 指令。

配置 Apache 以提供静态 Web 应用程序文件

如果 Tomcat Host appBase(webapps)目录可供 Apache HTTP 服务器访问,则可以配置 Apache 以提供 Web 应用程序上下文目录的静态文件,而不是将请求传递给 Tomcat。

注意:出于安全原因,强烈建议默认情况下使用 JkMount 将所有请求传递给 Tomcat,并使用 JkUnMount 明确排除由 Apache 提供的静态内容。还应注意,由 Apache 提供的内容将绕过应用程序 web.xml 中定义的任何安全约束。

使用 Apache 的 Alias 指令将单个 Web 应用程序上下文目录映射到 VirtualHost 的 Apache 文档空间中

# Static files in the examples webapp are served by Apache
Alias /examples /vat/tomcat3/webapps/examples
# All requests go to worker1 by default
JkMount /* worker1
# Serve html, jpg and gif using Apache
JkUnMount /*.html worker1
JkUnMount /*.jpg  worker1
JkUnMount /*.gif  worker1

从 Apache 2.x 的 mod_jk 1.2.6 和 Apache 1.3 的 1.2.19 开始,可以通过设置 env var no-jk 来排除某些 URL/URI 的 jk 处理,例如使用 SetEnvIf 指令。

您可以使用 no-jk env var 来解决 mod_alias 或 mod_userdir 指令在 jk 和 alias/userdir URL 匹配时出现的问题。

# All URL goes to tomcat except the one containing /home
<VirtualHost *:80>
    ServerName testxxx.mysys
    DocumentRoot /www/testxxx/htdocs

# Use SetEnvIf to set no-jk when /home/ is encountered
    SetEnvIf Request_URI "/home/*" no-jk

# Now /home will goes to /home/dataxxx/
    Alias /home /home/dataxxx/

    <Directory "/home/dataxxx">
        Options Indexes MultiViews
        AllowOverride None
        Require all granted
    </Directory>

    JkMount /* myssys-xxx

</VirtualHost>

使用 mod_jk JkAutoAlias 指令将所有 Web 应用程序上下文目录映射到 Apache 的文档空间中。

尝试访问 Web 应用程序上下文中的 WEB-INF 或 META-INF 目录或 Tomcat Host appBase(webapps)目录中的 Web 存档 *.war 将失败,并显示 HTTP 403,禁止访问

# Static files in all Tomcat webapp context directories are served by Apache
JkAutoAlias /var/tomcat3/webapps

# All requests go to worker1 by default
JkMount /* ajp13
# Serve html, jpg and gif using Apache
JkUnMount /*.html ajp13
JkUnMount /*.jpg  ajp13
JkUnMount /*.gif  ajp13

如果您对所有 URL 进行编码以包含会话 ID(;jsessionid=...),并且您后来决定要将部分内容移动到 Apache,则可以告诉 mod_jk 从那些未通过 mod_jk 转发的请求的 URL 中剥离所有会话 ID。

您可以通过将 JkStripSession 设置为 On 来启用此功能。可以为虚拟服务器单独启用它。默认值为 Off。

在 Unix 上构建 mod_jk

mod_jk 构建使用广泛使用的配置系统。

从 subversion 准备您的 mod_jk 配置

如果您从 subversion 获取源代码,即没有现有的 configure 脚本,则应该有用于配置和安装的 autoconf。

要创建 mod_jk autoconf 脚本,您需要 libtool 1.5.2、automake 1.10 和 autoconf 2.59 或更高版本。鼓励使用更新的版本,例如,为了可靠地检测最近版本的 операционной системы 的功能。

如果您只是使用从 apache.org 下载的软件包,则不需要这些工具,它们仅供开发人员使用。

要创建 configure 脚本,只需键入: ./buildconf.sh

使用 configure 构建 mod_jk

以下是使用 configure 准备 mod_jk 构建的步骤,只需输入以下命令:

./configure [autoconf arguments] [mod_jk arguments]

您可以设置 **CFLAGS** 和 **LDFLAGS** 来添加一些平台特定的配置

LDFLAGS=-lc ./configure -with-apxs=/home2/local/apache/bin/apxs

如果您想为不同版本的 Apache HTTP Server 构建 mod_jk,例如 1.3 或 2.x,则需要为每个版本执行完整的构建过程。请注意,Apache 2.0、2.2 或 2.4 模块**不**兼容。您必须使用您计划运行的 Apache 版本编译模块。用于 mod_jk 构建的目录对于所有 2.x 版本都是 "apache-2.0"。源代码与 Apache HTTP Server 2.0、2.2 和 2.4 兼容。

  • 使用 configure 并指定正确的 Apache HTTP Server apxs 位置(--with-apxs)
  • 使用 make
  • 将生成的 mod_jk.so 二进制文件从 apache-1.3 或 apache-2.0 子目录复制到 Apache HTTP Server 模块位置。
  • make clean(删除所有先前编译的 object 文件)
  • 使用下一个 Apache HTTP Server 版本的 apxs 位置重新开始。

configure 参数

Apache 相关参数
--with-apxs[=FILE] FILE 是 apxs 工具的位置。默认情况下,它会在 PATH 中查找 apxs。它会构建一个共享的 Apache 模块。它会自动检测 Apache 版本。(2.x 和 1.3)
--with-apache=DIR DIR 是 Apache 源代码所在路径。在配置 mod_jk 之前,应该先配置 Apache 源代码。DIR 类似于:/home/apache/apache_1.3.19 它会构建一个静态的 Apache 模块。
--enable-EAPI 当使用 Apache-1.3 和 mod_ssl 时,需要此参数,否则在 Apache 中加载 mod_jk.so 时会收到错误消息:"this module might crash under EAPI!"。当使用 --with-apxs 时,不需要此参数。
--enable-prefork 如果您为多线程 Apache HTTP Server 2.x MPM(多进程模块)构建 mod_jk,则 mod_jk 代码的某些区域需要同步才能使其线程安全。由于 configure 无法轻松检测您是否正在使用多线程 MPM,因此默认情况下,mod_jk 始终为 Apache HTTP Server 2.x 构建线程安全版本。如果您确定您的 MPM 不是多线程的,则可以使用 "--enable-prefork" 强制删除同步代码(从而略微提高性能)。例如,prefork MPM 不是多线程的。对于 Apache HTTP Server 1.3,此标志将自动设置。
--disable-trace 当使用日志级别 "trace" 时,mod_jk 会使用 "enter" 和 "exit" 日志消息跟踪大量函数调用。即使日志级别不是 "trace",将日志级别进行比较以决定是否记录也会对性能产生一定影响。
如果您使用 "--disable-trace",则跟踪日志代码不会被编译到模块二进制文件中,您可能会在执行过程中节省一些周期。
即使使用 "--disable-trace",使用调试日志级别记录调试消息仍然是可能的。
--enable-api-compatibility 仅使用在所选主要 Apache 版本分支的所有 Apache 生产版本中可用的 Apache API 函数。这提高了模块构建与 Apache 版本的二进制兼容性,这些版本早于构建 mod_jk 的版本(仅在 Apache 次要版本之间)。
--enable-flock 如果操作系统支持 flock 系统调用,请使用此标志启用此更快的锁,这些锁作为系统调用实现,而不是由 GNU C 库模拟。
但是,这些锁在 NFS 挂载的卷上不起作用,因此您可以在编译时使用 "--enable-flock" 强制使用 flocks() 调用。

配置使用的示例

Apache 1.3 和 2.x 构建 ./configure --with-apxs=/usr/sbin/apxs
make
cp ./apache-1.3/mod_jk.so /usr/lib/apache
make clean
./configure --with-apxs=/usr/sbin/apxs2
make
cp ./apache-2.0/mod_jk.so /usr/lib/apache2

为 Windows 上的 Apache 构建 mod_jk

该模块使用 Microsoft Visual C++ 开发,因此如果您想执行自己的构建,则需要安装 Visual Studio。

您可以使用 IDE GUI 或基于 nmake 的纯命令行构建来构建源代码。IDE 构建目前仅支持构建 32 位二进制文件。nmake 构建适用于 32 位和 64 位二进制文件。

所有构建过程的常见步骤是

  • 为 32 位或 64 位设置您的构建环境。IDE 构建仅支持 32 位。
  • 下载源代码作为 zip 文件并解压缩。
  • 更改目录到 ISAPI 重定向器源代码目录。
  • 将您的路径设置为环境中的 Apache Web 服务器目录。
设置 32 位或 64 位构建环境 setenv /Release /X86 或(IDE 构建不可用) setenv /Release /X64 从以下地址下载 tomcat-connectors-xxx-src.zip https://tomcat.ac.cn/download-connectors.cgi 并解压缩 unzip tomcat-connectors-xxx-src.zip 更改目录到 mod_jk 源代码目录。 要为 Apache HTTP 服务器 2.0、2.2 或 2.4 构建 mod_jk, 使用 "apache-2.0" 目录,对于旧的 Apache HTTP 服务器 1.3,使用 "apache-1.3" 目录。 cd tomcat-connectors-xxx-src\native\apache-2.0 设置环境变量 "APACHE1_HOME" 等等。 "APACHE2_HOME" 等等 "APACHE22_HOME" 等等 "APACHE24_HOME" 到您的 Apache Web 服务器的安装路径。 set APACHE24_HOME=D:\software\Apache\httpd-2.4.16

IDE 构建的步骤如下

  • 使用“start mod_jk.dsp”启动 Visual Studio。
  • 在 IDE 启动期间,在所有转换弹出窗口中选择“是”。
  • 接下来从下拉菜单中选择一个配置。有用于调试和发布构建的预定义配置,并且在“apache-2.0”目录中,每个配置都可用于针对 Web 服务器版本 2.0、2.2 和 2.4 进行构建。
  • 最后,在“构建”菜单中选择“构建解决方案”。
生成的 mod_jk.so 文件(以及调试符号文件 mod_jk.pdb)位于“Debug”或“Release”子目录中,具体取决于选择的构建配置。对于“apache-2.0”模块,目录分别命名为“Debug_20”、“Release_20”、“Debug_22”、“Release_22”、“Debug_24”和“Release_24”,具体取决于选择的构建配置。

或者,nmake 命令行构建的步骤如下

  • 通过编辑 Makefile.vc 文件中的“ARCH=”行,将目标体系结构设置为 X86 或 X64。
  • 执行“nmake -f Makefile.vc”。
生成的 mod_jk.so 文件(以及调试符号文件 mod_jk.pdb)位于“Debug”或“Release”子目录中,具体取决于选择的构建配置。对于“apache-2.0”模块,目录分别命名为“Debug_20”、“Release_20”、“Debug_22”、“Release_22”、“Debug_24”和“Release_24”,具体取决于选择的构建配置。

最后,您需要将 mod_jk.so 文件复制到 Apache HTTP 服务器的 modules 目录(对于旧的 Apache 1.3,则复制到 libexec 目录)。

对于 Apache HTTP Server 1.3,在链接 mod_jk 成功之前,需要存在 ApacheCore.lib。

在 System I - i5/OS (OS400) 上为 Apache 构建 mod_jk

从 OS400 V4R5 开始,System I (AS/400) 使用 Apache 2.0 作为其主要 Web 服务器,取代了旧的 IBM Web 服务器。现在,借助 IBM Rochester Labs 的帮助,可以在 System I 上构建 mod_jk,该实验室提供了信息和补丁以使 mod_jk 适应 i5/OS。

您应该至少拥有 Apache 2.0.58(产品 5722DG1)、C 编译器和 IFS。Apache 2.0.58 与 iSeries Apache 服务器的最新 PTF 集一起提供,可以在 http://www.ibm.com/servers/eserver/iseries/software/http/ 找到。

适用于 i5/OS V5R3(或 V5R4)的最新 Apache 2 现在是 2.0.58(截至 2007/04/17)。如果您要使用 jk 1.2.15 及更高版本,请确保已加载最新的 PTF。注意:在 i5/OS V5R3 上已知可用的最新 mod_jk 版本是 1.2.19。

在 i5/OS V5R4 中,UTF 是必需的,包括 Apache 模块,因此 Apache 模块不需要进行 EBCDIC 的转换,但需要将 mod_jk 1.2.23(及更高版本)移植到 V5R4。从 V5R4 信息中心:从 i5/OS(tm) V5R4 开始,模块必须使用 UTF 本地化重新编译。这将创建一个环境,其中依赖于本地化的 C 运行时函数假定字符串数据以 UTF-8 编码。任何硬编码常量可以通过在模块中添加 #pragma convert(1208) 语句来以 UTF-8 编码。此外,来自客户端的输入数据将不再转换为 EBCDIC,而是按原样传递。从模块发送的输出数据也不会被转换,因此它必须根据需要以 ASCII 或 UTF8 编码。从 V5R4 开始,APR 和 HTTP API 预期数据以 UTF-8 编码。请注意,一些 API 具有允许设置 CCSID 的附加函数,以指示正在传递的参数的编码。已添加 UTF-8 和 EBCDIC 之间的转换函数。请务必查看模块使用的 API,以了解当前的更改。

要在 System I 上配置 mod_jk,请使用 mod_jk 源代码提供的 CL 源代码。

  • 获取最新的 mod_jk 源代码,并在 Windows 或 Unix 机器上解压缩。
  • 在 IFS 中创建一个目录,例如 /home/apache。
  • 通过 FTP 将整个 jk 源代码目录发送到 System I 目录。
  • 然后转到 System I 命令行。
创建 mod_jk 库 CRTLIB MOD_JK TEXT(‘Apache mod'jk tomcat 连接器模块') 创建服务程序源文件 CRTSRCPF MOD_JK/QSRVSRC TEXT(‘服务程序源文件’) 创建 CL 构建程序源文件 CRTSRCPF FILE(MOD_JK/QCLSRC) TEXT(‘构建程序源文件’) 编辑服务程序源文件 STRSEU MOD_JK/QSRVSRC MOD_JK

在编辑后的文件中,指定仅导出 jk_module: 列数 . . : 1 71 编辑 MOD_JK/QSRVSRC SEU==> MOD_JK *************** 数据开始 ************************************* 0001.00 STRPGMEXP PGMLVL(*CURRENT) 0002.00 EXPORT SYMBOL("jk_module") 0003.00 ENDPGMEXP ****************** 数据结束 ****************************************

您可以开始构建 mod_jk 的所有模块(适用于 V5R4 或之前的版本)。

将 V5R4 之前的 i5/OS 的 CL 构建程序源代码从 IFS 复制 CPYFRMSTMF FROMSTMF('/home/apache/jk/native/apache-2.0/bldjk.qclsrc') + TOMBR('/QSYS.LIB/MOD_JK.LIB/QCLSRC.FILE/BLDJK.MBR') MBROPT(*REPLACE) 构建 CL 构建程序 CRTCLPGM PGM(MOD_JK/BLDJK) SRCFILE(MOD_JK/QCLSRC) TEXT('Apache mod_jk 构建程序') 启动构建 CALL MOD_JK/BLDJK
如果构建成功,请复制新的 mod_jk 模块 CRTDUPOBJ OBJ(MOD_JK) FROMLIB(MOD_JK) OBJTYPE(*SRVPGM) TOLIB(QHTTPSVR) NEWOBJ(MOD_JK)
将 i5/OS V5R4 的 CL 构建程序源代码从 IFS 复制 CPYFRMSTMF FROMSTMF('/home/apache/jk/native/apache-2.0/bldjk54.qclsrc') + TOMBR('/QSYS.LIB/MOD_JK.LIB/QCLSRC.FILE/BLDJK54.MBR') MBROPT(*REPLACE) 构建 i5/OS V5R4 的 CL 构建程序 CRTCLPGM PGM(MOD_JK/BLDJK54) SRCFILE(MOD_JK/QCLSRC) TEXT('Apache mod_jk 构建程序') TGTRLS(*CURRENT) 启动 i5/OS V5R4 的构建 CALL MOD_JK/BLDJK54
如果构建成功,请复制新的 mod_jk 模块 CRTDUPOBJ OBJ(MOD_JK) FROMLIB(MOD_JK) OBJTYPE(*SRVPGM) TOLIB(QHTTPSVR) NEWOBJ(MOD_JK)

接下来,您应该重新启动 Apache 2.0 实例,并在 System I 上享受这部分开源软件。

ENDTCPSVR SERVER(*HTTP) HTTPSVR(MYSERVER) STRTCPSVR SERVER(*HTTP) HTTPSVR(MYSERVER)

在 MacOS/X 上为 Apache 构建 mod_jk

Mac OS X (10.2.x) 构建说明

假设您是 root 用户

对于 Apache 1.3: ./configure --with-apxs=/usr/sbin/apxs cd apache-1.3 make -f Makefile.apxs cp mod_jk.so /etc/libexec/httpd 对于 Apache 2.x: ./configure --with-apxs=/usr/local/apache2/bin/apxs (您应该指向安装 Apache 2.x 的目录) cd apache-2.0 make -f Makefile.apxs install

将 mod_jk 与 Apache 静态链接

mod_jk 允许将 mod_jk 安装到 Apache 源代码树中,以获得静态链接的 mod_jk。将 mod_jk 放在 Apache 可执行文件中可以带来一些小的性能提升。配置选项 --with-apache 将 mod_jk 准备安装到 Apache 源代码树中。选项 --with-apache 适用于 Apache 1.3 和 Apache 2.x。以下示例展示了如何在 Apache 进程中获取 mod_jk。

Apache-2.x 的安装

/home/apache24/httpd-2.4.12 是 Apache HTTP Server 源代码所在的目录。 ./configure --with-apache=/home/apache24/httpd-2.4.12
make
将 mod_jk 库和其他文件安装到 /home/apache24/httpd-2.4.12/modules 中: make install
无法直接配置 Apache,因为必须将 mod_jk 的 config.m4 添加到 httpd-2.x 的 configure 中。 cd /home/apache24/httpd-2.4.12 sh buildconf configure ... --with-mod_jk make make install

不支持 enable-jk=share 和 enable-jk=static。--with-mod_jk 仅允许 mod_jk 的静态链接。

Apache-1.3 的安装

/home/apache/apache_1.3.27 是 apache-1.3 源代码所在的目录。 ./configure --with-apache=/home/apache/apache_1.3.27
make
将 libjk 库、mod_jk.c、包含文件和其他文件安装到 /home/apache/apache_1.3.27/src/modules/jk 中: make install
在 Apache 源代码中配置: cd /home/apache/apache_1.3.27 configure ... --enable-module=dir --disable-shared=dir \ --activate-module=src/modules/jk/libjk.a \ --disable-shared=jk make make install

--enable-shared=jk 也能正常工作,并构建一个 dso 文件。

只需更改 Apache 源代码中的配置: configure ... --enable-module=dir --enable-shared=dir \ --activate-module=src/modules/jk/libjk.a \ --enable-shared=jk