我想在 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/app1
,ourserver.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 来提高应用程序的性能(线程、超时、敲击等)。
- 确保已安装 httpd-devel
- 将真正的 JDK 解压到某个路径,例如 /usr/local/jdk1.6.0_18/
从 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。