apache反向代理負載均衡請求至tomcat

實驗環境 
html

    RHEL6.6-X86-64
java

軟件linux

     jdk-8u45-linux-x64.rpmweb

    apache-tomcat-8.0.23.tar.gzapache

                    http-2.4.10
vim



主機一:IP1: 192.168.1.10    IP2: 192.168.46.130  安裝apache 後端

主機二:192.168.46.128  TomcatA瀏覽器

主機三:192.168.46.129  TomcatBtomcat


拓撲圖:bash

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
相關文章
相關標籤/搜索