使用apache和nginx代理实现tomcat负载均衡及集群配置详解

实验环境:

1、nginx的代理功能

nginx proxy:

eth0: 192.168.8.48

vmnet2 eth1: 192.168.10.10

tomcat server1:

vmnet2 eth0: 192.168.10.20

tomcat server2:

vmnet2 eth0: 192.168.10.30

# yum install -y nginx-1.8.1-1.el6.ngx.x86_64.rpm

# vim /etc/nginx/conf.d/default.conf

location / {

root  /web/htdocs;

index index.jsp index.html index.htm;

}

location ~* \.(jsp|do|action)$ {

proxy_pass http://192.168.10.20;

}

location ~* \.(jpg|jpeg|gif|png|pdf|doc|rar|exe|zip|)$ {

proxy_pass http://192.168.10.30;

}

2、apache的代理功能

①http方式的代理

# cd /etc/httpd/conf.d/

# vim mod_proxy.conf

加入如下内容:

ProxyRequests off

ProxyPreserveHost on

ProxyPass / http://192.168.10.20/

ProxyPassReverse / http://192.168.l0.20/

<Location />

Order Allow,Deny

Allow from all

</Location>

②ajp方式的代理

ProxyVia on

ProxyRequests off

ProxyPreserveHost on

ProxyPass / ajp://192.168.10.20/

ProxyPassReverse / ajp://192.168.l0.20/

<Location />

Order Allow,Deny

Allow from all

</Location>

②、配置apache基于mod_jk的负载均衡

a.安装apxs插件

# yum install -y httpd-devel

# tar xf tomcat-connectors-1.2.37-src.tar.gz

# cd tomcat-connectors-1.2.37-src/native

# ./configure --with-apxs=/usr/sbin/apxs

# make && make install

配置相关文件

# cd /etc/httpd/conf.d

# vim mod_jk.conf

LoadModule jk_module modules/mod_jk.so

JkWorkersFile /etc/httpd/conf.d/workers.properties

JkLogFile logs/mod_jk.log

JkLogLevel notice

JkMount /* TomcatA

JkMount /status/ statA

# vim workers.properties

worker.list=TomcatA,statA

worker.TomcatA.type=ajp13

worker.ToccatA.port=8009

worker.TomcatA.host=192.168.10.20

worker.TomcatA.lbfactor=1

worker.statA.type=status

访问如下地址,可以看到tomcat server1的状态

http://192.168.8.48/status/

③使用mod_jk配置负载均衡服务器

配置代理服务器

# cd /etc/httpd/conf.d

# cat mod_jk.conf

LoadModule jk_module modules/mod_jk.so

JkWorkersFile /etc/httpd/conf.d/workers.properties

JkLogFile logs/mod_jk.log

JkLogLevel notice

JkMount /* lbcA

JkMount /status/ statA

# cat workers.properties

worker.list=lbcA,statA

worker.TomcatA.type=ajp13

worker.TomcatA.port=8009

worker.TomcatA.host=192.168.10.20

worker.TomcatA.lbfactor=1

worker.TomcatB.type=ajp13

worker.TomcatB.port=8009

worker.TomcatB.host=192.168.10.30

worker.TomcatB.lbfactor=1

worker.lbcA.type=lb

worker.lbcA.sticky_session=1

worker.lbcA.balance_workers=TomcatA,TomcatB

worker.statA.type=status

配置后端tomcat

# cd /usr/local/tomcat/webapps/

# mkdir testapp

# cd testapp/

# mkdir -pv WEB-INF/{classes,lib}

mkdir: created directory `WEB-INF‘

mkdir: created directory `WEB-INF/classes‘

mkdir: created directory `WEB-INF/lib‘

# vim index.jsp

TOMCATA服务器

index.jsp:

<%@ page language="java" %>

<html>

<head><title>TomcatA</title></head>

<body>

<h1><font color="red">TomcatA.chinasoft.com</font></h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("chinasoft.com.com","chinasoft.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

TOMCATB服务器

index.jsp:

<%@ page language="java" %>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB.chinasoft.com</font></h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("chinasoft.com","chinasoft.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

测试是否OK

# curl http://192.168.10.20:8080/testapp/index.jsp

# curl http://192.168.10.30:8080/testapp/index.jsp

配置session会话绑定(会破坏负载均衡效果):

负载均衡,且实现会话绑定要注意给每个tomcat实例的egine容器一个jvmRoute属性!此名称要跟前端调度模块使用名称保持一致!

另外,在mod_proxy实现负载均衡的会话绑定时,还要使用sticksession=JSESSIONID(字符要大写)!

worker.properties:

worker.TomcatB.lbfactor=1

在后端tomcat服务器server.xml文件中定义jvmRoute:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

④.apache mod_proxy实现基于http的负载均衡配置:

# mv mod_jk.conf mod_jk.conf.bak

# mv mod_proxy.conf.bak mod_proxy.conf

# vim mod_proxy.conf

ProxyVia on

ProxyRequests off

ProxyPreserveHost on

<Proxy balancer://lb>

BalancerMember http://192.168.10.20:8080 loadfactor=1 route=TomcatA

BalancerMember http://192.168.10.30:8080 loadfactor=1 route=TomcatB

</Proxy>

ProxyPass / balancer://lb/

ProxyPassReverse / balancer://lb/

<Location />

Order Allow,Deny

Allow from all

</Location>

⑤.配置session会话的持久性

ProxyVia on

ProxyRequests off

ProxyPreserveHost on

<Proxy balancer://lb>

BalancerMember http://192.168.10.20:8080 loadfactor=1 route=TomcatA

BalancerMember http://192.168.10.30:8080 loadfactor=1 route=TomcatB

</Proxy>

ProxyPass / balancer://lb/ stickysession=JSESSIONID

ProxyPassReverse / balancer://lb/

<Location />

Order Allow,Deny

Allow from all

</Location>

⑥.配置管理接口

ProxyVia on

ProxyRequests off

ProxyPreserveHost on

<Proxy balancer://lb>

BalancerMember http://192.168.10.20:8080 loadfactor=1 route=TomcatA

BalancerMember http://192.168.10.30:8080 loadfactor=1 route=TomcatB

</Proxy>

<Location /lbmanager>

SetHandler balancer-manager

</Location>

ProxyPass /lbmanager !

ProxyPass / balancer://lb/

ProxyPassReverse / balancer://lb/

<Location />

Order Allow,Deny

Allow from all

</Location>

访问:http://192.168.8.48/lbmanager,可以看到负载均衡的状态界面

集群配置:

负载均衡器:

192.168.10.10:

# vim mod_proxy.conf

ProxyVia on
ProxyRequests off
ProxyPreserveHost on

<Proxy balancer://lb>
  BalancerMember http://192.168.10.20:8080 loadfactor=1 route=TomcatA
  BalancerMember http://192.168.10.30:8080 loadfactor=1 route=TomcatB
</Proxy>

<Location /lbmanager>
  SetHandler balancer-manager
</Location>

ProxyPass /lbmanager !
ProxyPass / balancer://lb/
ProxyPassReverse / balancer://lb/

<Location />
  Order Allow,Deny
  Allow from all
</Location>

192.168.10.20:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
	 channelSendOptions="8">

  <Manager className="org.apache.catalina.ha.session.DeltaManager"
	   expireSessionsOnShutdown="false"
	   notifyListenersOnReplication="true"/>

  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
		address="228.1.0.4"
		port="45564"
		frequency="500"
		dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
	      address="192.168.10.20"
	      port="4000"
	      autoBind="100"
	      selectorTimeout="5000"
	      maxThreads="6"/>

  <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
      <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    </Sender>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
  </Channel>

  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
	 filter=""/>
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
	    tempDir="/tmp/war-temp/"
	    deployDir="/tmp/war-deploy/"
	    watchDir="/tmp/war-listen/"
	    watchEnabled="false"/>

  <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

192.168.10.30:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
	 channelSendOptions="8">

  <Manager className="org.apache.catalina.ha.session.DeltaManager"
	   expireSessionsOnShutdown="false"
	   notifyListenersOnReplication="true"/>

  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
		address="228.1.0.4"
		port="45564"
		frequency="500"
		dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
	      address="192.168.10.30"
	      port="4000"
	      autoBind="100"
	      selectorTimeout="5000"
	      maxThreads="6"/>
	<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
 filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
    tempDir="/tmp/war-temp/"
    deployDir="/tmp/war-deploy/"
    watchDir="/tmp/war-listen/"
    watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

并在各集群节点上添加路由信息:

route add -net 228.1.0.4 netmask 255.255.255.255 dev eth0

并在:

web.xml节点上添加:

<distributable/>

可以看到session id没有变化

时间: 2024-10-06 16:21:04

使用apache和nginx代理实现tomcat负载均衡及集群配置详解的相关文章

基于apache的tomcat负载均衡和集群配置

最近不是很忙,用零碎时间做点小小的实验. 以前公司采用F5负载均衡交换机,F5将请求转发给多台服务器,每台服务器有多个webserver实例,每个webserver分布在多台服务器,交叉式的分布集群.F5只是简单了解,毕竟那玩意几十万的价格实在不是我一个小喽喽能弄来做试验玩的,而起公司也不能开放权限.后来知道apache.Nginx软件可以实现负载(F5是操作于IOS网络模型的传输层,Nginx.apache是基于http反向代理方式,位于ISO模型的第七层应用层.直白些就是TCP UDP 和h

apache + tomcat 负载均衡分布式集群配置

Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问量过大,就会出现服应用务器崩溃的情况,这个时候怎么办,难道就只能去重启服务器吗?好,如果是一般的小型公益网站到也无所谓,但如果是比如像大型航空公司售票等电子商务网站,每天每小时都有大量的订单业务,如果这些售票系统一旦崩溃后,再去重启,这些时间和客户的损失就直接会影响到航空公司的利益,这些损失如何去避

基于apache的tomcat负载均衡和集群配置session共享

接上面的话题接着继续完善.为什么没接到上篇呢?原因很简单太长的文章不爱看!就像有人写了上千行的方法一样,不是逼得没办法谁爱看谁看,反正我不看. 期间我没有一次配置成功,从失败的开始说起, 1.准备jar包 注意:不同的tomcat版本(tomcat6,tomcat7)所需的包不一样,需要针对tomcat版本下载对应的包. 这是采用的最新稳定版1.6 首先我到官网:http://code.google.com/p/memcached-session-manager/下载了最新的jar 由于公司网络

Centos基于Apache的Tomcat负载均衡和集群

Centos基于Apache的Tomcat负载均衡和集群 一.背景原理1.tomcat 做个WEB服务器有它的局限性,处理能力低,效率低.承受并发小(1000左右).但目前有不少网站或者页面是JSP的.并采用了tomcat做为WEB,因此只能在此基础上调优.2.目前采取的办法是Apache + Mod_JK + tomcat 来解决一部分请求,用户访问的是apache,但有jsp页面的时候才会去请求tomcat.如果量一大,那么tomcat无法承受,那么只能做tomat集群,Apache + M

基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置

第一章. 背景简介 对于大多数企业应用,都希望能做到7*24小时不间断运行.要保持如此高的可用性并非易事,比较常见的做法是将系统部署到多台机器上,每台机器都对外提供同样的功能,这就是集群.系统变为集群时,除了要求系统能够支持水平伸缩外,还要解决两个问题: 1, 如何均衡地访问到提供业务功能的机器. 2, 如何保证当机器出现问题时,用户能自动跳转到另外的机器,不影响使用. 常用的负载均衡技术有硬件和软件两种,本示例常用软件的技术实现.软件也有很多实现技术,如基于apache的mod_jk以及mod

Apache、Tomcat负载均衡与集群

一. 环境准备 1.软件下载 a) apache_2.0.55-win32-x86-no_ssl.msi: b) apache-tomcat-5.5.17.rar c) mod_jk-apache-2.0.55.so 下载地址: http://download.csdn.net/detail/crazyiter_com/4178657 2.软件安装 a)  Apache安装路径为:E:\ide\apache\Apache2 (具体可以根据自己的盘符而定) b) Tomcat放置位置和名称注意:

Apache + Tomcat集群配置详解 (1)

一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://tomcat.apache.org/download-60.cgi,下载Tomcat 6.0.18 zip文件 注意:由于Apache和Tomcat项目与集群相关的模块均处于持续发展和优化过程中,因此笔者不保证本文配置方法对所有Apache和Tomcat版本均适用. 二.软件安装 把Apache安装为运

Apache + Tomcat集群配置详解

Apache + Tomcat集群配置详解 一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://tomcat.apache.org/download-60.cgi,下载Tomcat 6.0.18 zip文件 注意:由于Apache和Tomcat项目与集群相关的模块均处于持续发展和优化过程中,因此笔者不保证本文配置方法对所有Apache和Tomcat版本均

使用LVS实现负载均衡原理及安装配置详解

转:http://www.cnblogs.com/liwei0526vip/p/6370103.html 使用LVS实现负载均衡原理及安装配置详解 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学习 LVS 并对其进行了详细的总结记录. 一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director