我有一个带有 Apache http Server 2.2 的服务器配置,其中基于名称的虚拟主机使用 mod_jk 连接器连接到单独的 Tomcat 7 虚拟主机。
以前,2 个 Apache 虚拟主机成功地为来自各自 Tomcat 虚拟主机的单独应用程序提供服务,但最近,当我尝试在配置中添加另一个主机时,新主机无法正常工作。
以下是 Tomcat 的 server.xml 中的主机声明:
<Host name="localhost" appBase="webapps/localhost"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="xx1.com" appBase="webapps/xx1"
unpackWARs="true" autoDeploy="true">
<Alias>www.xx1.com</Alias>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="xx1_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="xx2.com" appBase="webapps/xx2"
unpackWARs="true" autoDeploy="true">
<Alias>www.xx2.com</Alias>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="xx2_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="xx3" appBase="webapps/xx3"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="xx3_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
这是 Apache 虚拟主机配置:
<VirtualHost *:80>
ServerName xxx.com
ServerAlias *.xxx.com
JkMount /* newworker
</VirtualHost>
<VirtualHost *:80>
ServerName xx2.com
ServerAlias *.xx2.com
JkMount /* worker2
</VirtualHost>
<VirtualHost *:80>
ServerName xx1.com
ServerAlias *.xx1.com
JkMount /* worker1
</VirtualHost>
Worker.properties文件内容为:
worker.list=worker1, woker2, newworker
worker.worker1.type=ajp13
worker.worker1.host=xx1.com
worker.worker1.port=8009
worker.worker2.type=ajp13
worker.worker2.host=xx2.com
worker.worker2.port=8009
worker.newworker.type=ajp13
worker.newworker.host=xx3
worker.newworker.port=8009
以下是 mod_jk 日志:
[error] ajp_validate::jk_ajp_common.c (2748): worker newworker can't resolve tomcat address xx3
我认为问题出在 Tomcat 上,因为当从主机管理器应用程序访问主机 xx3 时,应用程序无法运行。而 xx1.com 和 xx2.com 响应良好。
注意:xx1.com 和 xx2.com 是公共域,其 A 记录指向运行应用程序的服务器,而 xx3 是本地域,除了 hosts 文件中的条目外,没有独有的 DNS 记录。
经过大量时间的思考,我发现 worker.host 参数是基于 DNS 来解析主机名,而不仅仅是 Tomcat 中运行的(虚拟)主机。虽然我觉得很奇怪,但这正是问题的根源。
有人可以帮助我配置服务器以获得所需的结果吗?
答案1
Apache 无法解析xx3
工作进程的主机名。
/etc/hosts
您可能在xx1.com
和中有硬编码条目xx2.com
,但没有在 中有硬编码条目xx3
。
您可以通过以下方式找到答案:
$ getent hosts xx2.com
并将其与以下项进行比较:
$ getent hosts xx3
还注意:
客户端通常使用主机名来识别他们想要连接的服务器。此主机名也包含在 HTTP 请求标头中。Tomcat 从 HTTP 标头中提取主机名并查找具有匹配名称的主机。如果未找到匹配项,则请求将路由到默认主机。默认主机的名称不必与 DNS 名称匹配(尽管可以),因为任何 DNS 名称与 Host 元素名称不匹配的请求都将被路由到默认主机。