将Tomcat与Apache集成的几点原因

前言

以前会纠结,Tomcat本身就是一个功能比较完备的web服务器,为什么还需要和Httpd进行集成。遂简单做一下总结。

参考《Apress.Apache.Tomcat.7.Sep.2011》

为什么

为何将Tomcat与Apache集成,而不是将独立的Apache Tomcat用作servlet容器和HTTP服务器。

  1. 性能。Apache/Nginx是一个高性能的web服务器,它比Tomcat更快地提供静态内容,如html文件、图像和视频。但是自从Tomcat 7的发布以后,其作为web服务器的性能有了显著提高,在单服务器实例中集成Apache的性能提升有所下降。

    至于为啥Apache/Nginx比Tomcat更快地提供静态内容,有没有大佬补充一下。

  2. 可配置和扩展性。Tomcat根本无法在所有配置可能性上与之匹配。目前有数百个模块可作为Apache Httpd服务器的扩展。模块范围从特定语言的扩展(用于PHP、Perl、Python等)到安全功能(SSL和身份验证)。然后是代理模块mod_proxy,一个强大的URL重写模块mod_rewrite,以及支持自定义日志记录和请求过滤等等。

  3. 健壮性。Apache/Nginx具有良好的资源处理能力、最小的内存泄漏以及优雅的启动和关闭。

  4. 多语言架构集成。比如你可能会在应用程序的某些部分使用一些非Java脚本,比如PHP、Perl或Python等。

  5. 负载均衡。如果你的应用同时为大量用户提供服务,或者需要执行一些繁重的任务处理,单实例部署的Tomcat不足以满足服务请求处理。

集成配置

代理模块

mod_proxy

http.conf

LoadModule proxy_module modules/mod_proxy.so  
LoadModule proxy_http_module modules/mod_proxy_http.so

<VirtualHost *:80>                                                       #1 
        ServerAdmin webmaster@localhost 
        ServerName localhost 
        DocumentRoot /var/www                                            #2 
        ProxyPass /examples http://localhost:8080/examples               #3 
        ProxyPassReverse /examples http://localhost:8080/examples        #4 
</VirtualHost> 

AJP模块

mod_jk

http.conf

LoadModule jk_module modules/mod_jk.so 

<VirtualHost *:80> 
        ServerAdmin webmaster@localhost 
        ServerName localhost 
        DocumentRoot /var/www 
        JkWorkersFile /etc/httpd/conf/workers.properties        #1 
        JkMount  /examples/*.jsp mytomcat                       #2 
        JkUnMount  /examples/servlet/* mytomcat                 #3 
</VirtualHost> 

workers.properties

worker.list=mytomcat                  #1 
worker.mytomcat.port=8009             #2 
worker.mytomcat.host=127.0.0.1        #3 
worker.mytomcat.type=ajp13            #4 

server.xml

<!-- Define an AJP 1.3 Connector on port 8009 --> 
 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 

mod_proxy与mod_jk的选择

AJP协议承载与HTTP相同的数据,但采用优化的二进制格式。

http代理和AJP协议之间最显著的差异存在于安全和加密领域。
您可以使用mod_http_proxy轻松加密Apache和Tomcat之间的流量。您所要做的就是将https指定为Tomcat目标实例的协议,它就会正常工作。另一方面,AJP协议不支持加密。要使用mod_jk在Apache Web Server和Tomcat后端之间进行加密通信,您必须单独配置,例如使用IPSec(互联网协议安全)或SSH隧道。
但是,如果您需要将HTTPS连接详细信息(例如SSL证书详细信息)公开给后端Tomcat实例,那么mod_jk具有优势。如果您将Apache Web服务器配置为公开SSL详细信息,mod_jk将使这些信息可用于Tomcat。Mod_proxy_http不会将HTTPS连接详细信息传递Tomcat。
最后,每个模块的配置风格都大不相同。虽然mod_jk配置风格对Tomcat用户、开发人员和管理员来说很自然,但对经验丰富的Apache Web Server管理员来说似乎有点奇怪。另一方面,mod_proxy_http配置看起来与标准Apache配置非常相似。

附:Spring MVC文件配置

简单描述一下spring MVC架构下的文件配置

Configuring DispatcherServlet

web.xml,类似django中的urls.py

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
    <display-name>Chapter 11</display-name> 
    <description>Spring MVC Demo</description> 
    <servlet> 
        <servlet-name>chapter11</servlet-name> 
        <servlet-class 
           org.springframework.web.servlet.DispatcherServlet                     #1 
        </servlet-class> 
        <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>chapter11</servlet-name> 
        <url-pattern>*.html</url-pattern>                                        #2 
    </servlet-mapping> 
</web-app> 

Adding Views

*.jsp,相当于django中的template文件了

<html> 
  <head> 
   <title>Spring MVC Demo</title> 
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  </head> 
  <body> 
    <div class="content"> 
      <b> 
          ${message}                                  #1 
       </b> 
    </div> 
  </body> 
</html> 

Implementing Controllers

将Java类标记为控制器,用Spring的@controller注释对其进行注释。

像不像django中的

package com.appress.apachetomcat7.chapter11; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 
import javax.servlet.http.HttpServlet; 
import java.util.HashMap; 
import java.util.Map; 
@Controller                                                                     #1 
public class HelloWorldController{                                              #2 
    @RequestMapping(value = "/helloWorld.html",  
                        method = RequestMethod.GET                              #3 
    public ModelAndView hello(){                                                #4 
        Map<String, Object> model = new HashMap<String, Object>();              #5 
        model.put("message", "Hello, Spring-MVC World");                        #6 
        return new ModelAndView("index", model);                                #7 
    } 
}  

Wiring Spring Application Context

chapter11-servlet.xml。

Spring应用程序上下文是在Spring配置文件中使用XML配置的。在Spring MVC中,web.xml文件中配置的DispatcherServlet将自动从/web-INF加载其Spring上下文/{servlet-name}-servlet.xml打包在web应用程序中的文件,其中{servletname}是web.xml中使用的配置的元素。因为我们在web.xml中指定了servlet名称chapter11,所以Spring配置文件将是/web-INF/chaper11-servlet.xml,我们将把Spring MVC xml配置放在该文件中。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:mvc="http://www.springframework.org/schema/mvc" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/mvc 
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">                       #1 
  <mvc:annotation-driven/>                                                              #2 
  <bean name="helloWorldController"  
        class="com.appress.apachetomcat7.chapter11.HelloWorldController"/>              #3 
  <bean id="viewResolver"  
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">      #4 
      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>#5 
      <property name="prefix" value="/WEB-INF/views/"/>                                 #6 
      <property name="suffix" value=".jsp"/>                                            #7 
  </bean> 
</beans>
posted @ 2025-02-11 16:20  向七岁  阅读(13)  评论(0)    收藏  举报