汤姆猫和多个域名/应用程序

50

目前我在端口80上运行单个Tomcat服务器,使用单个WAR应用程序。 域名www.foo.org指向此服务器IP。

如何在端口80上为另一个客户添加www.bar.org域名?

谢谢

3个回答

62

从一开始,在您的conf/server.xml中只有一个“Host”记录用于localhost


<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

现在,您可以添加另一个“主机”记录,例如:
  <Host name="anotherclient.com"  appBase="anotherclient" unpackWARs="true" autoDeploy="true">

       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="anotherclient_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  </Host>

其中,name="anotherclient.com" 是新客户端的域名,appBase="anotherclient" 是其 Web 应用程序根目录名称(您部署 war 包的位置);它是相对于 Tomcat 主目录的。

在重新启动 Tomcat 后,更改将被接受。

发送到服务器 IP 地址指向的任何其他域(未列在 server.xml 中)的请求将传递到默认应用程序中,该应用程序在 Engine 元素中指定。

<Engine name="Catalina" defaultHost="localhost">

7
这是否意味着原始的foo.org网站的战争位于/opt/tomcat/webapps/ROOT.war,而新的bar.org网站的战争位于/opt/tomcat/anotherclient/ROOT.war - CodeMed
1
@CodeMed 是的,没错。我刚试了一下,把WAR文件放在那里似乎对我有用。 - Simon Forsberg
1
工作得很好!但是为什么不保留“webapps”文件夹并使用<Context path="" docBase="web-app-1" debug="0" privileged="true" />来指定正确的Web应用程序呢?我使用这个方法,将我的所有Web应用程序都放在“webapps”下(我已经习惯了很长时间)。这是一个不好的做法吗?(注意:我正在使用Tomcat 8.5,也许在tc7时代甚至不可能,我不知道) - BAERUS
1
@BAERUS,你确切地把那个语句放在哪里了?! - Axel Werner
2
@Axel 我在tomcat的server.xml中有几个主机。 每个看起来像这样:<Host name="www.my-url.xyz" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="my-web-app-1/2/3..." debug="0" privileged="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> 这样我将url映射到应用程序,全部都在“webapps”下面。 - BAERUS
显示剩余4条评论

6
在默认配置下,Tomcat接受任何主机名的请求并将它们全部发送到conf/server.xml中定义的"localhost"。如果您没有更改它,那么您需要做的就是确保为两个主机名设置了DNS记录并将它们指向您的服务器。
如果您想为每个主机名设置不同的Web应用程序,则需要在conf/server.xml中定义第二个并使用适当的主机名。(请注意,您始终需要有一个“默认”主机,所有不匹配任何明确定义的主机的请求都会被发送到该主机)。
您可以在此处阅读的文档:http://tomcat.apache.org/tomcat-7.0-doc/config/host.html(这是Tomcat 7.0.x的文档。您没有提到您的版本,因此我给您提供了最新版本的文档链接)。

谢谢 - 这是第7版,WAR文件怎么样?每个客户端需要不同的部署吗? - JavaSheriff
1
每个<Host>都有自己的appBase,因此您可以选择将WAR文件放在其中一个或两个中。选择一个将使该WAR文件仅可使用该<Host>的主机名访问,而将WAR文件放在两个位置意味着您将在同一容器中同时运行两个Web应用程序的副本:一个用于一个主机,另一个用于另一个主机。 - Christopher Schultz
在端口80上运行的单个Tomcat可以使用多个“主机”配置来处理相同端口(80)上的多个主机,使用单个WAR。 - JavaSheriff

3
通常情况下,您会在不同于80端口的端口(如8080、7001或任何您想要的端口)上拥有一个Tomcat(或其他应用服务器)。然后,您将在80端口上放置一个Web服务器(如Apache HTTP服务器),并配置一个或多个连接器以指向不同地址上不同应用服务器上的不同端口。
对于Apache HTTP服务器和Tomcat,您可以查看此链接:

http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html


3
没有特别的理由需要在OP的环境中添加另一个产品:这个问题可以仅使用Tomcat解决。 - Christopher Schultz
1
在专业环境中,拥有Web和应用服务器只是最佳实践。 - Guaido79
3
Malarkey:Tomcat 是一款完全可以接受的 Web 服务器。将某些事物称为“最佳实践”并不意味着它就是最佳实践。这只是一种常见的做法,但绝对不是“最佳”的实践。 - Christopher Schultz
3
将流量从端口80转发到8080的另一种选择是使用NAT表,将所有进入端口80的流量转换到端口8080。尽管Apache很快,但NAT更快,并且它已经成为iptables的一部分(我假设您的服务器是Linux)。 - oᴉɹǝɥɔ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接