Apache HTTP 服务器操作指南

简介

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

建议您也阅读 工作器操作指南 文档,了解如何设置您的 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。一个 工作器 被定义为从 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 Binary Releases)。“JK 1.2 Binary Releases”链接包含适用于 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 服务器的 modules 目录中,即:/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 服务器的自动配置设置,并将以下 include 指令放在您的 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 网站管理员会保留自定义配置,以便根据实际需求调整设置。

简单配置示例

这是一个简单的配置:

# 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 服务器参考

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

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

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 服务器参考

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 应该静态或动态 (DSO) 可用于 Apache。

当配置 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 之间的防火墙悄悄地终止空闲连接,请尝试结合在您的操作系统中使用适当的 TCP keepalive 值来使用工作器属性 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,您可以更改工作器或 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 应用程序文件

如果 Apache HTTP 服务器可以访问 Tomcat Host 的 appBase (webapps) 目录,则可以将 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 开始,可以通过设置环境变量 no-jk 将某些 URL/URI 从 jk 处理中排除,例如使用 SetEnvIf 指令。

当 jk 和 alias/userdir URL 匹配时,您可以使用 no-jk 环境变量来解决 mod_alias 或 mod_userdir 指令的问题。

# 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 Archive *.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 构建使用广泛使用的 configure 系统。

从 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]

您可以设置 CFLAGSLDFLAGS 来添加一些平台特定的设置。

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

如果您想为不同版本的 Apache HTTP 服务器(如 1.3 或 2.x)构建 mod_jk,则需要为每个版本执行完整的构建过程。请注意,Apache 2.0、2.2 或 2.4 模块二进制兼容。您必须使用计划运行该模块的 Apache 版本编译该模块。所有 2.x 版本的构建都使用“apache-2.0”作为 mod_jk 构建目录。源代码与 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(删除所有先前编译的对象文件)
  • 从您的下一个 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 函数。这提高了模块构建与早于 mod_jk 构建版本的 Apache 版本之间的二进制兼容性(仅限于 Apache 次要版本之间)。
--enable-flock 如果操作系统支持 flock 系统调用,请使用此标志启用这些更快的锁,这些锁作为系统调用实现,而不是由 GNU C 库模拟。
然而,这些锁在 NFS 挂载卷上不起作用,因此您可以在编译时使用“--enable-flock”来强制执行 flocks() 调用。

configure 使用示例

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.net.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”或“APACH22_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 提供的信息和补丁,使 mod_jk 适应 i5/OS,在 System I 上构建 mod_jk 成为可能。

您应该至少拥有 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 Infocenter:自 i5/OS(tm) V5R4 起,模块必须使用 UTF 区域设置重新编译。这创建了一个环境,其中依赖于区域设置的 C 运行时函数假定字符串数据以 UTF-8 编码。任何硬编码常量都可以通过在模块中添加 #pragma convert(1208) 语句来以 UTF-8 编码。此外,来自客户端的输入数据将不再转换为 EBCDIC,而是按原样传递。从模块发送的输出数据也不进行转换,因此必须根据需要以 ASCII 或 UTF8 编码。APR 和 HTTP API 自 V5R4 起,期望数据为 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 connector module') 创建服务程序源文件 CRTSRCPF MOD_JK/QSRVSRC TEXT(‘Service program source file’) 创建 CL 构建程序源文件 CRTSRCPF FILE(MOD_JK/QCLSRC) TEXT(‘Build program source file’) 编辑服务程序源文件 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 或更早版本的情况)。

从 IFS 复制 i5/OS V5R4 之前的 CL 构建程序源文件。 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 build program') 启动构建 CALL MOD_JK/BLDJK
如果构建成功,复制新的 mod_jk 模块 CRTDUPOBJ OBJ(MOD_JK) FROMLIB(MOD_JK) OBJTYPE(*SRVPGM) TOLIB(QHTTPSVR) NEWOBJ(MOD_JK)
从 IFS 复制 i5/OS V5R4 的 CL 构建程序源文件。 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 build program') 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 可执行文件中会带来一些小的性能改进。configure 选项 --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 configure ... --enable-module=dir --enable-shared=dir \ --activate-module=src/modules/jk/libjk.a \ --enable-shared=jk