我有一台 CentOS 5.2 服务器,安装了 Apache 2.2.3 和 Tomcat 5.5.27。该服务器托管连接到多个 Tomcat 的多个虚拟主机。例如,我们有一个用于开发和测试的 tomcat,还有一个用于生产的 tomcat。project.demo.us.com 指向开发 tomcat,project.us.com 指向生产 tomcat。
这是虚拟主机的配置:
<VirtualHost *:80>
ServerName project.demo.us.com
CustomLog logs/project.demo.us.com/access_log combined env=!VLOG
ErrorLog logs/project.demo.us.com/error_log
DocumentRoot /var/www/vhosts/project.demo.us.com
<Directory /var/www/vhosts/project.demo.us.com>
Allow from all
AllowOverride All
Options -Indexes FollowSymLinks
</Directory>
##########
##########
##########
JkMount /project/* online
</VirtualHost>
JkMount 行定义我们使用在线工作者并且我们的workers.properties包含以下内容:
worker.list=..., online, ...
worker.online.port=7703
worker.online.host=localhost
worker.online.type=ajp13
worker.online.lbfactor=1
并且 tomcat 的 conf/server.xml 包含:
<Connector port="7703"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3"
URIEncoding="UTF-8" maxThreads="80"
minSpareThreads="10" maxSpareThreads="15"/>
我不确定 redirectPort 是什么,但我尝试 telnet 到该端口,但没有人应答,所以这应该没关系吧?
Tomcat 的 webapps 目录包含 project.war,服务器自动将其部署到包含 index.jsp 和 hello.html 的项目目录下。后者用于静态调试目的。
现在当我尝试访问http://project.demo.us.com/project/index.jsp,我收到 Tomcat 的 HTTP 状态 404 - 请求的资源 () 不可用。hello.html 也发生了同样的事情,所以它也无法处理静态内容。
Apache 的 access_log 包含:
88.112.152.31 - - [10/Aug/2009:12:15:14 +0300] "GET /demo/index.jsp HTTP/1.1" 404 952 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"
我在 Tomcat 的日志中找不到任何关于该请求的提及。
如果我关闭这个特定的 tomcat,我将不再收到 Tomcat 的 404,而是收到 Apache 的 503 服务暂时不可用,所以我应该配置正确的 Tomcat。
我是否遗漏了一些明显的东西? 有没有什么地方可以让我找到 Tomcat 用来查找请求文件的路径?
答案1
看起来,在到达虚拟主机定义之前,它可能遇到了 mod_rewrite 或别名。您发布的所有内容看起来都正确,但您可以尝试添加一些额外的选项:
JkWorkersFile /explicit/path/to/workers.properties
JkLogFile /var/log/mod_jk.log
JkLogLevel debug
第一个设置将确保你正在使用实际的属性文件思考是,可能是多 tomcat 环境中的某些东西加载了错误的文件。您还可以检查此特定实例的 TOMCAT_HOME,以确保它加载了正确的 server.xml;实际上,您可以使用 -config 将其以及参数传递给 $TOMCAT_HOME:
cd $TOMCAT_HOME
./bin/startup.sh -config /direct/path/to/server.xml
看看这会带你去哪里...
答案2
如果您增加 JK 模块中的日志记录,您应该会看到请求被转换为什么。如果您直接连接到 Tomcat,并查看管理器,目标应用程序是否列在那里?如果是,它是否具有与映射使用的相同路径?如果您使用 Tomcat 的 http 侦听器,应用程序是否可以运行?
答案3
虽然没有严格回答你的问题,但 mod_proxy_ajp 可以为你非常快速地完成此操作,并且在随该版本的 CentOS 附带的 vanilla apache 版本中受支持
<VirtualHost *:80>
ServerName project.demo.us.com
TransferLog /my/log/dir/access.log
ErrorLog /my/log/dir/error.log
ProxyPass /project ajp://locahost:7703/context/ # Default port is 8009
DocumentRoot /my/doc/root/
<VirtualHost>
<VirtualHost *:80>
ServerName production.demo.us.com
TransferLog /my/log/dir/access.log
ErrorLog /my/log/dir/error.log
ProxyPass /project ajp://locahost:7703/context/ # Default port is 8009
DocumentRoot /my/doc/root/
<VirtualHost>
mod_jk 和虚拟主机存在一些问题,其中之一就是挂载通常是全局的。使用 mod_proxy_ajp 有助于消除这些问题。而且维护起来也容易得多。