首页 > 代码库 > linux下apache+tomcat负载均衡和集群
linux下apache+tomcat负载均衡和集群
先说下我的环境
一台ubuntu的虚拟机,
一个apache2.2的实例
两个tomcat1.7的实例
1.安装apache服务器
sudo apt-get install apache2如果要重启的话,运行命令:
sudo /etc/init.d/apache2 restart
ubuntu下的apache会默认创建路径/var/www,apache默认加载的时候,就是加载的这个路径下面的
2.安装两个tomcat实例
去官网下载一个
然后在本地在cp一下,
此时目录结构为:
/home/hehe/my/soft/tomcat1,
/home/hehe/my/soft/tomcat2
3.安装mod_jk
mod_jk实质上是Apache与Tomcat的连接器,并藉此附带提供集群和负载均衡的功能。
地址为http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.31/x86_64/,注意要于你安装的apache的版本对应。
4.配置apache
ubuntu默认会将apache的安装文件放在/etc/apache2下面
进入这个目录之后,新建一个httpd.conf文件
放心apache启动时,会加载这个文件的
然后编译这个文件。加上这么句话
ServerName localhost:80 include mod_jk.conf
然后我们在当前路径下新建一个mod_jk.conf文件
这里先要将mod_jk-1.2.31-httpd-2.2.x.so放在当前路径下
#load module mod_jk-1.2.31-httpd-2.2.3.so is for Apache 2.2.x. LoadModule jk_module /usr/lib/apache2/modules/mod_jk-1.2.31-httpd-2.2.x.so #这个是用来配置负载的 JkWorkersFile workers.properties #这个是打印日志 JkLogLevel debug #这个是日志的名称 JkLogFile mod_jk.log #打印的级别 JkLogLevel warn
所以在当前路径下咱们还得新建一个 mod_jk.log,文件,这里面会记录日志
接下来配置workers.properties文件
在当前路径下新建一个workers.properties文件
#负载均衡器 worker.list=LB_worker,worker_1,worker_2,jkstatus #第一个tomcat的配置 worker.worker_1.host=localhost #tomcat在哪个机器上面,若是别的机器,需要写上别的机器的ip地址 worker.worker_1.port=8009 #端口,等会在tomcat里面配置的时候要一一对应 worker.worker_1.type=ajp13 worker.worker_1.lbfactor=1 #加载因子 #第二个tomcat的配置 worker.worker_2.host=localhost worker.worker_2.port=9009 worker.worker_2.type=ajp13 worker.worker_2.lbfactor=1 #类型是一个负载均衡器 worker.LB_worker.type=lb #重试三次 worker.LB_worker.retries=3 #负载给tomcat1和tomcat2 worker.LB_worker.balance_workers=worker_1,worker_2 #这是说session的粘性,就是说同一个session是否提交给同一个tomcat,因为等会儿,集群的时候要用到一个session提交给两台机器,所以设置为false worker.LB_worker.sticky_session=false worker.LB_worker.sticky_session_force=false #jk的状态 worker.jkstatus.type=status5.配置请求交给负载均衡器
在/etc/apache2/sites-available下有个default文件,
在这个文件的最后一句话</VirtualHost>之前加上这么一段
JkMount /*.jsp LB_worker JkMount /jkstatus jkstatus然后就交给了LB_worker
6.接下来配置tomcat1
改一下conf下面的server.xml文件,改端口,和上面的对应
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
然后找到这句话,改成这样,注意worker_1和workers.properties对应
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker_1">
若是集群的话,还要改一句话,把这句话的前后的注释符号给去掉,放开
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
接下来配置tomcat2
先把下面这句话给改了,端口号改为8006
<Server port="8006" shutdown="SHUTDOWN">
然后改下面这句
<Connector port="9082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="9443" />
改一下conf下面的server.xml文件,改端口,和上面的对应
<Connector port="9009" protocol="AJP/1.3" redirectPort="9443" />
然后找到这句话,改成这样,注意worker_2和workers.properties对应
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker_2">
若是集群的话,还要改一句话,把这句话的前后的注释符号给去掉,放开
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
7.新建一个项目mytest,里面有一个叫wel.jsp的文件,
这个jsp的内容是:
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <% System.out.println("this is tomcat server nod 2"); %> <% int i=0; while(i<3000){i++; } out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>this is tomcat server nod 2"); %> </body> </html>然后将这个项目放在tomcat2的webapp下面
同时也放在tomcat1的目录下
注意,下面这句改成这样,2改为1
System.out.println("this is tomcat server nod 1");
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>this is tomcat server nod 1");
然后在浏览器里面访问
http://127.0.0.1/mytest/wel.jsp
不断的刷新页面,你会发现其在node1,和node2之间不断换,说明请求有时候交给了1,有时候交给了tomcat2,实现了负载均衡的功能
下面在来实现tomcat1,和tomcat2的集群功能
所谓集群就是,一个客户端的对应的session在两个tomcat中有一模一样的对应的session
在mytest里面在新建一个wel2.jsp文件
里面的内容为:
<%@ page contentType="text/html; charset=utf-8" %> <%@ 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("attributeName"); if (dataName != null && dataName.length() > 0) { String dataValue = http://www.mamicode.com/request.getParameter("attributeValue");></form> </body> </html>两个tomcat里面都有一个这样的文件然后两个tomcat的web.xml下面加上下面这句话
<distributable/>,两个session之间能相互复制
重启
然后访问http://10.211.55.3/mytest/wel2.jsp
重新输入这个地址
你会发现确实交给了两个服务器,而且session里面的值一模一样!集群完成。
linux下apache+tomcat负载均衡和集群