代理支持操作指南
目录
简介
使用 Tomcat 的标准配置,Web 应用程序可以询问处理请求的服务器名称和端口号。当 Tomcat 使用HTTP/1.1 连接器独立运行时,它通常会报告请求中指定的服务器名称,以及连接器正在侦听的端口号。为此,有用的 Servlet API 调用是
ServletRequest.getServerName()
:返回发送请求的服务器的主机名。ServletRequest.getServerPort()
:返回发送请求的服务器的端口号。ServletRequest.getLocalName()
:返回接收请求的互联网协议 (IP) 接口的主机名。ServletRequest.getLocalPort()
:返回接收请求的接口的互联网协议 (IP) 端口号。
在代理服务器(或配置为像代理服务器一样工作的 Web 服务器)后面运行时,有时您会希望管理这些调用返回的值。特别是,您通常希望端口号反映原始请求中指定的值,而不是连接器本身正在监听的值。您可以使用 <Connector>
元素上的 proxyName
和 proxyPort
属性来配置这些值。
代理支持可以采取多种形式。以下部分描述了几种常见情况的代理配置。
Apache httpd 代理支持
Apache httpd 1.3 及更高版本支持一个可选模块 (mod_proxy
),该模块将 Web 服务器配置为充当代理服务器。这可用于将特定 Web 应用程序的请求转发到 Tomcat 实例,而无需配置 Web 连接器,例如 mod_jk
。要实现此目的,您需要执行以下任务
配置您的 Apache 副本,以便其包含
mod_proxy
模块。如果您从源代码构建,最简单的方法是在./configure
命令行上包含--enable-module=proxy
指令。如果您尚未添加,请确保在 Apache 启动时加载
mod_proxy
模块,方法是在httpd.conf
文件中使用以下指令LoadModule proxy_module {path-to-modules}/mod_proxy.so
为要转发到 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 连接器。配置您的 Tomcat 副本以包含一个特殊的
<Connector>
元素,并具有适当的代理设置,例如<Connector port="8081" ... proxyName="www.mycompany.com" proxyPort="80"/>
这将导致此 Web 应用程序中的 servlet 认为所有代理请求都定向到端口 80 上的
www.mycompany.com
。从
<Connector>
元素中省略proxyName
属性是合法的。如果您这样做,request.getServerName()
返回的值将是 Tomcat 正在运行的主机名。在上面的示例中,它将是localhost
。如果您也有一个在端口 8080 上侦听的
<Connector>
(嵌套在同一个 Service 元素中),则对任一端口的请求都将共享同一组虚拟主机和 Web 应用程序。您可能希望使用操作系统的 IP 筛选功能来限制对端口 8081(在本例中)的连接,仅允许从运行 Apache 的服务器进行连接。
或者,您可以设置一系列仅可通过代理访问的 Web 应用程序,如下所示
当请求由 Apache 代理时,Web 服务器会将其访问日志中记录这些请求。因此,您通常会希望禁用 Tomcat 本身执行的任何访问日志记录。
当请求以这种方式代理时,所有针对已配置 Web 应用程序的请求都将由 Tomcat 处理(包括对静态内容的请求)。您可以使用 mod_jk
Web 连接器代替 mod_proxy
来提高性能。mod_jk
可以进行配置,以便 Web 服务器提供未由 Web 应用程序的部署描述符(/WEB-INF/web.xml
)中定义的过滤器或安全约束处理的静态内容。