为多个域的 Apache Tomcat 部署 WAR 个文件

Deploy WAR files for Apache Tomcat for multiple domains

我想在端口 80 上有一个网络服务器 运行。我读到的所有地方,Apache Tomcat 都在 8080 上运行。谁想在他们的 URL 中拥有它?所以我的第一个问题是在哪里更改端口号?我要在一个位置更改它吗?

我习惯了apache2虚拟主机。我想要 tomcat 上的相同设置。每个网站都有一个文件夹。我已经弄清楚如何使用 servers.xml 创建虚拟主机并为每个站点设置多个文件夹,但我不知道如何将 war 文件部署到每个虚拟主机的根目录。

部署 war 文件时,有一个 second.war 文件和一个名为 second 的空白目录。当我去查看该站点时,我必须去 http://example.com:8080/second 才能看到它。我不想在 URL 中输入 second。我该如何解决这个问题?我不是 java 程序员,编译 Java 的人是初学者 JSP 开发人员。

这是我在 servers.xml 的主机:

  <Host name="example.com"  appBase="webapps" unpackWARs="true" autoDeploy="true">
      <Alias>www.example2.com</Alias>

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

     <Context path="" docBase="/opt/tomcat/webapps/example_com"
       debug="0" reloadable="true"/>
  </Host>

可怕的袋熊在评论中给出了答案。使用 Apache 设置反向代理,效果很好!

tl;博士

为了 Tomcat 在端口 8080 上侦听以接收来自端口 80 上的 Web 浏览器的请求,请在主机操作系统上使用数据包过滤器工具来更改传入网络数据包的端口号。此过程称为 端口转发

80 端口被限制

I want to have a web-server running on port 80. Everywhere I read, Apache Tomcat runs on 8080. Who wants to have that in their URL? So my first question is where do I cahnge the port number?

Unix-like operating systems(macOS、BSD、Linux、Solaris 等)中,出于安全目的,1024 以下的端口号已限制访问。 Java 默认情况下是安全的,因此没有任何方式(据我所知)访问这些端口。所以所有 Java 服务器默认为 1024 和大约 64,000 的限制之间的某个数字。 Tomcat 默认为 8080,这是任意选择的,因为它可爱地重复了 80,这是 Web 应用程序的常用端口。

每个网络浏览器都默认使用该端口 80,并向用户隐藏该事实。所以像 http://www.whosebug.com/ 这样的 URL 等同于 URL 带有明确的端口号,比如 http://www.whosebug.com:80/.

正如您所建议的,我们通常不希望使用 8080 到 Tomcat 等显式端口来打扰我们的用户。如何解决这个 Catch-22 where the web browser wants to default to port 80 but Java-based servers such as Tomcat cannot listen on port 80? The common solution is known as port-forwarding

端口转发⏩

大多数类 Unix OS 都带有一个 firewall tool known as a packet-filter。通过网络传输并进入您的服务器计算机的每个数据包都可以通过此类工具进行检查、过滤甚至修改。

我们想要的修改是将任何进入端口 80 的传入数据包重定向到 Tomcat 正在侦听的端口 8080。在这种方法中,我们在 Tomcat 不知情的情况下改变了网络流量,并且根本没有对 Tomcat 做任何事情。 Web 浏览器和 Web 服务器都不知道发生了什么,两者都保持无知。浏览器向端口 80 发出请求,Web 服务器(Tomcat、Jetty 等)接收来自端口 8080 的那些现在修改的请求。

我见过的所有数据包过滤工具都以相同的方式工作:您指定一个规则列表。每条规则指定一个条件,如果满足该条件,则应采取行动。每个数据包都与规则一一比较。规则列表是有序的,每个规则都有一个指定的编号。与数据包匹配的第一条规则获胜,并执行其操作,而列表中的其余规则将被忽略。因此,我们需要设置规则“如果这个数据包来自端口 80,请将端口更改为 8080,并让它继续前进”。

简单的想法。不幸的是,每个数据包过滤器工具都有自己的这些规则语法。您将需要为您的 OS 搜索当前使用的数据包过滤器,因为一些较旧的工具已经消失,被较新的工具所取代。然后您将需要学习该工具规则的语法。运气好的话,您会很容易地找到要复制的示例片段,因为 Web 服务器的端口转发端口 80 非常常见。

请注意,大多数数据包过滤器仅为当前工作会话维护其规则。当托管操作系统的机器重新启动时,数据包过滤器 returns 为其默认设置,没有您添加的规则。您可以在每次重新启动后手动添加端口转发规则,也可以为您的特定数据包过滤器工具找到一种方法来学习规则,以便在重新启动后自动应用它。

警告:我上面的讨论假设您正在使用 Apache Tomcat as your web server as well as being the JSP/Servlet engine. You mentioned Apache HTTP Server。如果您在 Tomcat 后面使用 Apache HTTP 服务器,那么 Tomcat 仅充当 JSP/Servlet 引擎而不是 Web 服务器,这是一个完全不同的情况。