Apache負載均衡之mod_proxy模塊實現
實驗環境:一臺虛擬機,IP:192.168.1.117
實驗目的:學習mod_proxy的負載功能,實現Apache反代並且負載到後端兩個tomcat。
實驗步驟:
在/etc/httpd/conf.d目錄下增加配置文件,實現Apache的負載均衡。
# cd /etc/httpd/conf.d
# vim mod_proxy.conf
<Proxy balancer://lbcluser1>
BalancerMember http://192.168.1.117:8080 loadfactor=1 route=TomcatA
BalancerMember http://192.168.1.117:9080 loadfactor=1 route=TomcatB
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass / balancer://lbcluser1/
ProxyPa***everse / balancer://lbcluser/
保存退出
在上面配置文件</Proxy>和ProxyPass / balancer://lbcluser1/ 的中間中添加如下,這樣可以訪問其status頁面。
<Location /status>
SetHander balancer-manager
ProxyPass !
Order allow,deny
Allow from all
</Location>
即是下面配置, # vim mod_proxy.conf
<Proxy balancer://lbcluster1>
BalancerMember http://192.168.1.117:8080 loadfactor=1 route=TomcatA
BalancerMember http://192.168.1.117:9080 loadfactor=1 route=TomcatB
ProxySet lbmethod=byrequests
</Proxy>
<Location /status>
SetHander balancer-manager
ProxyPass !
Order allow,deny
Allow from all
</Location>
ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster/
保存退出之後
# httpd -t
# service httpd restart
下面在tomcat下創建test測試頁
現在兩個tomcat上做測試頁,即在/usr/local/tomcatA/webapps/目錄下
創建# mkdir -pv ./test/WEB-INF/{classes,lib},並且在test目錄下穿件文件
# vim index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA. .just a test page </font></h1>
<table border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("changyu.com","changyu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
同理在tomcatB同位置處
演示效果,在TomcatB上某context中(如/test),提供如下頁面
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB.just a test page</font></h1>
<table border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("changyu.com","changyu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
還有一步就是在/usr/local/tomcat{1,2}/webpapps/test/WEB-INF/的目錄下加一個web.xml文件並且在其任意位置添加<distributable/>。
對於tomcatA來說
[root@org conf]# cp ./web.xml /usr/local/tomcatA/webapps/test/WEB-INF/
[root@org conf]# cd /usr/local/tomcatA/webapps/test/WEB-INF/
[root@org WEB-INF]# ls
classes lib web.xml
[root@org WEB-INF]#
[root@org WEB-INF]# vim web.xml //任意位置加入下信息
<distributable/>
對於tomcatB來說
[root@org conf]# cp ./web.xml /usr/local/tomcatA/webapps/test/WEB-INF/
[root@org conf]# cd /usr/local/tomcatB/webapps/test/WEB-INF/
[root@org WEB-INF]# ls
classes lib web.xml
[root@org WEB-INF]# vim web.xml //任意位置加入下信息。
<distributable/>
分別重新啓動。
[root@org bin]# ./catalina.sh stop
Using CATALINA_BASE: /usr/local/tomcatB
Using CATALINA_HOME: /usr/local/tomcatB
Using CATALINA_TMPDIR: /usr/local/tomcatB/temp
Using JRE_HOME: /opt/jdk1.7.0_71/
Using CLASSPATH: /usr/local/tomcatB/bin/bootstrap.jar:/usr/local/tomcatB/bin/tomcat-juli.jar
[root@org bin]# ./catalina.sh start
Using CATALINA_BASE: /usr/local/tomcatB
Using CATALINA_HOME: /usr/local/tomcatB
Using CATALINA_TMPDIR: /usr/local/tomcatB/temp
Using JRE_HOME: /opt/jdk1.7.0_71/
Using CLASSPATH: /usr/local/tomcatB/bin/bootstrap.jar:/usr/local/tomcatB/bin/tomcat-juli.jar
Tomcat started.
[root@org bin]#
重新啓動,並且訪問http://192.168.1.117/test
刷新頁面
將上面test應用定義成集羣會話管理器,將下面文件拷貝到兩個文件中
<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.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
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>
之後再次訪問,會話保持
刷新一下,不難發現SessionID 沒有變化。