将Tomcat与Apache集成的几点原因
前言
以前会纠结,Tomcat本身就是一个功能比较完备的web服务器,为什么还需要和Httpd进行集成。遂简单做一下总结。
参考《Apress.Apache.Tomcat.7.Sep.2011》
为什么
为何将Tomcat与Apache集成,而不是将独立的Apache Tomcat用作servlet容器和HTTP服务器。
-
性能。Apache/Nginx是一个高性能的web服务器,它比Tomcat更快地提供静态内容,如html文件、图像和视频。但是自从Tomcat 7的发布以后,其作为web服务器的性能有了显著提高,在单服务器实例中集成Apache的性能提升有所下降。
至于为啥Apache/Nginx比Tomcat更快地提供静态内容,有没有大佬补充一下。
-
可配置和扩展性。Tomcat根本无法在所有配置可能性上与之匹配。目前有数百个模块可作为Apache Httpd服务器的扩展。模块范围从特定语言的扩展(用于PHP、Perl、Python等)到安全功能(SSL和身份验证)。然后是代理模块mod_proxy,一个强大的URL重写模块mod_rewrite,以及支持自定义日志记录和请求过滤等等。
-
健壮性。Apache/Nginx具有良好的资源处理能力、最小的内存泄漏以及优雅的启动和关闭。
-
多语言架构集成。比如你可能会在应用程序的某些部分使用一些非Java脚本,比如PHP、Perl或Python等。
-
负载均衡。如果你的应用同时为大量用户提供服务,或者需要执行一些繁重的任务处理,单实例部署的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>

浙公网安备 33010602011771号