Apache負載均衡請求至Tomcat及DeltaManager的使用

1、系統環境html

CentOS6.4X64最小化安裝
java

2、環境準備linux

1.實驗拓撲web

wKiom1WDe0XBdytZAACSzf49ctw792.jpg

2.同步各節點時間apache

apache,tomcat1,tomcat2的操做都是同樣的bootstrap

[root@apache ~]# yum install ntp -y
[root@apache ~]# ntpdate asia.pool.ntp.org
[root@apache ~]# hwclock -w
[root@apache ~]# echo "*/10 * * * * /usr/sbin/ntpdate asia.pool.ntp.org  &>/dev/null" >/var/spool/cron/root

3.安裝jdk,tomcat1和tomcat2的安裝過程同樣,這裏只給出tomcat1的安裝過程vim

[root@tomcat1 ~]# tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local/

#編輯環境變量配置文件
[root@tomcat1 ~]# cat /etc/profile.d/java.sh 
JAVA_HOME=/usr/local/jdk1.8.0_45
JAVA_BIN=$JAVA_HOME/bin
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/charsets.jar

#讓環境變量生效
[root@tomcat1 ~]# source /etc/profile.d/java.sh

#測試結果
[root@tomcat1 ~]# java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

4.安裝tomcat,安裝過程tomcat1和tomcat2同樣windows

#下載軟件
[root@tomcat1 ~]# wget http://apache.fayea.com/tomcat/tomcat-7/v7.0.62/bin/apache-tomcat-7.0.62.tar.gz
[root@tomcat1 ~]# tar xf apache-tomcat-7.0.62.tar.gz -C /usr/local/
[root@tomcat1 ~]# ln -s /usr/local/apache-tomcat-7.0.62/ /usr/local/tomcat
[root@tomcat1 ~]# cp /usr/local/tomcat/bin/catalina.sh /etc/init.d/tomcat

#編輯啓動腳本在第二行添加以下內容
[root@tomcat1 ~]# vim /etc/init.d/tomcat
# chkconfig: 2345 63 37
# description: tomcat server init script
# Source Function Library
. /etc/init.d/functions
JAVA_HOME=/usr/local/jdk1.8.0_45
CATALINA_HOME=/usr/local/tomcat

#賦予腳本執行權限,並添加到開機自啓動
[root@tomcat1 ~]# chmod 755 /etc/init.d/tomcat 
[root@tomcat1 ~]# chkconfig --add tomcat
[root@tomcat1 ~]# chkconfig tomcat on

#啓動tomcat
[root@tomcat1 ~]# service tomcat start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_45
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat1 ~]# netstat -anpt |grep java
tcp        0      0 :::8080                     :::*                        LISTEN      1583/java           
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      1583/java           
tcp        0      0 :::8009                     :::*                        LISTEN      1583/java           
[root@tomcat1 ~]# service iptables stop

測試訪問結果,訪問地址http://192.168.3.74:8080和http://192.168.3.75:8080後端

wKiom1WDgmHxm3TAAAUvxn_iQDI521.jpg

到此tomcat安裝成功tomcat

5.修改配置文件

tomcat1:

[root@tomcat1 ~]# vim /usr/local/tomcat/conf/server.xml 
<Connector port="80" protocol="HTTP/1.1"        #將端口修改爲80
               connectionTimeout="20000"
               redirectPort="8443" />
               
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">    #增長jvmRoute

#增長一個虛擬主機
<Host name="www.test.com" appBase="/web"
            unpackWARs="true" autoDeploy="true">
            <Context path="/" docBase="webapp" reloadable="true"/>
</Host>

#增長虛擬主機的目錄和測試文件
[root@tomcat1 ~]# mkdir -p /web/webapp
[root@tomcat1 ~]# vim /web/webapp/index.jsp
[root@tomcat1 ~]# cat /web/webapp/index.jsp
<%@ page language="java" %>
<html> 
 <head><title>TomcatA</title></head> 
 <body> 
  <h1><font color="blue">TomcatA </h1> 
  <table align="centre" 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>

#檢查配置文件並從新啓動tomcat
[root@tomcat1 ~]# service tomcat stop
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_45
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@tomcat1 ~]# service tomcat configtest    #該命令只能在tomcat中止的時候執行,不然會報錯
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_45
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Jun 19, 2015 10:58:16 AM org.apache.catalina.core.StandardContext setPath
WARNING: A context path must either be an empty string or start with a '/' and do not end with a '/'. The path [/] does not meet these criteria and has been changed to []
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version:        Apache Tomcat/7.0.62
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          May 7 2015 17:14:55 UTC
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         7.0.62.0
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Linux
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            2.6.32-358.el6.x86_64
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             /usr/local/jdk1.8.0_45/jre
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           1.8.0_45-b14
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         /usr/local/tomcat
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         /usr/local/tomcat
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=/usr/local/tomcat/endorsed
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=/usr/local/tomcat
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=/usr/local/tomcat
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
Jun 19, 2015 10:58:16 AM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Jun 19, 2015 10:58:16 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-80"]
Jun 19, 2015 10:58:16 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Jun 19, 2015 10:58:16 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1097 ms

#從新啓動tomcat
[root@tomcat1 ~]# service tomcat start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_45
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat1 ~]# netstat -tunlp |grep java
tcp        0      0 :::80                       :::*                        LISTEN      1757/java           
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      1757/java           
tcp        0      0 :::8009                     :::*                        LISTEN      1757/java

測試tomcat1的服務,須要在windows是作本地hosts解析,即192.168.3.74    www.test.com

wKiom1WDhdjxOscXAACxP23Gb_U144.jpg

tomcat2:

[root@tomcat2 ~]# vim /usr/local/tomcat/conf/server.xml 
<Connector port="80" protocol="HTTP/1.1"        #修改端口爲80
               connectionTimeout="20000"
               redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">    #增長jvmRoute
<Host name="www.test.com" appBase="/web"        #增長一個虛擬主機
            unpackWARs="true" autoDeploy="ture">
            <Context path="/" docBase="webapp" reloadable="true"/>
</Host>

#增長虛擬主機的目錄和測試文件
[root@tomcat2 ~]# mkdir -p /web/webapp
[root@tomcat2 ~]# vim /web/webapp/index.jsp
[root@tomcat2 ~]# cat /web/webapp/index.jsp
<%@ page language="java" %>
<html> 
 <head><title>TomcatB</title></head> 
 <body> 
  <h1><font color="blue">TomcatB </h1> 
  <table align="centre" 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>

#檢查配置文件並從新啓動tomcat服務
[root@tomcat2 ~]# service tomcat stop
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_45
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@tomcat2 ~]# service tomcat configtest
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_45
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Jun 19, 2015 11:08:04 AM org.apache.catalina.core.StandardContext setPath
WARNING: A context path must either be an empty string or start with a '/' and do not end with a '/'. The path [/] does not meet these criteria and has been changed to []
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version:        Apache Tomcat/7.0.62
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          May 7 2015 17:14:55 UTC
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         7.0.62.0
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Linux
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            2.6.32-358.el6.x86_64
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             /usr/local/jdk1.8.0_45/jre
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           1.8.0_45-b14
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         /usr/local/tomcat
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         /usr/local/tomcat
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=/usr/local/tomcat/endorsed
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=/usr/local/tomcat
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=/usr/local/tomcat
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
Jun 19, 2015 11:08:04 AM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Jun 19, 2015 11:08:04 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-80"]
Jun 19, 2015 11:08:04 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Jun 19, 2015 11:08:04 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1155 ms

#從新啓動tomcat服務
[root@tomcat2 ~]# service tomcat start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_45
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat2 ~]# netstat -tunlp |grep java
tcp        0      0 :::80                       :::*                        LISTEN      1755/java           
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      1755/java           
tcp        0      0 :::8009                     :::*                        LISTEN      1755/java

測試結果,將本地hosts解析調整到192.168.3.75 www.test.com上

wKioL1WDicWgYMOoAACtMCv9p0Y506.jpg

6.安裝apache

安裝apr

[root@apache ~]# wget http://mirror.bit.edu.cn/apache//apr/apr-1.5.2.tar.gz
[root@apache ~]# tar xf apr-1.5.2.tar.gz 
[root@apache ~]# cd apr-1.5.2
[root@apache apr-1.5.2]# ./configure --prefix=/usr/local/apr --disable-ipv6
[root@apache apr-1.5.2]# make && make install

安裝apr-util

[root@apache ~]# wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.5.4.tar.gz
[root@apache ~]# tar xf apr-util-1.5.4.tar.gz 
[root@apache ~]# cd apr-util-1.5.4
[root@apache apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
[root@apache apr-util-1.5.4]# make && make install

安裝apache

#解決依賴關係
[root@apache ~]# yum install pcre-devel openssl-devel -y

#下載軟件包
[root@apache ~]# wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.4.12.tar.gz
[root@apache ~]# tar xf httpd-2.4.12.tar.gz 
[root@apache ~]# cd httpd-2.4.12

#配置編譯參數
[root@apache httpd-2.4.12]# ./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
[root@apache httpd-2.4.12]# make && make install

建立啓動腳本

[root@apache ~]# cat /etc/init.d/httpd
#!/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

#給腳本添加執行權限,並添加到開機自啓動
[root@apache ~]# chmod +x /etc/init.d/httpd 
[root@apache ~]# chkconfig --add httpd
[root@apache ~]# chkconfig httpd on

#啓動httpd服務
[root@apache ~]# echo "ServerName localhost:80" >>/etc/httpd/httpd.conf 
[root@apache ~]# service httpd start
Starting httpd:                                            [  OK  ]
[root@apache ~]# service iptables stop

3、負載均衡實現

兩種方式都能實現負載均衡:

  • 基於mod_proxy模塊實現負載均衡

  • 基於mod_jk模塊實現負載均衡

下面咱們就來分別演示一下,

1.基於mod_proxy實現負載均衡

首先咱們來修改一下httpd.conf配置文件

[root@apache ~]# vim /etc/httpd/httpd.conf
Include /etc/httpd/extra/httpd-proxy.conf    #增長這一行

編輯httpd-proxy.conf文件

[root@apache ~]# cat /etc/httpd/extra/httpd-proxy.conf
ProxyRequests Off
<proxy balancer://lbcluster> 
BalancerMember ajp://192.168.3.74:8009 loadfactor=1 route=TomcatA 
BalancerMember ajp://192.168.3.75:8009 loadfactor=1 route=TomcatB
ProxySet lbmethod=bytraffic
</proxy>
<VirtualHost *:80>
ServerAdmin admin@test.com
ServerName www.test.com
ProxyPass / balancer://lbcluster/
ProxyPa***everse / balancer://lbcluster/ stickysession=JSESSIONID
<Proxy *>
Require all granted
</Proxy>
<Location />
Require all granted
</Location>
</VirtualHost>

注,關於如上apache指令的說明:

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。

上述指令除了能在banlancer://或ProxyPass中設定以外,也可以使用ProxySet指令直接進行設置,如: 

<Proxy balancer://hotcluster> 
BalancerMember http://www1.test.com:8080 loadfactor=1 
BalancerMember http://www2.test.com:8080 loadfactor=2 
ProxySet lbmethod=bytraffic 
</Proxy>

ProxyPa***everse:用於讓apache調整HTTP重定向響應報文中的Location、Content-Location及URI標籤所對應的URL,在反向代理環境中必須使用此指令避免重定向報文繞過proxy服務器。

好了,配置文件說明就到這裏。接下來咱們檢查一下配置文件並重啓httpd 

[root@apache ~]# /usr/local/apache/bin/httpd -t
Syntax OK 
[root@apache ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

訪問結果

wKiom1WDlFCD1y9vAADX34H6KwI538.jpg

wKioL1WDlgLyw4jeAADjBHE2K4M952.jpg

好了,你們能夠看到基於mod_proxy模塊的tomcat負載均衡配置完成。下面咱們來配置一下基於mod_jk的模塊的負載均衡!

2.基於mod_jk模塊實現負載均衡

說明:

爲了不用戶直接訪問後端Tomcat實例,影響負載均衡的效果,建議在Tomcat 7的各實例上禁用HTTP/1.1鏈接器。

爲每個Tomcat 7實例的引擎添加jvmRoute參數,並經過其爲當前引擎設置全局唯一標識符。以下所示。須要注意的是,每個實例的jvmRoute的值均不能相同。

安裝mod_jk

[root@apache ~]# wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.40-src.tar.gz
[root@apache ~]# tar xf tomcat-connectors-1.2.40-src.tar.gz 
[root@apache ~]# cd tomcat-connectors-1.2.40-src/native/
[root@apache native]# ./configure --with-apxs=/usr/local/apache/bin/apxs
[root@apache native]# make && make install

一樣的首先來修改httpd.conf配置文件

#禁用前面的httpd-proxy.conf文件,啓用httpd-jk.conf文件
[root@apache ~]# vim /etc/httpd/httpd.conf 
#Include /etc/httpd/extra/httpd-proxy.conf
Include /etc/httpd/extra/httpd-jk.conf

#編輯httpd-jk.conf文件
[root@apache ~]# cat /etc/httpd/extra/httpd-jk.conf
LoadModule jk_module modules/mod_jk.so #加載mod_jk模塊
JkWorkersFile /etc/httpd/extra/workers.properties #配置文件位置 
JkLogFile logs/mod_jk.log #日誌 
JkLogLevel debug #日誌級別 
JkMount /* lbcluster #負載均衡器名稱 
JkMount /jkstatus/ stat1 #狀態信息

接下來,編輯/etc/httpd/extra/workers.properties,添加以下內容:

[root@apache ~]# cat /etc/httpd/extra/workers.properties
worker.list = lbcluster,stat1 #列表信息
worker.TomcatA.type = ajp13 #支持ajp協議 
worker.TomcatA.host = 192.168.3.74 #TomcatA實例IP
worker.TomcatA.port = 8009 #TomcatA實例端口號 
worker.TomcatA.lbfactor = 1 #負載均衡權重爲1 
worker.TomcatB.type = ajp13 
worker.TomcatB.host = 192.168.3.75 
worker.TomcatB.port = 8009 
worker.TomcatB.lbfactor = 1 
worker.lbcluster.type = lb #負載均衡work,lb內置的類 
worker.lbcluster.sticky_session = 0 #會話是否綁定 
worker.lbcluster.balance_workers = TomcatA, TomcatB #TomcatA, TomcatB 集羣中的實列 
worker.stat1.type = status #狀態信息

注,apache相關指令說明:

workers.properties文件通常由兩類指令組成:一是mod_jk能夠鏈接的各worker名稱列表,二是每個worker的屬性配置信息。它們分別遵循以下使用語法。

worker.list = < a comma separated list of worker names >
worker. <worker name> .<property> = <property value>

其中worker.list指令能夠重複指定屢次,而worker name則是Tomcat中engine組件jvmRoute參數的值。如: 
worker.TomcatA.host=172.16.100.1

根據其工做機制的不一樣,worker有多種不一樣的類型,這是須要爲每一個worker定義的一項屬性woker.<work name>.type。常見的類型以下: 
◇ ajp13:此類型表示當前worker爲一個運行着的Tomcat實例。 
◇ lb:lb即load balancing,專用於負載均衡場景中的woker;此worker並不真正負責處理用戶請求,而是將用戶請求調度給其它類型爲ajp13的worker。 
◇ status:用戶顯示分佈式環境中各實際worker工做狀態的特殊worker,它不處理任何請求,也不關聯到任何實際工做的worker實例。具體示例如請參見後文中的配置。

worker其它常見的屬性說明: 
◇ host:Tomcat 7的worker實例所在的主機; 
◇ port:Tomcat 7實例上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。 

下面咱們來檢查一下配置文件並從新啓動一下httpd

[root@apache ~]# /usr/local/apache/bin/httpd -t
Syntax OK
[root@apache ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

測試結果

wKiom1WDr76xBXgnAAC9X0iPlys913.jpg

wKioL1WDsXHjhbXuAAC--ZWiUY8989.jpg

相關文章
相關標籤/搜索