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