實驗環境
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
進入主機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.128:8080會出現如下內容,說明配置成功
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.129:8080會出現如下內容,說明配置成功
進入主機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協議的客戶端(服務端是Tomcat的AJP鏈接器)。
# 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
查看當前狀態信息
基於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
查看當前狀態信息
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