实验环境 

    RHEL6.6-X86-64

软件

     jdk-8u45-linux-x64.rpm

    apache-tomcat-8.0.23.tar.gz

                    http-2.4.10



主机一:IP1: 192.168.1.10    IP2: 192.168.46.130  安装apache 

主机二:192.168.46.128  TomcatA

主机三:192.168.46.129  TomcatB


拓扑图:

wKiom1V4IdWg3LuLAADK98tCSYY099.jpg 

 

 

进入主机192.168.1.128

 

步骤一:安装JDK

# rpm –ivh jdk-8u45-linux-x64.rpm

配置环境变量

#vim /etc/profile.d/java.sh

exportJAVA_HOME=/usr/java/latest
exportPATH=$PATH:$JAVA_HOME/bin

# . /etc/profile.d/java.sh

验证是否安装成功,出现如下内容说明安装成功

# java -version

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build25.45-b02, mixed mode)

 

步骤二:安装tomcat

# tar xf apache-tomcat-8.0.23.tar.gz -C/usr/local

# cd /usr/local

# ln apache-tomcat-8.0.23 tomcat –sv

 

 

配置tomcat环境变量

# vim /etc/profile.d/tomcat.sh

exportCATALINA_HOME=/usr/local/tomcat
exportPATH=$PATH:$CATALINA_HOME/bin

# . /etc/profile.d/tomcat.sh

 

# vim /usr/local/tomcat/conf/server.xml

修改:<Engine name="Catalina" defaultHost="www.mingxiao.info"jvmRoute="TomcatA">
新增:<Host name="www.mingxiao.info"  appBase="/web"
           unpackWARs="true" autoDeploy="true">
           <Context path="" docBase="webapps"reLoadable="true" />
</Host>

 

# mkdir –pv /web/webapps

# vim /web/webapps/index.jsp

<%@ page language="java" %>
<html>
 <head><title>TomcatA</title></head>
 <body>
   <h1><font color="red">TomcatA</font></h1>
   <table border="1">
     <tr>
       <td>Session ID</td>
   <% session.setAttribute("abc","abc"); %>
       <td><%= session.getId() %></td>
     </tr>
     <tr>
       <td>Created on</td>
       <td><%= session.getCreationTime() %></td>
    </tr>
   </table>
 </body>
</html>

 

 

# catalina.sh start

浏览器输入  192.168.46.1288080会出现以下内容,说明配置成功


wKiom1V4ERizPr7kAABySRld1V0348.jpg


192.168.46.129配置如192.168.46.128,只需修改如下内容:

# vim /usr/local/tomcat/conf/server.xml

修改:<Engine name="Catalina" defaultHost="www.mingxiao.info"jvmRoute="TomcatB">
新增:<Host name="www.mingxiao.info"  appBase="/web"
           unpackWARs="true" autoDeploy="true">
           <Context path="" docBase="webapps"reLoadable="true" />
</Host>


# mkdir –pv /web/webapps

# vim /web/webapps/index.jsp

<%@ page language="java" %>
<html>
 <head><title>TomcatB</title></head>
 <body>
   <h1><font color="blue">TomcatB</font></h1>
   <table border="1">
     <tr>
       <td>Session ID</td>
   <% session.setAttribute("abc","abc"); %>
       <td><%= session.getId() %></td>
     </tr>
     <tr>
       <td>Created on</td>
       <td><%= session.getCreationTime() %></td>
    </tr>
   </table>
 </body>
</html>

 

# catalina.sh start

浏览器输入  192.168.46.1298080会出现以下内容,说明配置成功

wKioL1V4EwWBjDL-AACAeF-RWfc915.jpg





进入主机192.168.1.10

安装Apache

首先安装apr

# cd apr-1.5.1
# ./configure --prefix=/usr/local/apr
# make
# make install


安装apr-util

# cd apr-util-1.5.4
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make 
# make install


# cd httpd-2.4.10

./configure \
--prefix=/usr/local/apache \
--sysconfdir=/etc/httpd \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite  \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--enable-mpms-shared=all \
--with-mpm=event \
--enable-proxy \
--enable-proxy-http \
--enable-proxy-ajp \
--enable-proxy-balancer  \
--enable-lbmethod-heartbeat \
--enable-heartbeat \
--enable-slotmem-shm \
--enable-slotmem-plain \
--enable-watchdog \

 

 

# vim /etc/httpd/httpd.conf

添加 PidFile “/var/run/httpd.pid”
启动  LoadModuleslotmem_shm_module modules/mod_slotmem_shm.so
启动 LoadModulesocache_shmcb_module modules/mod_socache_shmcb.so
新增Include /etc/httpd/extra/httpd-jk.conf


提供服务启动脚本:

#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#       HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
start() {
        echo -n $"Starting $prog: "
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d 10 $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
        RETVAL=$?
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        killproc -p ${pidfile} $httpd -HUP
        RETVAL=$?
    fi
    echo
}
# See how we were called.
case "$1" in
  start)
start
;;
  stop)
stop
;;
  status)
        status -p ${pidfile} $httpd
RETVAL=$?
;;
  restart)
stop
start
;;
  condrestart)
if [ -f ${pidfile} ] ; then
stop
start
fi
;;
  reload)
        reload
;;
  graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
  *)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
exit 1
esac
exit $RETVAL

 

 

基于mod-jk的负载均衡以及绑定session会话实现

mod_jk是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是TomcatAJP连接器)。

# cd tomcat-connectors-1.2.40-src

# ./configure   --with-apxs=/usr/local/apache/bin/apxs
# make
# make install

 

 

apache要使用mod_jk连接器,需要在启动时加载此连接器模块。

# vim /etc/httpd/extra/httpd-jk.conf

LoadModule jk_module modules/mod_jk.so
JKWorkersFile/etc/httpd/extra/workers.properties
JKLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* lbcluster1
JkMount /status/ stat1

 

# vim /etc/httpd/extra/workers.properities

worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13 
worker.TomcatA.host = 192.168.46.128
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 5 
worker.TomcatB.type = ajp13
worker.TomcatB.host = 192.168.46.129
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 5
worker.lbcluster1.type = lb 
worker.lbcluster1.sticky_session = 1   #绑定session
worker.lbcluster1.balance_workers
worker.stat1.type = status 

参数说明:
根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性woker.<work name>.type。
常见的类型如下:
◇ ajp13:此类型表示当前worker为一个运行着的Tomcat实例。
◇ lb:load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。
◇   status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例
◇ host:Tomcat 的worker实例所在的主机;
◇ port:Tomcat 实例上AJP1.3连接器的端口;
◇ connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2;
◇ connection_pool_timeout:连接池中连接的超时时长;
◇ mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代;
◇ retries:错误发生时的重试次数;
◇ socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待;
◇ socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用;
◇ lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性;

◇balance_workers:用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。
◇ method:可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。
◇sticky_session:在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。

# /etc/init.d/httpd restart

查看当前状态信息

wKiom1V4G0jji87TAAhJGrnQk8Y923.jpg 

 

基于mod_proxy实现负载均衡 

# vim /etc/httpd/httpd.conf

注释 Include /etc/httpd/extra/httpd-jk.conf
新加Include /etc/httpd/extra/httpd-proxy.conf

 

# vim /etc/httpd/extra/httpd-proxy.conf

ProxyRequests Off   #关闭正向代理,如果使用反向代理必须关闭此项
<proxy balancer://lbcluster1>
 BalancerMember ajp://192.168.46.128:8009 loadfactor=10 route=TomcatA
 BalancerMember ajp://192.168.46.129:8009 loadfactor=10 route=TomcatB
</proxy>
  
<VirtualHost *:80>
 ServerName www.mingxiao.info
 ProxyVia On
 ProxyRequests Off
 ProxyPass / balancer://lbcluster1/ stickysession=jsessionid
 ProxyPa***everse / balancer://lbcluster1/
 <Location/balancer-manager>
   SetHandler balancer-manager
   Proxypass !
   Require all granted
 </Location>
 <Proxy *>
   Require all granted
 </Proxy>
 <Location  / >
   Require all granted
 </Location>
</VirtualHost>

参数说明:
ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。

ProxyVia  {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。

ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。

ProxyPass  [path]  !|url  [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。
另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示:
◇ min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。
◇ max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。
◇ loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。
◇ retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。

如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:
◇lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。
◇ maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
◇ nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。
◇ stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。
◇ ProxyPa***everse:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。
上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如:
<Proxy balancer://hotcluster>
BalancerMember  http://www1.magedu.com:8080 loadfactor=1
BalancerMember  http://www2.magedu.com:8080 loadfactor=2
ProxySet  lbmethod=bytraffic
</Proxy>

# /etc/init.d/httpd restart


查看当前状态信息

wKioL1V4HXODWCGDAAXCou_cxMg371.jpg



tomcat服务启动脚本:

#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
JAVA_OPTS='-Xms64m -Xmx128m'
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
exec $CATALINA_HOME/bin/catalina.sh $*


#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
JAVA_OPTS='-Xms64m -Xmx128m'
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
#exec $CATALINA_HOME/bin/catalina.sh $*
catalina=$CATALINA_HOME/bin/catalina.sh
         
. /etc/init.d/functions
start() {
  $catalina start
}
             
stop() {
  $catalina stop
}
    
restart() {
  $catalina stop
    sleep 3
  $catalina start
}

configtest() {
  $catalina configtest
}
case "$1" in
    start|stop|restart|status|configtest)
      $1
      ;;
*)
      echo $"Usage: $0 {start|stop|restart}"
      exit 2
esac