您的位置:首页 > 运维架构 > Tomcat

apache与tomcat及负载均衡与集群入门

2013-04-12 11:11 232 查看
一、apache与tomcat的区别:

Apache是一个web服务器环境程序,可以作为web服务器使用。不过只支持静态网页,如(asp,php,cgi,jsp)等动态网页的就显得无能为力。

如果想让服务器也能处理动态页面,那么就需要Tomcat。

当处理静态页面时,Tomcat不如Apache迅速。Tomcat不象Apache一样可配置(如:可以作为一个代理服务器,即loadbalaner)。

Tomcat不象Apache一样强壮。

基于以上原因,一个现实的网站使用一个Apache作为Web服务器,为网站的静态页面请求提供服务;并使用Tomcat服务器作为一个Servlet/JSP插件,显示网站的动态页面。

apache+tomcat是企业级的应用 ! ---->采用apache+tomcat结合应用
!

1.Apache主要用来解析静态文本,如html,tomcat也有此功能,但apache能大大提高效率,对于并发数较大的企业级应用,能更好的显示apache的高效率;

2.Tomcat用来解析jsp,servlet等,所有的客户请求首先会发送到apache,如果请求是静态文本则由apache解析,并把结果返回给 客户端,如果是动态的请求,如jsp,apache会把解析工作交给tomcat,由tomcat进行解析(这首先要两者现实整合),tomcat解析完 成后,结果仍是通过apache返回给客户端,这样就可以达到分工合作,实现负载均衡,提高系统的性能!

(2)

用apache实现html和jsp文件分离访问:

apache在处理静态页面及资源文件(图片,CSS文件)的优势-->作为图片服务器,将动态页面请求由apache转发到应用服务器tomcat缓解了大并发量下,应用服务器的压力。

默认是不需要配置的,也就是说你把需要给tomcat处理的后缀在配置文件(httpd.conf)中写好,那么剩下的就都是apache处理的了。

将要默认处理的html文件放于apache默认的发布目录下即可。

apache所有的配置,都在httpd.conf中。

配置端口:

Listen 80

DocumentRoot:

应该是定义这个服务器对外发布的超文本文档存放的路径, --》可以修改为任何其它路径。

DocumentRoot "F:/loadBalance/apache/Apache2/htdocs"

也可以自定义虚拟容器。如下面第3点。

(3)

自定义apache的发布目录:

通过修改Apache的配置文件%APACHE2_HOME%/conf/httpd.conf可以定置自己的Apache服务器。注意修改该配置文件前要先停止正

在运行的Apache服务器。

在相应位置增加以下行可以定义自己的文件系统容器,设置自己的本地文件系统到网络空间的映射:

Alias /homepage "D:/heavyz/homepage"

<Directory "D:/heavyz/homepage">

Options Indexes FollowSymLinks -ExecCGI

DirectoryIndex index.php index.html home/index.php home/index.html

Order allow,deny

Allow from all

Deny from enpc.fr

</Directory>

分析:

以上语句通过<Directory>标签定义了一个文件系统容器,并使用Alias指令把该容器映射到/homepage的URL上去。通过这里的设置,不会影响原来的DocumentRoot,或其它的已自定义的文件系统容器。

在该文件系统容器中还定义了一系列属性。对上述配置的解释如下:

* <Directory "D:/heavyz/homepage"> and </Directory> : 定义本地文件系统容器,该容器位于D:/heavyz/homepage中。

* Alias /homepage "D:/heavyz/homepage" : 当URL中的路径名为/homepage时,将映射到该文件系统容器中。

* Options Indexes FollowSymLinks -ExecCGI : 当搜索不到默认首页时,允许列出目录的内容;允许目录中的符号链;不允许执行CGI脚本。

* DirectoryIndex index.php index.html home/index.php home/index.html : 按照列出的四个本地URL搜索默认首页,最先找到的文件作为首页返回。(即若URL:http://localhost/homepage,则会先搜索默认首页,若查不到相应的默认首面,则根据第二点配置,显示homepage当前目录的文件列表)

* Order allow,deny : Order规定了HTTP客户的访问权限。先允许再禁止(allow,deny)表明allow中允许的访问权限优先级低于deny中禁止的访问权限。

* Allow from all : 先允许来自任何地方的HTTP客户的访问请求。

* Deny from enpc.fr : 再禁止域名为enpc.fr的HTTP客户的访问请求(国立路桥学校ENPC的主机不允许访问该页面),对于这些客户,服务器返回403 Forbidden信息。注意Order中定义了deny的优先级高于allow,故该指令将生效。

假设在本地文件系统上存在文件D:\heavyz\homepage\index.html,重新启动Apache服务器,并访问页面:http://localhost/homepage将可以访问到上述文件(前提是你不在ENPC的网络内)。

---------------------------------------------------------------------

(4)

目前比较常用的负载均衡技术主要有:

1. 基于DNS的负载均衡

通过DNS服务中的随机名字解析来实现负载均衡,在DNS服务器中,可以为多个不同的地址配置同一个名字,而最终查询这个名字的

客户机将在解析这个名字时得到其中一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址,他们也就访问不同地址

上的Web服务器,从而达到负载均衡的目的。

2. 反向代理负载均衡 (如Apache+JK2+Tomcat这种组合)

使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载

均衡的目的。这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式

是多个客户使用它访问内部Web服务器,因此也被称为反向代理模式。

3. 基于NAT(Network Address Translation)的负载均衡技术 (如Linux Virtual Server,简称LVS)网络地址转换为在内部地址和外部地址之间进行转换,以便具备内部地址的计算机能访问外部网络,而当外部网络中的计算机访问

地址转换网关拥有的某一外部地址时,地址转换网关能将其转发到一个映射的内部地址上。因此如果地址转换网关能将每个连接均匀转换为不同的内部服务器地址,此后外部网络中的计算机就各自与自己转换得到的地址上服务器进行通信,从而达到负载分担的目的。

二、Apache,Tomcat负载均衡和集群:

1.

对请求的处理又有两种不同的方式:负载平衡、状态复制(即集群).

负载平衡:

每台服务器都是独立的,只是对请求的负载进行平衡,而不对状态(SESSION)进行复制。

状态复制(集群):先进行负载平衡,再在各服务器间复制应用状态。

2.

apache负载均衡的原理:

1).

mod_jk负载平衡原理:

使用mod_jk默认的以轮循方式进行平衡负载,假设有四个服务器节点,有10个请求,则

第一个节点会得到1,5,9请求;

第二个节点会得到2,6,10请求;

第三个节点会得到3,7请求;

第四个节点会得到4,8请求;

2).

Mod_JK2负载均衡与故障复原:

Apache httpd是当成web服务器,使用mod_jk2将请求传送给Tomcat,就可以使用mod_jk2的负载均衡与容错功能。

带有 mod_jk2的Apache(httpd)可以做的事情包括:

A、将请求分配至一或多个Tomcat实例上你可以在mod_jk2的workers.properties文件中,设定许多Tomcat实例,并赋于每个实例一个lb_factor值,以作为请求分配的加权因子。

B、侦测Tomcat实例是否失败当Tomcat实例的连接器服务不再响应时,mod_jk2会及时侦测到,并停止将请求送给它。其他的Tomcat 实例则会接受失效实例的负载。

C、侦测Tomcat实例在失效后的何时恢复因连接器服务失效,而停止将请求分配给Tomcat实例之后,mod_jk2会周期性地检查是否已恢复使用性,并自动将其加入现行的Tomcat实例池中。

3).

实践证明,在各应用服务器之间不需要状态复制的情况下,负载平衡可以达到性能的线性增长及更高的并发需求。

3 集群原理:

集群方式也是使用这种方法进行平衡。Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制。

集群与负载均衡的优缺点:

不足:

集群不同于负载平衡的是,由于集群服务需要在处理请求之间不断地进行会话复制,复制后的会话将会慢慢变得庞大,因此它的资

源占用率是非常高的,如果在并发量大的应用中,复制的会话大小会变得相当大,而使用的总内存更是会迅速升高。

优点:

但集群的会话复制,增加了系统的高可用性。由于在每台服务器都保存有用户的Session信息,如果服务器群中某台当机,应用可以自动切换到其它服务器上继续运行,而用户的信息不会丢失,这提高了应用的冗错性。

具体采用负载平衡还是集群,这要看应用的需求了。

(6)

Apache,Tomcat负载均衡和集群配置:

0,环境说明

Apache :apache_2.0.55 1 个

Tomcat: apache-tomcat-5.5.17 (zip版) 2个

mod_jk:: mod_jk-apache-2.0.55.so 1个

第一部分:实现负载均衡

负载均衡,就是apache将客户请求均衡的分给tomcat1,tomcat2....去处理

1.下载,安装apche,tomcat
http://httpd.apache.org/ 下载Apache 2.0.55
http://tomcat.apache.org/download-55.cgi 下载tomcat5.5 zip版本(解压即可,绿色版)
http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/ 下载mod_jk,注意和 apache版本匹配

本文附件中,以有apache_2.0.55+mod_jk-apache-2.0.55.so。可直接下载使用。

安装apache:

此处注意,如果你本机已经装了iis并且占用80端口,务必先在服务中将iis停止或禁用。

软件默认安装即可。安装过程中设置Network Domain和Server Name为localhost,设置你的email(可任意设置)地址,下方会让你选择only for the current user或for all users。默认选择for all users。这样Apache就会占用80端口,并且做为一个系统服务开机自运行。

安装完成之后,你在浏览器中输入http://localhost,将会看到Apache的成功页面.此时 Apache,已经运行,你可以在窗口的托盘看到他的图标,双击图标,在弹开的窗口选择"Open Apache Monitor",点Stop,停止Apaceh服务,因为下面要安装Tomcat和JK.

JK的安装:

把mod_jk_2.0.55.so拷贝到d:\Apache \Apache2\modules\下.

以上安装全部完成后,打开cmd命令提示符,运行d:\Apache\Apache2\bin\Apache.exe
-t 你将会看到"Syntax OK",表示Apache配置正常.这个命令非常有用,下面在继续配置Apache的时候还会再次用到。

2.修改Apache配置文件http.conf

在apache安装目录下conf目录中找到http.conf

在文件最后加上下面一句话就可以了

include "E:\ide\apache\Apache2\conf\mod_jk.conf"





2. http.conf 同目录下新建mod_jk.conf文件,内容如下(或直接将此内容写到上面的文件中也可)

#加载mod_jk Module

LoadModule jk_module modules/mod_jk-apache-2.0.55.so

#指定 workers.properties文件路径

JkWorkersFile conf/workers.properties

#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器

JkMount /*.jsp controller

也可以根据需要添加,如:

JkMount /servlet/* controller

JkMount /*.do controller

3. 在http.conf同目录下新建 workers.properties文件,内容如下

worker.list = controller #server 列表

#========tomcat1========

worker.tomcat1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009

worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多

#========tomcat2========

worker.tomcat2.port=9009 #ajp13 端口号,在tomcat下server.xml配置,默认8009

worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多

#========controller, 负载均衡控制器========

worker.controller.type=lb

worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat

worker.controller.sticky_session=true

worker.porperties配置说明:

假设定义了两个worker,一个为server99,另一个为server202,定义了一个负载平衡服务器loadbalancer。

A、worker.list=loadbalancer

设定工作的负载平衡器,各Tomcat节点不能加入此列表。

B、worker.server99.lbfactor

负载平衡的权重比,如果此权重比越大,则分配到此节点的请求越多,如以上两个节点的权重比为1:1,则为平均分配。

C、worker.loadbalancer.balance_workers=server99,server202

指定此负载平衡器负责的Tomcat应用节点。

D、worker.loadbalancer.sticky_session=true

此处指定集群是否需要会话复制,如果设为true,则表明为会话粘性,不进行会话复制,当某用户的请求第一次分发到哪台

Tomcat后,后继的请求会一直分发到此Tomcat服务器上处理;如果设为false,则表明需求会话复制。

4.修改tomcat配置文件server.xml

如果你在不同电脑上安装tomcat,tomcat的安装数量为一个,可以不必修改tomcat配置文件.我这里是在同一台电脑上安装两个tomcat,所以需要更改其中一个的设置

打开 tomcat2/conf/server.xml文件







5. 编写一个测试jsp

建立一个目录test.里面新建一个test.jsp,内容为

<%

System.out.println("===========================");

%>

把test放到tomcat1,tomcat2的webapps下

6. 启动apache,tomcat1,tomcat2,进行测试

通过 http://localhost/test/test.jsp 访问,查看tomcat1的窗口,可以看到打印了一行"=========="

再刷新一次,tomcat2也打印了一条,再刷新,可以看到请求会被tomcat1,tomcat2轮流处理,实现了负载均衡



第二部分,配置集群

只配置负载均衡还不行,还要session复制,也就是说其中任何一个tomcat的添加的session,是要同步复制到其它tomcat, 集群内的tomcat都有相同的session

1. 修改tomcat1, tomcat2的server.xml,将集群部分配置的在注释符删掉,并将tomcat2的4001端口改为4002,以避免与 tomcat冲突,当然,如果是两台电脑,是不用改端口的,去掉注释符即可









2,修改测试项目test

修改test.jsp,内容如下

<%@ page contentType="text/html; charset=GBK" %>

<%@ page import="java.util.*" %>

<html><head><title>Cluster App Test</title></head>

<body>

Server Info:

<%

out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>

<%

out.println("<br> ID " + session.getId()+"<br>");

// 如果有新的 Session 属性设置

String dataName = request.getParameter("dataName");

if (dataName != null && dataName.length() > 0) {

String dataValue = request.getParameter("dataValue");

session.setAttribute(dataName, dataValue);

}

out.print("<b>Session 列表</b>");

Enumeration e = session.getAttributeNames();

while (e.hasMoreElements()) {

String name = (String)e.nextElement();

String value = session.getAttribute(name).toString();

out.println( name + " = " + value+"<br>");

System.out.println( name + " = " + value);

}

%>

<form action="index.jsp" method="POST">

名称:<input type=text size=20 name="dataName">

<br>

值:<input type=text size=20 name="dataValue">

<br>

<input type=submit>

</form>

</body>

</html>

然后在test 新建WEB-INF目录,WEB-INF下新建web.xml,内容如下

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">

<display-name>TomcatDemo</display-name>

<distributable/>

</web-app>

注意:在你的应用的web.xml加入 <distributable/>即可

ok,讲test复制到tomcat1,tomcat2的webapps下,重启 apache,tomcat1,tomcat2,

输入网址 http://localhost/test/test.jsp
新建一个 名称为 xiaoluo ,值为 cdut 的session,提交查询,新开一个ie窗口,再提交查询,如图,可以看到,两个tomcat 是负载均衡,并且session同步的



需要注意的是,配置集群时设置 jvmRoute时,要把原来的Engine注释掉,去掉上面那一行的注释,也就是修改成

<!-- You should set jvmRoute to support load-balancing via JK/JK2 ie : -->

<Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="tomcat1">

(3)

设置apache负载均衡器的log格式:

#加载mod_jk模块

LoadModule jk_module modules/mod_jk-1.2.14-apache-2.0.54.so

# Where to find workers.properties

JkWorkersFile conf/workers2.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] "

# JkOptions indicate to send SSL KEY SIZE,

JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat set the request format

JkRequestLogFormat "%w %V %T"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: