Apache Tomcat Servlet/JSP 容器

Apache Tomcat 5.5 Servlet/JSP 容器

Jaxmao Logo

Apache Tomcat 5.5 Servlet/JSP 容器

用代理服务器整合Apache和Tomcat

介绍

使用标准的Tomcat设置,WEB应用里的Servlet或JSP可以下面的方法,获得为用户服务的主机名称和使用 端口的号码。如果让Tomcat单独运行而不与其他WEB服务器捆绑,Tomcat一般可以转达用户请求里指定的 服务器名称和Tomcat设置里“Connector”所监听的端口。下面的 Servlet API里 面的方法可以用来解决这个问题:

  • ServletRequest.getServerName(): 用户请求里指定的主机名。
  • ServletRequest.getServerPort(): 用户请求里指定的端口。
  • ServletRequest.getLocalName(): 收到用户请求的主机名。
  • ServletRequest.getLocalPort(): 收到用户请求的主机端口。

当你的Tomcat在一个代理服务器(或一个被配置成与代理服务器行为一样的web服务器)后面运行,你 有时候希望根据用户的访问请求的服务器名和端口号码来正确处理,而不是Connector 本监听的那个端口和主机名。你可以使用 <Connector>元素里面的proxyNameproxyPort 属性来配置这些值。

用代理器来捆绑Tomcat和Apache可以有多种形式。下面的章节描述了几种常见情况的代理配置。

用代理器捆绑 Tomcat 和 Apache 1.3

Apache 1.3支持一个任选模块(mod_proxy),这个任选模块用来配置web服务器, 让这个web服务器象代理服务器一样工作。这可以用来把指定的web应用程序的请求传递到一个 Tomcat 去,而不需要配置一个象mod_jk 的web connector。要做到这样, 你需要执行下面的任务:

  1. 修改你的Apache 配置,让它包含mod_proxy模块。如果你从源代码开始创建, 最容易的办法是把--enable-module=proxy指令包含在./configure 命令行上。
  2. 如果你还没有安装mod_proxy模块,你可以在httpd.conf文件里 使用下列指令来装载它:
    LoadModule proxy_module {path-to-modules}/mod_proxy.so 
    AddModule mod_proxy.c
  3. 对于每个你想要传递给Tomcat的web应用程序,在你的httpd.conf文件里包含 两个指令。例如:
    ProxyPass /myapp http://localhost:8081/mywebapp 
    ProxyPassReverse /myapp http://localhost:8081/mywebapp
    它告诉Apache把http://localhost/mywebapp/*形式的URLs传递给在端口8081上 监听的 Tomcat 连接器, /mywebapp 是Tomcat里的一个应用。
  4. 修改Tomcat 的 server.xml,让它包括一个特殊的<Connector>元素,以及相应 的代理设置,例如:
    <Connector port="8081" ... 
    proxyName="www.mycompany.com" 
    proxyPort="80"/>
    它会让这个web应用程序里边的servlets认为 所有的代理请求被导向端口80上的www.mycompany.com
  5. 从<Connector>元素里省略掉proxyName属性是合法的。 如果你这样做,由request.getServerName()返回的值将是Tomcat在它上面运行 的那个主机名字。 在上面的例子中,它就是localhost
  6. 如果你还有一个在端口8080上监听的<Connector&gt在Service元素里,向其中 任何一个端口发出的请求都将共享相同的虚拟主机和web应用程序。
  7. 你可以使用你的操作系统的IP过滤(filtering)来限制与端口8081的连接, 这个例子里,使用户不能直接连接到8081或8080端口上而一定要通过端口80上的Apache。
  8. 或者,你可以设置仅仅通过代理(proxying)才能被使用的一系列web应用程序,如下:
    • 为代理端口配置包含仅仅一个<Connector>元素的另外一个 <Service>。
    • 通过代理为虚拟主机和web应用程序配置相应的 EngineHost, 和Context元素。
    • 或者,如早先描述的那样以IP过滤器保护端口8081。
  9. 当请求被Apache代理处理,Apache服务器的访问日志会记录这些请求。因此,你应该终止Tomcat本身 的访问日志。

当请求以这种形式被代理,配置过的web应用程序的所有请求都将由Tomcat处理 (包括对静态内容的请求)。你可以通过使用mod_jk web connector, 而不是mod_proxy 来提高性能。mod_jk可以配置成让web服务器来提供那些静态内容, 如果静态内容在web应用程序部署描述符/WEB-INF/web.xml被定义为必须经过过滤器或有 安全限制,这些内容仍然会由Tomcat来处理。

用代理器捆绑 Tomcat 与 Apache 2.0
在Apache 2.0里,可以忽略AddModule mod_proxy.c, 其它与1.3的说明相同。

Copyright © 1999-2006, Apache Software Foundation