常见问题

通用

关于 JK 的一般信息和常见问题

我在哪里可以获得 JK 的帮助/支持?

获得支持的主要机制是通过 doc 目录中包含的 JK 文档。文档也可在专门用于 Apache Tomcat 连接器项目 的 Apache Tomcat 网站上找到。如需额外帮助,最佳资源是 Tomcat 用户讨论列表。您应该在向列表发布问题之前,首先搜索 邮件列表存档。如果您无法在存档中找到问题的答案,您可以向用户列表发布关于 JK 的问题以寻求帮助。请确保您包含您正在使用的 Web 服务器版本以及您运行的平台,并点击 此处 了解如何订阅 Tomcat 邮件列表。

我找不到 JK。它在哪里?

现在 JK 已移至 tomcat-connectors 存储库,JK 的源代码和二进制文件可以从 Tomcat 连接器 (mod_jk) 下载 页面上的镜像站点下载。

JK 和 mod_jk 之间有什么区别?

JK 是一个涵盖 Web 服务器到 Tomcat 连接器的项目。

Apache HTTP 服务器 支持是在 JK 上实现的,使用一个名为 mod_jk 模块 的插件。

Microsoft IIS 支持是在 JK 上实现的,使用一个名为 ISAPI 重定向器 的插件。

我在哪里可以获得更多信息?

对于 JK 1.2.x,您应该阅读

如需更详细的信息,请查阅参考指南。您也可以尝试在邮件列表存档中搜索“JK”或查看源代码。

我应该使用哪种协议——ajp12、ajp13 还是 ajp14?

ajp13 是标准协议。旧版 ajp12 已弃用ajp14 是实验性的

此外,ajp13 受从 Tomcat 3.2 开始的所有 Apache Tomcat 版本以及其他 servlet 引擎(例如 JettyJBoss)的支持。

我的 Web 服务器和 Tomcat 之间有防火墙,一段时间后会断开 ajp13 连接

ajp13 协议使用持久连接,在这种情况下,如果没有要发送到 Tomcat 的请求,流量可能为零。防火墙通常会断开不活动的连接,这将导致您的 Web 服务器和 Tomcat 误以为连接仍然有效。

从 JK 1.2.0 开始,已将 socket_keepalive 属性添加到 ajp13 设置中,您应该在 Workers 操作指南workers.properties 参考 中查看它。如果没有其他方法奏效,您可以尝试 JkOptions +DisableReuse,但这会带来严重的性能影响。

在高负载下,即使我的 Apache HTTP 服务器处理了大部分负载,Tomcat 中仍然有许多线程

在高负载下,Apache HTTP 服务器会创建许多子进程来处理负载,这反过来又会创建到 Tomcat 的许多连接,以转发它们应该处理的请求。Apache HTTP 服务器通常会在负载降低时终止子进程/线程。但如果负载仍然存在,即使只有 Apache 处理请求(例如静态内容),子进程及其所有 ajp13 连接都会被保留,即使它们不再被使用。

要在一段时间不活动后关闭连接,您可以使用 connection_pool_timeout,有关更多信息,请参阅 workers.properties 参考

Apache HTTP 服务器

关于 mod_jk 和 Apache HTTP 服务器的信息和常见问题。

每当我重启 Tomcat 时,Apache 都会卡死!

ajp13 协议在 Tomcat 和 Apache 之间保持一个开放的套接字。Tomcat 连接器中现有的 mod_jk 版本可以处理网络故障。但对于非常旧的 mod_jk 版本,您可能也需要重启 Apache。

为什么 Apache 1.3 的下载目录中有两个 mod_jk.so 文件(-eapi 和 -noeapi)?

许多 Apache 版本使用一种修改后的 API,称为扩展 API (Extended API),该 API 是为与 mod_ssl 模块 配合使用而开发的。从 Apache 2.0 开始,不再有区别。

例如,某些最新的 Linux 发行版中存在的 Apache 1.3 包含 mod_ssl 模块。

因此,如果您有这样的“扩展 Apache”,则需要使用 mod_jk.so-eapi

您应该仅将 mod_jk.so-noeapi 用于“标准 Apache”(即不带 mod_ssl 的)。

明智的做法是避免在标准 API Apache 上使用 EAPI 模块,或在 EAPI Apache 上使用标准 API 模块。务必确保拥有与您的 Apache 版本匹配的 mod_jk.so

关于“损坏的 DSO?”的消息是什么意思?

这与 Apache EAPI 有关,消息 'mod_jk.so is garbled - perhaps this is not an Apache module DSO ?' 只是告诉您,您正在尝试安装一个在 Apache 上使用 EAPI 编译的 mod_jk.so DSO 模块,例如 apache-mod_ssl 或来自 Redhat 6.2/7.0 发行版的 Apache,但您的系统使用的是带有标准 API 的标准 Apache。

以及关于“模块可能在 EAPI 下崩溃!”的消息是什么意思?

也与 EAPI 相关,消息 '[warn] Loaded DSO /usr/lib/apache/mod_jk.so uses plain Apache 1.3 API, this module might crash under EAPI! (please recompile it with -DEAPI)' 表示 mod_jk.so 是在带有标准 API 的普通 Apache 下编译的,而您尝试将该模块安装在使用 EAPI 的 Apache 上。

在构建 mod_jk 期间,APXS 出现错误,例如 rc=0 或 rc=255。我尝试了构建部分中的所有步骤,现在我该怎么办?

APXS 是一个 Perl 脚本,当您从源代码构建 Apache Web 服务器时会创建该脚本。如果您遇到这些错误并且您获得的 Apache 是二进制发行版,则很可能 APXS 没有为您的系统正确配置。最好的办法是从 Apache HTTP 服务器主页 获取 Apache 源代码并自行构建。使用以下命令进行基本构建(有关其他选项,请阅读 Apache 文档)

[user@host] ~ $ cd /usr/local/src
[user@host] ~ $ gzip -dc apache_1.3.19.tar.gz|tar xvf -
[user@host] ~ $ cd apache_1.3.19
[user@host] ~ $ ./configure --prefix=/usr/local/apache \
            --enable-module=most \
            --enable-shared=max
[user@host] ~ $ make
[user@host] ~ $ make install

注意:以上步骤假设您已下载 Apache 源代码并将其放置在您的 /usr/local/src 目录中。

Apache 报告模块版本不正确

由于 Apache API 可以在不同版本之间更改,任何 Apache 模块都包含用于编译该模块的 Apache API 版本。这被称为魔术模块号 (Magic Module Number)。

启动时,Apache 会检查模块头中的版本是否与 Apache 服务器兼容。如果不兼容,它将拒绝启动并记录错误。

请注意,次要版本向前兼容。如果模块是使用 Apache 2.x.y 编译的,则生成的二进制文件应与任何其他 2.x.z 版本兼容,其中 z 大于或等于 y。如果您还需要与 z 小于 y 的 2.x.z 版本兼容,请使用配置标志 --enable-api-compatibility。请注意,使用任何 2.x 编译的模块将永远不会与 x 不同于 y 的 2.y 版本兼容。在这种情况下,您需要重新编译模块。

它适用于最新的 Apache 2.x 吗?

mod_jk 与 Apache 2.0 到 2.4 的 Apache 2.x 版本运行良好。

mod_jk 功能的重要部分已在 Apache HTTP 服务器模块 mod_proxy_ajp 和 mod_proxy_balancer 中重新实现。这些是 Apache 2.2 和 2.4 标准发行版的一部分。新模块不包含 mod_jk 的所有功能,但另一方面,您可以随着每个新的 Apache 版本自动获得这些模块。

JNI 不适用于 Apache 1.3

JNI worker 已弃用。它们可能无法工作。请勿使用它们。

JNI 支持需要多线程环境,这在 Apache 1.3 中并非普遍情况。您应该验证 Apache 1.3 是否已构建为支持线程,如果不支持,您可以将 pthreads 库添加到您的 httpd.conf 文件中。

# Add pthread to Apache in httpd.conf
LoadModule "/usr/lib/libpthreads.so"

此外请记住,JNI 适用于多线程服务器,您应该考虑升级到 Apache 2.x 以支持 JNI。

JNI 报告 JVM 无法在 Linux 下启动

JNI worker 已弃用。它们可能无法工作。请勿使用它们。

在 Linux 下,您应该在启动 Apache HTTP 服务器之前设置一些环境变量

export LD_LIBRARY_PATH=$jre/bin:$jre/bin/classic:$LD_LIBRARY_PATH

此外,一些 Linux 发行版已启用一个名为“浮动栈”的 GLIBC 功能,这可能在 SMP 机器上与低于 2.4.10 的内核不兼容。您应该通过导出环境变量来禁用浮动栈

export LD_ASSUME_KERNEL=2.2.5

您可能需要更新您的服务脚本,例如 /etc/rc.d/init.d/httpd,以便在您的 Apache 服务器启动之前设置这些环境变量。

通过 configure 构建时出现混合错误

configure 假设您已经为您的系统安装并配置了一些 GNU 工具,并且至少安装了 libtool

此外,一些系统可能混杂了 cc 和 gcc 设置,这可能会让您在尝试将使用原生 C 编译器构建的 Apache 与使用 gcc 构建的 JK 链接时感到困惑。

如果 make 处理未按预期工作,您应该使用 GNU make gmake