web server apache tomcat11-15-proxy

前言

整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。

开源项目

从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。

系列文章

web server apache tomcat11-01-官方文档入门介绍

web server apache tomcat11-02-setup 启动

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

...

代理支持如何操作

介绍

在使用标准配置的 Tomcat 时,Web 应用程序可以请求处理请求的服务器名称和端口号。

当 Tomcat 以 HTTP/1.1 连接器独立运行时,它通常报告请求中指定的服务器名称和连接器侦听的端口号。

关键的 servlet API 调用包括:

  • ServletRequest.getServerName(): 返回发送请求的服务器的主机名。

  • ServletRequest.getServerPort(): 返回发送请求的服务器的端口号。

  • ServletRequest.getLocalName(): 返回接收请求的 IP 接口的主机名。

  • ServletRequest.getLocalPort(): 返回接收请求的 IP 接口的端口号。

然而,当在代理服务器后运行时(或将 Web 服务器配置为代理),您可能希望管理这些调用返回的值。

Apache httpd 代理支持

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

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

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

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

    bash 复制代码
    ProxyPass         /myapp  http://localhost:8081/myapp
    ProxyPassReverse  /myapp  http://localhost:8081/myapp

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

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

    ini 复制代码
    <Connector port="8081" ...
                  proxyName="www.mycompany.com"
                  proxyPort="80"/>

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

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

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

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

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

  1. 配置另一个只包含代理端口 <Connector><Service>

  2. 为通过代理访问的虚拟主机和 Web 应用程序配置适当的 Engine、Host 和 Context 元素。

  3. 可选地,像前面描述的那样使用 IP 过滤器保护端口 8081。

通过 Apache 代理时,Web 服务器将在其访问日志中记录这些请求。因此,您通常希望禁用 Tomcat 本身执行的任何访问日志记录。

以这种方式代理请求时,所有针对配置的 Web 应用程序的请求都将由 Tomcat 处理(包括针对静态内容的请求)。您可以通过使用 mod_jk Web 连接器而不是 mod_proxy 来提高性能。

mod_jk 可以配置为使 Web 服务器提供未在 Web 应用程序的部署描述符 (/WEB-INF/web.xml) 中定义的过滤器或安全约束处理的静态内容。

参考资料

tomcat.apache.org/tomcat-11.0...

相关推荐
KiddoStone3 分钟前
多实例schedule job同步数据流的数据一致性设计和实现方案
java
岁忧24 分钟前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
YuTaoShao27 分钟前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干1 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying2 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠3 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
Zz_waiting.3 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象