12. 使用 mod_jk2 连接 ApacheTomcat

由于(出于某些奇怪的原因)一些网络管理员只允许出站 Web 连接到 TCP 端口 80,因此可能有人无法通过 端口 8080 访问您的 Tomcat(和 MMBase)服务器。您可以在 Apache 中安装 JK 2 映射或反向代理,以便可以通过 端口 80Apache Web 服务器访问 TomcatMMBase。除了端口问题,这样做的好处是您可以使用 Apache 来管理您的 SSL 连接,并将您现有的 Apache 日志和统计工具用于 TomcatMMBase

这里我们描述了连接 ApacheTomcatJK 2 连接器的安装和配置。通过这种方式,Tomcat 路径可以映射到 Apache 中。

来自 JK 2 连接器网站 (http://jakarta.apache.org/tomcat/tomcat-4.1-doc/config/jk2.html):

JK 2 连接器元素代表一个连接器组件,该组件通过 AJP 协议与 Web 连接器通信。这适用于您希望将 Tomcat 4 无缝集成到现有(或新的)Apache 安装中的情况,并且您希望 Apache 处理 Web 应用程序中包含的静态内容,和/或利用 ApacheSSL 处理。在许多应用环境中,与使用 HTTP/1.1 连接器以独立方式运行 Tomcat 下的应用程序相比,这将带来更好的整体性能。但是,确定它是否会为您的应用程序提供更好性能的唯一方法是两种方式都尝试一下。”

如果您只需要一个简单的配置——通常是与您的 Apache 服务器位于同一系统上的单个 Tomcat 服务器——Apache 反向代理可能对您来说是一个更简单的解决方案。虽然这些在互连功能方面更简单,但反向代理在处理您的路径和其他选项方面提供了更大的灵活性。Apache 反向代理的配置在下一节中描述。

但是,如果您计划构建或扩展到由多个 Tomcat 服务器组成的集群,这些服务器位于 Apache 前端之后,或者构建高性能系统,那么部署 JK 2 连接器是最佳选择。

Apache Jakarta 网站下载 JK 2 连接器的源代码

  http://jakarta.apache.org/site/sourceindex.cgi
  

解压并编译 JK 2 连接器

  
  tar -zxvf jakarta-tomcat-connectors-jk2-src-xxx.tar.gz
  cd jakarta-tomcat-connectors-jk2-src/jk/native2/
  ./configure \
    --with-apxs2=/usr/local/apache/bin/apxs
  make
  
  

确保您的$JAVA_HOME环境变量已设置,并且 Java 二进制文件在您的$PATH中,或者将此选项添加到您的 ./configure 命令中

  --with-java-home=/usr/local/j2sdk
  

复制模块文件mod_jk2.sojkjni.soApachemodules/目录

  
  cp -i ../build/jk2/apache2/*.so /usr/local/apache/modules/
  chmod 755 /usr/local/apache/modules/mod_jk2.so
  chown root:root /usr/local/apache/modules/mod_jk2.so
  chmod 755 /usr/local/apache/modules/jkjni.so
  chown root:root /usr/local/apache/modules/jkjni.so
  libtool --finish /usr/local/apache/modules
  
  

复制示例配置文件workers2.propertiesApache 的配置目录

  

  cp -i ../../jk/conf/workers2.properties /usr/local/apache/conf/
  chown root:root /usr/local/apache/conf/workers2.properties
  chmod 644 /usr/local/apache/conf/workers2.properties
  
  

并根据您自己的需求进行调整。

这是一个简单的配置,应该可以让您启动并运行

  
  [logger]
  # outcomment this in production use
  level=DEBUG
  
  [config:]
  file=${serverRoot}/conf/workers2.properties
  debug=0
  debugEnv=0
  
  [uriMap:]
  info=Maps the requests. Options: debug
  debug=1
  
  [shm:]
  info=Scoreboard. Required for reconfiguration and status with multiprocess servers
  file=${serverRoot}/logs/jk2.shm
  size=1000000
  debug=0
  disabled=0
  
  [workerEnv:]
  info=Global server options
  timing=1
  debug=0
  
  [status:]
  info=Status worker, displays runtime informations
  
  [uri:<hostname>/jkstatus/*]
  info=Display status information and checks the config file for changes.
  group=status:
  
  [channel.socket:localhost:8009]
  info=Ajp13 forwarding over socket
  
  # Define the worker
  [ajp13:localhost:8009]
  channel=channel.socket:localhost:8009
  
  [uri:<hostname>/mmbase-webapp/*]
  info=MMBase
  
  

大多数配置都是相当标准的。最后一个uri声明(替换<hostname>为您的主机名)是这一切的关键;它将所有以/mmbase-webapp/开头的客户端请求从 Apache 映射到您的 Tomcat 服务器。

Note

当我们进行虚拟主机映射时,不知何故,通用映射不再适用于此虚拟主机(同一 IP 地址上的其他虚拟主机根本没有问题)。我们必须为此虚拟主机显式添加通用映射才能使其再次工作。这是一个错误?还是 Apache 实现基于名称的虚拟主机的方式造成的后果?

因此,现在,您通过 Tomcat 访问的同一个应用程序,如 (替换<hostname>为您的主机名)

  
  http://<hostname>:8080/mmbase-webapp/
  
  

将通过 Apache 以如下方式访问

  
  http://<hostname>/mmbase-webapp/
  
  

Important

只有基于名称的虚拟主机才以这种方式受支持。确保将虚拟主机名(指向这个相同的(Web)服务器)添加到/etc/hosts文件(替换<hostname>为您的主机名)

  
  192.168.3.17 <hostname>
  
  

否则将无法工作(运行 DNS 在这里是不够的!)。

如果您的 Apache 安装仅服务于单个网站,您可以省略主机名

  
  [uri:/mmbase-webapp/*]
  info=MMBase
  
  

这将服务于映射的/mmbase-webapp/目录,该目录位于您的 Apache 安装的每个地址和站点上。

Note

使用 JK 连接器版本 2,所有配置设置都将在workers2.properties文件中。即使 Tomcat 自带 JK 2 配置文件/usr/local/tomcat/conf/jk2.properties,只要您坚持使用标准的 端口 8009,就没有必要编辑它。

如果您确实需要编辑此文件(例如,当更改端口时),请确保在您的 Tomcat 服务器未运行时执行此操作;该文件由 Tomcat 本身自动编辑。

mod_jk2 模块添加到您的 Apache 配置后(在文件/etc/httpd/conf/httpd.conf中或在新文件jk2.conf中,位于 Apache 配置目录/etc/httpd/conf.d):

  
  # Load mod_jk2 module
  LoadModule jk2_module modules/mod_jk2.so
  
  

  
  chown root:root /etc/httpd/conf.d/jk2.conf
  chmod 644 /etc/httpd/conf.d/jk2.conf
  
  

中),您现在可以重新启动 Apache 并尝试您的新入口点:(替换<hostname>为您的主机名)

  
  http://<hostname>/mmbase-webapp/
  
  

要检查 JK 2 连接器的状态(替换<hostname>为您的主机名)

  
  http://<hostname>/jkstatus/
  
  

Tip

您可以在/usr/local/apache/conf/workers2.properties中重新读取配置,方法是(重新)加载 JK 状态页面。这允许您添加新的映射,而无需重新启动 Apache 或使其重新加载其配置。但是,无法通过这种方式删除现有映射,并且需要 Apache 重新配置。

尽管也可以将 JK 2 配置(以略有不同的形式)放置在您的 Apache 配置文件中,但这是坚持使用workers2.properties设置的一个很好的理由。

Important

要保护对 JK 状态页面的访问,请向 Apache 配置添加身份验证声明。例如

  
  <Location /jkstatus/>
  AuthType Basic
  AuthName "JK 2 Connector Status"
  AuthUserFile /etc/httpd/conf/users
  AuthGroupFile /etc/httpd/conf/groups
  Require group admin
  </Location>
  
  

这将提示从 admin 组的用户登录。

如果出现任何问题,请检查将写入到您的 Apacheerror_log.

Tip

中的 JK 2 连接器日志消息。如果 JK 2 连接器难以连接到 Tomcat,请检查 Tomcat 是否确实在 端口 8009 上可用

  
  netstat -tln
  
  

映射到 Tomcat 的访问请求将被记录在 Apacheaccess_logerror_log中。

有关workers2.properties配置的更多信息,请查看文档,地址为

  http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/jk2/configwebcom.html
  

在那里,您将阅读有关设置更多(远程)Tomcat 工作进程、将这些工作进程分组到负载均衡池中、设置 RPC 通道、使用 Unix 套接字、使用 Java 本地接口 (JNI) 直接(进程内)与 Tomcat 互连、设置备用记录器以及优化超时的信息。

Tip

Apache 在服务普通内容文件方面比 Tomcat 更有效率。您可以使 ApacheTomcat 文档目录都指向文件系统上的同一目录,并且仅转发对 JSP 页面和 Java Servlet 的请求。例如(在workers2.conf):

  
  #[uri:/examples/servlet/*]
  #info=Prefix mapping

  #[uri:/examples/*.jsp]
  #info=Extension mapping
  
  

中)。但是,现在您需要保护 TomcatWEB-INF/目录(以及您不希望访问者访问的其他目录和文件)免受 Apache 的服务。例如(在 Apachehttpd.conf):

  
  <Location "/examples/WEB-INF/">
  AllowOverride None
  deny from all
  <Location>
  
  

中)。此外,请注意,像这样的设置会绕过您可能在文件/usr/local/tomcat/webapps/examples/WEB-INF/web.xml.

中配置的任何安全约束。

  http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/