Tomcat+apache实现负载均衡
实验环境:Red Hat Enterprise Linux Server release 6.4内核:Linux 2.6.32-358.el6.x86_64
下载jdk和tomcat
Jdk
老版本:jdk-6u31-linux-x64-rpm.bin
http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u45-oth-JPR
新版本:jdk-7u9-linux-x64.rpm
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
Tomcat :apache-tomcat-7.0.42.tar.gz
http://tomcat.apache.org/download-70.cgi
一、配置安装tomcat,主机ip:172.16.5.12 hostname www.a.com
1、装jdk
jdk-7u9-linux-x64.rpm直接rpm -ivh就行了
我使用jdk-6u31-linux-x64-rpm.bin安装
# chmod +x jdk-6u31-linux-x64-rpm.bin
# ./jdk-6u31-linux-x64-rpm.bin
Press Enter to continue.....
直接ctrl+c退出
# cd /usr/java
# ls
default jdk1.6.0_31 latest
#vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
# . /etc/profile.d/java.sh
# java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04) 运行环境版本
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)HotSpot(TM) Java虚拟机的名称
2、装tomcat
# tar xf apache-tomcat-7.0.42.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv apache-tomcat-7.0.42 tomcat
# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
# . /etc/profile.d/tomcat.sh
# cd /usr/local/tomcat/bin
# catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:/usr/java/latest
Using CLASSPATH:/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.42
Server built: Jul 2 2013 08:57:41
Server number: 7.0.42.0
OS Name:Linux
OS Version:2.6.32-358.el6.x86_64
Architecture: amd64
JVM Version: 1.6.0_31-b04
JVM Vendor:Sun Microsystems Inc.
# catalina.sh start 启动服务
# catalina.sh stop 停止服务
http://172.16.5.12:8080/
Tomcat 默认监听8080端口
对Apache tomcat进行管理,需要配置 /usr/local/tomcat/conf/tomcat-users.xml
图中有说明如何配置 ,需要加入两组用户
# vim /usr/local/tomcat/conf/tomcat-users.xml
3、可以为tomcat写一个服务脚本,让他开机自动启动
# vim /etc/rc.d/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
exec $CATALINA_HOME/bin/catalina.sh $*
# chmod +x /etc/rc.d/init.d/tomcat
# chkconfig --add tomcat
# chkconfig tomcat on
# service tomcat stop
二、自定义一个虚拟主机,提供java程序页面
下载论坛程序JspRun!_6.0.0_GBK.zip
http://down.chinaz.com/soft/24848.htm
# mkdir -pv /web/app1
# unzip JspRun!_6.0.0_GBK.zip
# cp -rp upload/* /web/app1/
# vim /usr/local/tomcat/conf/server.xml
# service tomcat stop
# service tomcat start 浏览器中输入http://172.16.5.12/install.jsp
安装即可
中间要为论坛创建一个数据库管理员帐号,要在论坛绑定的数据库中创建,当然,mysqld也是实现要装好的。
三、以上面配置好的tomcat为基础,配置Apache基于mod_jk代理连接tomcat
ajp(Apache jserv protocal)
Apache做代理时,mod_proxy模块对http、https、ajp三种协议都支持,mod_jk则只支持ajp协议。
对于http协议时,tomcat服务器就是一个完全意义上的web服务器。
对于ajp协议时,tomcat服务器是服务器端,代理是客户端,需要连接器连接。需要加载mod_jk.so,需要安装jk连接器来实现。
Apache做代理,支持ajp协议,可以禁用http协议,这样就可以把tomcat完全隐藏在后端,用户只有通过Apache代理才能访问。
Nginx跟后端tomcat建立连接必须基于http协议。
以Apache服务器做代理,进行配置
Ip:172.16.5.11
Hostname www.b.com
后端tomcat服务器
Ip:172.16.5.12
Hostname www.a.com
Apache服务器配置
# yum -y groupintall “ Development tools”“ Server Platform Development”
# yum -y install httpd
# yum -y install apr-devel apr-util-devel httpd-devel(包含apxs)安装jk连接器http://tomcat.apache.org/download-connectors.cgi
JK 1.2.37 Source Release tar.gz
# tar xf tomcat-connectors-1.2.37-src.tar.gz
# cd /root/tomcat-connectors-1.2.37-src/native
# ./configure --with-apxs=/usr/sbin/apxs
# make && make install
# ls /usr/lib64/httpd/modules/
# cd /etc/httpd/conf.d/
# vim mod_jk.conf
注释:# Load the mod_jk
LoadModule jk_module modules/mod_jk.so #加载刚编译的模块
JkWorkersFile /etc/httpd/conf.d/workers.properties # jk连接器的工作属性
JkLogFile logs/mod_jk.log # 日志
JkLogLevel debug #日志级别
JkMount /* TomcatA #加载的实例 与Apache代理的tomcat配置文件中的实例相对应
JkMount /status/ stat1 #start1 在workers.properties 中定义
Workers.properties
# cd /etc/httpd/conf.d/
# vim workers.properties
worker.list=TomcatA,stat1
worker.TomcatA.port=8009#ajp协议监听的端口
worker.TomcatA.host=172.16.5.12 #tomcat服务器 ip
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type = status #状态信息
JkMount /status/ stat1----------》worker.stat1.type = status
TomcatA的解释
在tomcat服务器上编辑配置文件
这样就实现了Apache基于ajp协议对tomcat代理了,重启httpd即可生效。
四、Apache基于mod_jk代理tomcat实现负载均衡
1、另开一台虚拟机,配置ip
# ifconfig eth0 172.16.5.13/16 up
# hostname www.c.com2、安装配置tomcat
3、在代理服务器上修改配置文件/etc/httpd/conf.d/workers.properties
4、便捷配置
# vim /etc/httpd/conf.d/workers.properties
worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 172.16.5.12
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 5
worker.TomcatB.type = ajp13
worker.TomcatB.host = 172.16.5.13
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 5
worker.lbcluster1.type = lb
worker.lbcluster1.sticky_session = 0
worker.lbcluster1.method = R
worker.lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status
5、后端tomcat服务器为
Ip:172.16.5.12 www.a.com
Ip:172.16.5.13 www.c.com
Ip:172.16.5.12 www.a.com
# Vim /usr/local/tomcat/conf/server.xml
# mkdir /web/app2
# vim /web/app2/index.jsp
TomcatA
TomcatA
Session ID
Created on
# service tomcat stop
# service tomcat startIp:172.16.5.13 www.c.com
# Vim /usr/local/tomcat/conf/server.xml
# mkdir /web/app2
# vim /web/app2/index.jsp
TomcatB
TomcatB
Session ID
Created on
# service tomcat stop
# service tomcat start
6、# vim /etc/httpd/conf.d/mod_jk.conf
# Load the mod_jk
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* lbcluster1
JkMount /status/ stat1
# service httpd start可以看到负载均衡
五、Apache基于mod_proxy代理tomcat实现负载均衡
加载mod_proxy,将之前配置的mod_jk.conf删除
负载一台服务器
# cd /etc/httpd/conf.d/
# vim mod_proxy.conf
ProxyVia on
ProxyRequests Off
proxypreservehost off
order allow,deny
allow from all
proxypass / http://172.16.5.11:8080/
proxypa***everse / http://172.16.5.11:8080/
order allow,deny
allow from all
负载均衡
# cd /etc/httpd/conf.d/
# vim mod_proxy.conf
ProxyVia on
ProxyRequests Off
proxypreservehost off
BalancerMember http://172.16.5.11:8080/
BalancerMember http://172.16.5.12:8080/
ProxySet lbmethod=byrequests
SetHandler balancer-manager
proxypass !
Order Deny,Allow
Allow from all
order allow,deny
allow from all
proxypass / balancer://hotcluster/
proxypa***everse / balancer://hotcluster/
order allow,deny
allow from all
注意:require all granted和order allow,deny;allow from all的区别
前者是2.4以后的版本,后者是2.2之前的版本
使用虚拟主机实现反向代理时,可以这样配置完成虚拟主机的状态信息输出
ProxyRequests Off
BalancerMember ajp://172.16.5.11:8009 loadfactor=1
BalancerMember ajp://172.16.5.12:8009 loadfactor=1
ProxySet lbmethod=bytraffic
ServerName localhost
ProxyVia On
ProxyPass / balancer://lbcluster1/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPa***everse / balancer://lbcluster1/
SetHandler balancer-manager
Proxypass !
order allow,deny
allow from all
order allow,deny
allow from all
order allow,deny
allow from all
六、tomcat基于session复制的集群
代理服务器配置mod_proxy的代理配置
# vim /etc/httpd/conf.d/mod_proxy.conf
ProxyVia on
ProxyRequests Off
proxypreservehost off
BalancerMember http://172.16.5.11:8080/ loadfator=1
BalancerMember http://172.16.5.12:8080/ loadfator=1 #权重
ProxySetlbmethod=byrequests
SetHandler balancer-manager
proxypass !
order allow,deny
allow from all
order allow,deny
allow from all
proxypass / balancer://hotcluster/ stickysession=jsessionid
proxypa***everse / balancer://hotcluster/
order allow,deny
allow from all
注意:代理服务可能出现的问题,使用80端口可以代理到后端,使用8080端口却代理不到后端
ap_proxy_connect_backend disabling worker for (172.16.5.11)
Permission denied: proxy: HTTP: attempt to connect to 172.16.5.12:8080 (172.16.5.12) failed
错误原因:
代理服务器的安全策略启用了,关闭安全策略
解决方案:
# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive再次访问,发现可以代理到后端服务器。
后端tomcat的配置
节点1:
# vim /usr/local/tomcat/conf/server.xml
注意其中的组播地址和ip地址,组播地址要尽可能的使用自己定义的,ip地址是节点自己的地址
节点2:
两个节点的组播地址一定要相同,IP地址都是各自自己的ip
我们在/usr/local/tomcat/webapps/中另外为tomcat创建站点目录
# vim /usr/local/tomcat/webapps/testapp
# cd /usr/local/tomcat/webapps/testapp
# mkdir WEB-INF/{lib,classes} -pv (标准化配置)
# vim index.jsp
TomcatA
TomcatA
Session ID
Created on
# service tomcat stop
# service tomcat start
# cd /usr/local/tomcat/conf/
# cp web.xml ../webapps/testapp/WEB-INF/
# vim ../webapps/testapp/WEB-INF/web.xml
version="3.0">
两个节点配置相似,参照配置即可。需要重点注意的是,如果是三台主机配置,代理服务器有两张网卡,一个公网ip,一个内网网关,内网节点配置的ip需要将网关指向代理服务器的内网地址。如果是自己做实验,没有用到那么多地址,也最起码要保证内网地址有默认网关,否则tomcat服务器起不来的。
实验效果图
七、以nginx做代理,实现动静分离,动态的内容代理到tomcat,静态的内容代理到另一台主机,只需要在nginx上添加以下配置即可。
location ~ \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js)$ {
proxy_pass http://172.16.5.13;
proxy_set_header X-Real-IP $remote_addr;
}
location ~ \.(jsp|do|css)$ {
proxy_pass http://172.16.5.12;这里要注意对方端口,tomcat默认是8080
}
八、tomcat原理
tomcat是一个java程序的web平台,然而它又不是一个完整意义上的java EE(java企业级运行平台),所以,现如今很多企业使用开源组件如structs、spring和hibernate来构建复杂的应用。
tomcat是一个java程序的web平台,然而,它的运行需要借助一些类库和工具,当然还有另外的环境机制,这些都是由jdk来实现的。可以说tomcat只是一个java应用程序的容器,而站在它背后的jdk才是运行整个程序的核心。
Tomcat Server处理一个http请求的过程
假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp
1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或 doPost方法
10)Context把执行完了之后的HttpServletResponse对象返回给Host
11)Host把HttpServletResponse对象返回给Engine
12)Engine把HttpServletResponse对象返回给Connector
13)Connector把HttpServletResponse对象返回给客户browser
九、配置文件详解
请参考
http://yulp2010.blog.51cto.com/983828/326799
页:
[1]