代理支持操作指南

目录

简介

使用Tomcat的标准配置,Web应用程序可以请求处理请求的目标服务器名称和端口号。当Tomcat独立运行并使用HTTP/1.1 连接器时,它通常会报告请求中指定的服务器名称以及连接器正在监听的端口号。为此目的,相关的servlet API调用包括:

  • ServletRequest.getServerName(): 返回发送请求的目标服务器的主机名。
  • ServletRequest.getServerPort(): 返回发送请求的目标服务器的端口号。
  • ServletRequest.getLocalName(): 返回接收请求的Internet协议(IP)接口的主机名。
  • ServletRequest.getLocalPort(): 返回接收请求的接口的Internet协议(IP)端口号。

当您在代理服务器(或配置为代理服务器的Web服务器)后面运行时,您有时会希望管理这些调用返回的值。特别是,您通常希望端口号反映原始请求中指定的端口号,而不是连接器本身正在监听的端口号。您可以使用<Connector>元素上的proxyNameproxyPort属性来配置这些值。

代理支持有多种形式。以下各节描述了几种常见情况的代理配置。

Apache httpd 代理支持

Apache httpd 1.3及更高版本支持一个可选模块(mod_proxy),该模块将Web服务器配置为代理服务器。这可用于将特定Web应用程序的请求转发到Tomcat实例,而无需配置诸如mod_jk之类的Web连接器。为此,您需要执行以下任务:

  1. 配置您的Apache副本,使其包含mod_proxy模块。如果您是从源代码构建,最简单的方法是在./configure命令行上包含--enable-module=proxy指令。

  2. 如果尚未添加,请确保在Apache启动时加载mod_proxy模块,方法是在您的httpd.conf文件中使用以下指令:

    LoadModule proxy_module  {path-to-modules}/mod_proxy.so
    
  3. 在您的httpd.conf文件中为每个要转发到Tomcat的Web应用程序包含两条指令。例如,要转发上下文路径为/myapp的应用程序:

    ProxyPass         /myapp  http://localhost:8081/myapp
    ProxyPassReverse  /myapp  http://localhost:8081/myapp

    这告诉Apache将形如http://localhost/myapp/*的URL转发到监听端口8081的Tomcat连接器。

  4. 配置您的Tomcat副本,使其包含一个特殊的<Connector>元素,并带有适当的代理设置,例如:

    <Connector port="8081" ...
                  proxyName="www.mycompany.com"
                  proxyPort="80"/>

    这将导致此Web应用程序中的servlet认为所有代理请求都是定向到www.mycompany.com的80端口。

  5. <Connector>元素中省略proxyName属性是合法的。如果您这样做,request.getServerName()返回的值将是Tomcat运行的主机名。在上面的示例中,它将是localhost

  6. 如果您还有一个监听8080端口的<Connector>(嵌套在同一个服务元素中),则对这两个端口的请求将共享相同的虚拟主机和Web应用程序集。

  7. 您可能希望使用操作系统的IP过滤功能,将到端口8081(在此示例中)的连接限制为允许来自运行Apache的服务器。

  8. 另外,您可以设置一系列仅通过代理可用的Web应用程序,如下所示:

    • 配置另一个<Service>,其中仅包含一个用于代理端口的<Connector>
    • 为通过代理访问的虚拟主机和Web应用程序配置适当的引擎主机上下文元素。
    • (可选)如前所述,使用IP过滤器保护端口8081。
  9. 当请求由Apache代理时,Web服务器会将其记录在其访问日志中。因此,您通常会希望禁用Tomcat自身执行的任何访问日志记录。

当请求以这种方式代理时,配置的Web应用程序的所有请求都将由Tomcat处理(包括静态内容的请求)。您可以使用mod_jk Web连接器而不是mod_proxy来提高性能。mod_jk可以配置为使Web服务器提供静态内容,这些内容不受Web应用程序部署描述符(/WEB-INF/web.xml)中定义的过滤器或安全约束的处理。