如何在 Apache 和 Tomcat 中设置使用 mod_proxy_ajp?

如何在 Apache 和 Tomcat 中设置使用 mod_proxy_ajp?

我想在 RHEL 5 服务器上运行 Apache 和 Tomcat,其中 Apache 处理 Ruby on Rails 应用程序(通过 mod_rails/Passenger),Tomcat 处理 Java 应用程序。

在 Apache 下,每个 Rails 应用都会有一个 URL 和 vhost。这些 URL 已在我们的 DNS 服务器中配置为指向该机器。

在 Tomcat 下,每个 Java 应用程序都有一个这样的 URL:ourserver.ourcompany.com/app1,,ourserver.ourcompany.com/app2等等。

服务器已启动并运行,Tomcat 6 在端口 80 上运行,并为多个 Java 应用程序提供服务。我想添加 Apache 并重新配置。我熟悉如何配置单个 Apache 服务器以使用 Passenger 托管 RoR 应用程序。我只是不知道如何让 Apache 和 Tomcat 像那样协同工作。

我通过谷歌搜索找到了各种资源和讨论(例如,这个),但它们往往有点粗略和不完整,或者它们似乎与我想要做的事情不太匹配。我链接到的那个似乎适用于如果你想将所有请求发送到 Tomcat,而不仅仅是某些请求,并让 Apache 处理其他请求。

server.xml有人可以建议一个和的示例配置httpd.conf,或者可以给我指出一些更详细的资源吗?

答案1

您不需要对进行任何更改,server.xml只需将 Tomcat 恢复为默认端口,这样 Apache 就可以处理端口 80。大部分工作将通过 Apache 配置文件完成。我通常将它们留在外面,而是将它们粘贴到子目录httpd.conf下较小的配置片段中。<ServerRoot>/conf.d/

鉴于你的例子ourserver.ourcompany.com/app1ourserver.ourcompany.com/app2我会假设配置如下:

<VirtualHost *:80>
    ServerName ourserver.ourcompany.com
    ErrorLog ...
    CustomLog ...

    [other VHost configurations]

    ProxyPass /app1 ajp://tomcat_hostname:8009/app1
    ProxyPassReverse /app1 ajp://tomcat_hostname:8009/app1

    ProxyPass /app2 ajp://tomcat_hostname:8009/app2
    ProxyPassReverse /app2 ajp://tomcat_hostname:8009/app2
</VirtualHost>

如果你有多个 Tomcat 服务器集群,那么你可能需要设置 mod_balancer 并将其移动ajp://mod_balancer BalancerMember并将其替换为balancer://引用平衡器配置的 URL。

答案2

我个人不喜欢 mod_proxy_ajp;在 Apache 下运行 Tomcat 时,我会直接安装 mod_jk(来自 Tomcat 编码人员的模块)来提供 AJP 连接。您可以用 5 种方式调整 mod_jk 来提高应用程序的性能(线程、超时、敲击等)。

  1. 确保已安装 httpd-devel
  2. 将真正的 JDK 解压到某个路径,例如 /usr/local/jdk1.6.0_18/
  3. 从 tomcat.apache.org 获取“tomcat-connectors”源并进行编译

    cd tomcat-connectors-1.2.28-src/native

    ./configure --with-apxs=/usr/sbin/apxs --with-java=/usr/local/jdk1.6.0_18 --enable-prefork

    制作

    cp apache-2.0/mod_jk.so /usr/local/lib/

现在您必须将其插入到 Apache 配置中,然后根据需要将其插入到每个虚拟主机中。在总体配置中,您可以添加类似以下内容:

LoadModule jk_module /usr/local/lib/mod_jk.so
JkWorkersFile  /usr/local/tomcat/conf/workers.properties
JkShmFile      /var/log/httpd/mod_jk.shm
JkLogFile      /var/log/httpd/mod_jk.log
JkLogLevel     error

您将需要创建基本的 worker.properties 文件,这里是文档:http://tomcat.apache.org/connectors-doc/reference/workers.html一个非常基本的可能看起来像这样:

workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/local/jdk1.6.0_18
ps=/
worker.list=ajp13
worker.maintain=60
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=ajp13

这将使用 server.xml 中的默认端口 8009 配置 - 这里有上百万个旋钮可以无限调整性能。然后,在每个虚拟主机中“安装”所需的应用程序:

<VirtualHost *:80>
 ServerName foo.bar.com
 ...other options ...

 JkMount /app1/* ajp13
 <Location "/app1/WEB-INF/">
    deny from all
 </Location>

 JkMount /app2/* ajp13
 <Location "/app2/WEB-INF/">
    deny from all
 </Location>

</VirtualHost>

正如您在底部看到的,不要忘记一点安全性并拒绝对您的 WEB-INF 文件夹的所有访问 - 当作为 warball 部署时,大多数 webapps 都有带有密码 web.xml 的数据库 DSN。

相关内容