代理支持操作指南

目录

简介

使用 Tomcat 的标准配置,Web 应用程序可以询问处理请求的服务器名称和端口号。当 Tomcat 使用HTTP/1.1 连接器独立运行时,它通常会报告请求中指定的服务器名称,以及连接器正在侦听的端口号。为此,有用的 Servlet API 调用是

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

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

代理支持可以采取多种形式。以下部分描述了几种常见情况的代理配置。

Apache httpd 代理支持

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

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

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

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

    ProxyPass         /myapp  https://127.0.0.1:8081/myapp
    ProxyPassReverse  /myapp  https://127.0.0.1:8081/myapp

    它告诉 Apache 将形式为 https://127.0.0.1/myapp/* 的 URL 转发到监听在端口 8081 上的 Tomcat 连接器。

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

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

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

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

  6. 如果您也有一个在端口 8080 上侦听的 <Connector>(嵌套在同一个 Service 元素中),则对任一端口的请求都将共享同一组虚拟主机和 Web 应用程序。

  7. 您可能希望使用操作系统的 IP 筛选功能来限制对端口 8081(在本例中)的连接,允许从运行 Apache 的服务器进行连接。

  8. 或者,您可以设置一系列仅可通过代理访问的 Web 应用程序,如下所示

    • 配置另一个仅包含代理端口 <Connector><Service>
    • 为可通过代理访问的虚拟主机和 Web 应用程序配置适当的 EngineHostContext 元素。
    • 根据需要,使用前面描述的 IP 筛选器保护端口 8081。
  9. 当请求由 Apache 代理时,Web 服务器会将其访问日志中记录这些请求。因此,您通常会希望禁用 Tomcat 本身执行的任何访问日志记录。

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