`
zzc1684
  • 浏览: 1229510 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Apache+Tomcat+AJP

阅读更多

介绍

 

大部分一开始接触WEB服务器的人可能和我一样对为什么有Apache又有Tomcat服务器感到奇怪(它们还都是Apache开发的呵呵),其实他们不是冗余的服务器,虽然他们都能对外提供WEB服务器,但总的来说还是各有侧重点。下面做个简单介绍。

 

 

 

1.       Apache是世界排名第一的Web服务器;在Apache基金会里其永远被第一支持。而开源的Apache Tomcat也非常关注,由于开源,用户最支持。

 

2.       Apache支持静态页面,Tomcat支持动态页面(servlet, JSP);一般在使用Apache + Tomcat的配置下,Apache都是实现对JSP的转发,交给Tomcat来处理。Apache可以支持PHP,但如果要支持JAVA,就需要Tomcat来处理。

 

3.       ApacheWeb服务器,Tomcat是应用(Java)服务器,它只是一个servlet容器,是Apache的扩展,但可以独立于Apache运行;如果以独立方式运行,功能与Apache等效,但对静态页面的处理不太理想。

 

通过上面分析,可以知道:

 

1.       Apache能有很好的静态页面处理能力,如果搭配Tomcat能同时支持静态和动态页面

 

2.       Tomcat能够承担性能要求较低的WEB应用。

 

负载均衡

 

 

 

为了提高整个系统的可用性和性能,常常会用到负载均衡,而ApacheTomcat经常联合在一起来实现负载均衡技术。

 

主机Apache作为前段负载平衡服务器对用户进行分配,后端不同的Tomcat服务器最终处理请求,其中根据侧重点不同可以有两种不同的配置。

 

1.       增加系统可用性

 

保证多台Tomcat服务器之间会话的同步,确保任何一台当机都不会影响系统的运行,从而提高系统的可用性。

 

2.       提高系统性能

 

在负责负载平衡的Apache主机上记录每个请求的Session ID(这个ID是由Tomcat分配的)及回应SessionTomcat Server对应关系,在下一个请求到来时先判断每个Session ID,如果有标识连接已经建立,那么转到对应服务器;负责就是新的连接,根据每个后台Tomcat服务器的状态分配一个服务器并记录Session ID.

 

如下图:

 

 

 



Apache + Tomcat
配置

 

正如上面中看到的可以通过Apache +Tomcat来配置来达到较高WEB服务器同时,也能高正较高的可用性和系统性能。这些是通过ApacheTomcat之间的通讯来完成的。ApacheTomcat之间的通讯基本有三种方式:

 

1.       Mod_Jk

 

2.       HTTP_Proxy

 

3.       AJP_Proxy

 

这里主要介绍Mod_JK方式,其也是最流行的方式,并且官方的文档也非常全。

 

Mod_JK

 

Mod_JKApache的一个模块,其通过AJP协议实现ApacheTomcat之间的通讯,而Tomcat默认监听AJP连接器的8009端口来接受AJP的连接请求;一般这些请求来自前端的Apache服务器。

 

由于Mod_JK已经被设计成Apache的一个模块,因此可以通过一些相对简单的配置就能达到ApacheTomcat之间通讯的目的;同样包含负载均衡。

 

配置步骤

 

安装

 

1.       安装Apache HTTP服务器,从Apache官方网站下载;我安装的是Apache2.0.64

 

2.       安装Apache Tomcat,可以安装在Apache同一个机器,也可以在其他的机器,版本要与Mod_JK匹配

 

3.       下载Mod_Jk;这里注意要与Apache Tomcat匹配。

 

配置

 

加在Mod_Jk

 

Mod_Jk是在Apache HTTP服务器上被加载的,需要将下载下来的Mod_Jk.so放到Apache/Modules目录下,并修改httpd.conf,增加下面一行:

 

Include conf/mod_jk.conf

 

 

 

使用include命令包含mod_jk.conf,这个是我们自己添加的关于mod_jk的配置文件。

 

 

 

新建Mod_jk.conf,并添加如下内容:

 

#Load mod_jk module.

LoadModule jk_module modules/mod_jk.so

 

#Where to find workers.properties

JkWorkersFile conf/workers2.properties

JkMountFile conf/urimap.properties

 

#Where to put jk logs

JkLogFile logs/mod_jk.log

 

#Set the jk log level[debug/error/info]

JkLogLevel info

 

#Select the log format

JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

 

#JkRequestLogFormat set the request format

JkRequestLogFormat "%w %V %T"

 

JkMount /* loadbalancer

 

 

 

上面包含了两个properties文件,分别是workers2.propertiesurimap.properties

 

Workers2.properties用于说明Tomcat服务器的负载均衡配置方法,具体如下:#worker.list=loadbalancer

 

worker.list=loadbalancer,tomcat1,tomcat2  #server 列表

 

 

 

#define the first node

 

worker.tomcat1.port=8009

 

worker.tomcat1.host=10.224.70.57

 

worker.tomcat1.type=ajp13

 

worker.tomcat1.lbfactor=1

 

 

 

#define the first node

 

worker.tomcat2.port=8009

 

worker.tomcat2.host=10.224.70.57

 

worker.tomcat2.type=ajp13

 

worker.tomcat2.lbfactor=1

 

 

 

#Now we define the load-balancing behavior

 

worker.loadbalancer.type=lb

 

worker.loadbalancer.balance_workers=tomcat1, tomcat2

 

 

 

worker.loadbalancer.sticky_session=true

 

 

 

worker.loadbalancer.sticky_session_force=true

 

Mod_jk.conf中有JkMount /* loadbalancer,这个loadbalancer正好对应上面worker.list一行的loadbalancer

 

另外tomcat1tomcat2是配置的后台tomcat服务器;当然这里只有一台服务器,所以两个worker都是同样的地址。lbfactor表示在负载均衡算法中采用的权重。

 

 

 

另外在urimap.properties文件中说明了哪些请求会转交给Tomcat服务器,配置项为:

 

!/*.htm=loadbalancer

 

注意这里的表示*.htm的请求都到loadbalancer;这个loadbalancer是上文中的loadbalancer

 

至此ApacheTomcat之间的负载均衡已经被配置好了。

 

 

 

运行时观察

 

这里主要观察sessionstickiness是如何被实现的;已经Apache服务器如何了解到关于Session ID相关的信息。
实际上对于负载均衡来说,如果上面的例子中你配置了两个Tomcat,那么关闭sticky_session的情况下,每个Tomcat服务器将轮流收到请求。

 

 

 

其实在试验的时候发现session IDTomcat服务器分配创建的,Apache服务器只是用来管理其与Tomcat服务器之间的关系;当然Apache服务器需要检查每次请求中的Session ID。这个ID是由Tomcat分配的;Tomcat对于每个第一次请求的动态页面都会生成JSESSIONID;而对于静态页面是不会生成JESSIONID的。

 

具体运行过程:

 

1.       Apache服务器接收到来自client的请求,检查HTTP请求是否包含SESSIONID

 

2.       如果不包含,采用负载均衡算法选择一个Tomcat服务器

 

3.       Apache服务器将这个client请求转发到选定Tomcat服务器的8009端口,数据包的格式是AJP协议

 

4.       Tomcat解析AJP协议,生成SESSION ID并且取得响应,将结果发送给Apache服务器,这个是通过之前的8009连接过来的链接发送回去的。

 

5.       Apache服务器解析AJP包,并得到SESSION ID信息,并将其与对应的服务器(和会话)关联起来。

 

6.       ApacheSESSION ID转发给client

 

7.       ClientSession ID保存到Cookie中用于下次使用。

 

Packet No

Apache

Tomcat:8009

1

2:REQ:GET /index.jsp HTTP/1.1 à

 

2

 

ß2:RSP:send headers:200 OK

3

 

ß2:RSP:SEND BODY CHUNK

4

 

ß2:RSP:END RESPONSE

 

 

 

通常这个连接建立好了之后短时间是不会断,不过这是可以通过参数来配置的。

 

在上面的包交互过程中:第2个包包含了SESSION ID的信息;内容类似于下面:

 

Set-Cookie..3JSESSIONID=955AAE2AA22B074BD1824395B6E4835A; Path=/...Content-Type...text/html...Content-Length...141.AB.....

 

AJPApache JServer Protocol

 

AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。

 

一旦一个连接被分配给特定的请求,在请求处理周期结束之前这个连接不能被重用;换句话说,请求不是连接多工的。这样编码比较简单。

 

一旦连接被分配给特定的请求,基本请求信息(HTTP头)以压缩的个性(通常字符串会编码为整数);如果有请求实体,会随后立即发送。

 

这个时候,servlet容器已经准备好了处理请求并发送西面的信息回WEB服务器:

 

1.       SEND_HEADERS:发回浏览器的响应头

 

2.       SEND_BODY_CHUNK:将实体发送给浏览器

 

3.       GET_BODY_CHUNK:获取更多的请求数据,这些数据没有被发送。

 

4.       END_RESPONSE:表示请求处理周期结束。

 

 

 

WEB服务器发送给Servlet容器的请求包括:

 

1.       转发请求开始

 

2.       关闭

 

3.       Ping

 

4.       CPing

 

 

 

AJP13_FORWARD_REQUEST的格式

 

AJP13_FORWARD_REQUEST :=

 

    Magic:            (word)

 

    Length:           (word)

 

    prefix_code      (byte) 0x02 = JK_AJP13_FORWARD_REQUEST

 

    method           (byte)       HTTP请求方法的字节编码

 

    protocol         (string)

 

    req_uri          (string)

 

    remote_addr      (string)

 

    remote_host      (string)

 

    server_name      (string)

 

    server_port      (integer)

 

    is_ssl           (boolean)

 

    num_headers      (integer)

 

    request_headers *(req_header_name req_header_value)

 

    attributes      *(attribut_name attribute_value)

 

    request_terminator (byte) OxFF

 

AJP13_SEND_HEADERS

AJP13_SEND_HEADERS :=
  prefix_code       4
  http_status_code  (integer)
  http_status_msg   (string)
  num_headers       (integer)
  response_headers *(res_header_name header_value)
 

更多信息,参见:http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html#header_encoding

分享到:
评论

相关推荐

    apache+tomcat7+jk负载均衡

    3. 配置Tomcat的server.xml文件,添加JK监听器(mod_jk_AJP13),使Tomcat能接受来自mod_jk的AJP协议连接。 4. 在Apache的虚拟主机配置中,使用mod_jk的`JkMount`指令将特定的URL或目录映射到对应的worker,从而实现...

    Apache+Tomcat服务器集群配置详细步骤

    ### Apache+Tomcat服务器集群配置详细步骤 #### 一、引言 在现代Web开发中,随着业务规模的不断扩大和用户需求的日益增长,单一服务器往往难以满足高性能、高可靠性的要求。为了应对这一挑战,通常采用Apache+...

    Apache+Tomcat整合

    Apache 和 Tomcat 整合是将 Apache 作为前端服务器,负责处理静态内容和反向代理,而 Tomcat 作为后端应用服务器,处理 Java 应用的动态请求。这种架构可以充分利用两者的优点,提高系统性能和可扩展性。下面我们将...

    apache+tomcat整合.pdf

    在讨论Apache与Tomcat的整合之前,首先需要了解Apache和Tomcat的基本概念。Apache HTTP Server(通常简称为Apache)是一个广泛使用的开源网页服务器,它非常擅长处理静态内容,如HTML页面和图片等。而Tomcat是一个...

    Apache+Tomcat+JK 实现集群负载均衡文档

    - `worker.tomcat1.type=ajp13` - `worker.tomcat1.lbfactor = 1` 4. **创建uriworkermap.properties**:定义哪些URL请求应发送到哪个Tomcat实例。例如: - `/*.jsp=controller` 5. **修改Tomcat配置**:在每个...

    apache + tomcat + mod_jk集群

    Apache、Tomcat以及mod_jk模块组成的集群架构是一种常见的高性能Web服务器和应用服务器组合,用于处理高并发和负载均衡的场景。在这个配置中,Apache作为前端服务器,通过mod_jk模块与后端的Tomcat应用服务器进行...

    Apache+JK+Tomcat搭建负载均衡

    在本方案中,Apache使用了mod_jk模块,这是一个Apache与Tomcat之间的连接器,它负责处理AJP(Apache JServ Protocol)协议,将HTTP请求转发到Tomcat实例。mod_jk与Tomcat的通信基于AJP13协议,它能高效地传输数据,...

    Apache+tomcat实现负载均衡

    通常,这意味着将`Connector`的`protocol`属性设置为`AJP/1.3`或`HTTP/1.1`,并确保没有防火墙阻止Apache和Tomcat之间的通信。 完成以上步骤后,重启Apache和Tomcat服务器,负载均衡设置就生效了。通过监控系统性能...

    apache+tomcat+memcached

    - 配置Tomcat:确保Java环境已安装并配置,将MSM相关的jar包放入Tomcat的lib目录,修改Tomcat配置文件(如server.xml)启用AJP协议和MSM。 7. 后续步骤 - 重启Apache和Tomcat服务,确保配置生效。 - 测试集群...

    Apache+Tomcat集群

    - 这个文件定义了Apache与Tomcat之间的连接配置,包括每个Tomcat实例(如tomcat1和tomcat2)的AJP端口、主机地址和类型。`lbfactor`权重参数用于决定哪个服务器处理更多的请求。 - `controller`是一个负载均衡控制...

    apache +tomcat集群 ajp_proxy实际操作

    ### Apache + Tomcat集群与AJP Proxy实际操作详解 #### Apache服务器安装与配置 Apache作为一款广泛使用的开源HTTP服务器,在企业级应用环境中扮演着至关重要的角色。尤其在与Tomcat结合形成集群时,Apache能够有效...

    Apache+Tomcat+6高级编程

    3. **Apache与Tomcat的集成**:重点讲述了AJP协议(Apache-Java-Protocol)的使用,它是Apache与Tomcat之间通信的默认协议,以及如何配置mod_jk或mod_proxy_ajp模块进行集成。此外,还讨论了HTTP代理和反向代理的...

    Apache+Tomcat+Linux集群和负载均衡

    ### Apache+Tomcat+Linux集群和负载均衡 在IT领域,Apache+Tomcat+Linux集群与负载均衡技术是实现高可用性、高性能Web服务的重要手段之一。本文将围绕这一主题展开详细讨论,涵盖关键技术概念、配置流程及注意事项...

    apache+tomcat 负载平衡

    这两个模块提供了与Tomcat之间的AJP(Apache JServ Protocol)通信,AJP是一种轻量级的协议,适用于在Web服务器和应用服务器之间传输数据。它们可以实现更高效的数据传输,但配置比mod_proxy略复杂。 5. **健康...

    Apache+Tomcat环境搭建

    Apache 和 Tomcat 集成配置是将两个服务器软件协同工作,实现动态内容(如 JSP、Servlet)处理。Apache 通常作为静态内容服务器,而 Tomcat 专注于处理 Java 应用程序。以下是对如何搭建 Apache + Tomcat 环境的详细...

    apache+tomcat负载

    4. **配置Tomcat**:配置每个Tomcat实例的`server.xml`,添加AJP监听器,以接收来自Apache的请求。 5. **测试和优化**:启动Apache和Tomcat,通过测试确保集群工作正常,根据实际需求调整负载均衡策略和故障转移设置...

    Apache+tomcat+ssl配置+相关插件

    至于Tomcat,你可能需要在server.xml文件中配置AJP连接器,确保Tomcat可以接收来自Apache的请求: ```xml <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> ``` 在上述配置中,`redirectPort`...

    apache+tomcat整合配置

    整合Apache和Tomcat时,确保两者之间的通信是加密的,可以通过配置Apache的SSL支持并使用AJP over SSL。同时,对Apache和Tomcat进行安全配置,如限制不必要的网络访问,避免敏感信息泄露。 7. **负载均衡与集群** ...

Global site tag (gtag.js) - Google Analytics