2012-03-20 51 views
13

我正在继承一个涉及Java Web应用程序的项目,该应用程序的后端由Apache httpd/Tomcat组合支持。 Web服务器用于提供JS,静态内容并执行通用负载均衡,Tomcat通过单个WAR文件提供JSP。Apache httpd和Tomcat如何协同工作?

我会接受访问代码库今天晚些时候或明天,但想尝试做一些研究的时间提前。

我的问题可以概括为:怎么办这两一起工作?

  • 谁第一次收到HTTP请求?
  • httpd是如何知道何时将JSP请求转发给Tomcat的,还是只响应请求本身?
  • httpd如何将请求“传递”给Tomcat并“接收”来自Tomcat的响应?它只是将请求/响应“复制粘贴”到Tomcat正在监听的端口?是否有某种OS级进程间通信正在进行?等等

这些只是关于这些技术如何相互协作的一般问题。提前致谢!

+0

我已经在下面发布了一些答案,但是我不会花太多时间在特定情况下进行细化,直到您看到您实际看到的内容。可能最好的办法是阅读反向代理的一般原理等(答案中的链接)。 – 2012-03-20 18:07:51

回答

18

谁第一个接收HTTP请求?

Apache的,几乎可以肯定。虽然可能有直接与Tomcat交谈的管理进程。

httpd如何知道何时将JSP请求转发到Tomcat,或只是对请求本身做出响应?

从其配置。具体情况会有所不同。它可能,例如,是使用mod_jkmod_jk2,在这种情况下,你会在配置文件中找到JkMount指令,如:

JkMount /*.jsp ajp13_worker 

...它告诉它的请求传递在的根用于匹配*.jspajp13_worker的文件的站点,该文件在workers.properties文件中定义。

或者它可以在一个简单的HTTP reverse-proxy安排设置。或者是其他东西。

httpd如何将请求“传递”给Tomcat并“接收”响应?

这取决于配置;它可能是HTTP,它可能是AJP,或者它可能正在使用一些其他模块。

它只是将请求/响应“复制粘贴”到Tomcat正在监听的端口上?

的排序。 :-)请参阅上面的反向代理链接。

是否有某种操作系统级的进程间通信正在进行?

是的。 AFAIK,它基于套接字(而不是共享内存),这意味着(除其他外)Tomcat和Apache不需要在同一台机器上运行。

+0

让我们假设一个动态内容的HTTP请求触及Apache。 Apache产生一个新线程,线程将它传递给Tomcat,然后杀死该线程(或将其返回给池)。一旦收到HTTP请求,Tomcat会产生一个新的线程来处理请求。然后,响应从Tomcat流到Apache,到客户端。真的吗? – 2013-04-21 23:55:41