Apache配置反向代理、負載均衡和集群(mod_proxy方式)


Apache配置負載均衡和集群使用mod_jk的方式比較多。
但是mod_jk已經停止更新,並且配置相對復雜。
Apache2.2以后,提供了一種原生的方式配置負載均衡和集群,比mod_jk簡單很多。

1.Apache配置反向代理
    正向代理一般是指PC連接到代理服務器,由代理服務器轉發請求到網站。而反向代理指的是用戶將請求發送給反向代理服務器,由反向代理服務器將請求路由轉發到具體的服務器。
    比如機房有兩個Tomcat提供服務,但是由於防火牆的原因,用戶不能直接訪問。這個時候,可以使用反向代理服務器,將請求轉發到Tomcat。而防火牆只需要開啟反向代理服務器的端口即可。

下面實驗假設內網Tomcat提供谷歌服務,外網通過反向代理,訪問這個服務。
修改/etc/httpd/conf/httpd.conf 增加下面的配置

訪問鏈接:http://192.168.1.105/google


2.負載均衡
    負載均衡應該是最常用的橫向擴展技術。Apache負載均衡將前端的請求,按照配置的比例轉發給后台的Tomcat服務器,從而提高了並發訪問量。作為mod_proxy方式,配置負載均衡十分簡單,就是在反向代理的基礎上,將請求發送到balancer。
    首先,修改War包程序的web.xml文件,增加標識。
    其次,修改每個Tomcat服務器的server.xml,配置jvmRoute    
    最后,修改apache的httpd.conf文件,增加如下內容
    
    其中ProxyPass /images ! 表示/images開頭的請求不會轉發給Tomcat,而是作為靜態資源在Apache的images目錄下尋找資源文件。
    而反向代理將所有的/Test請求都轉發給名叫mycluster的balancer。
    而這個balancer有兩個Tomcat成員。

loadfactor表示請求的權值,該值默認為1,可以將該值設置為1到100之間的任何值。    
lbmethod表示負載均衡的算法,lbmethod可能的取值有:
 
lbmethod=byrequests 按照請求次數均衡(默認)                 
lbmethod=bytraffic 按照流量均衡 
lbmethod=bybusyness 按照繁忙程度均衡(總是分配給活躍請求數最少的服務器)

    stickySession=JSESSIONID表示開啟粘性Session。他的意思是如果第一次請求分到了worker1的Tomcat,那么這個用戶的后續請求,都會分配給worker1的這個Tomcat。
    使用一個測試頁面查看粘性Session

index.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.     pageEncoding="UTF-8"%>
  3. <%@ page import="java.util.*" %> 
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <% 
  12.   System.out.println(session.getId()); 
  13.   out.println("
    SESSION ID:" + session.getId()+"
    "); 
  14.   // 如果有新的請求,則添加session屬性 
  15.   String name = request.getParameter("name"); 
  16.   if (name != null && name.length() > 0) { 
  17.      String value = request.getParameter("value"); 
  18.      session.setAttribute(name, value); 
  19.   } 
  20.     out.print("Session List:"); 
  21.     Enumeration<String> names = session.getAttributeNames(); 
  22.     while (names.hasMoreElements()) { 
  23.         String sname = names.nextElement(); 
  24.         String value = session.getAttribute(sname).toString(); 
  25.         out.println( sname + " = " + value+"
    "); 
  26.         System.out.println( sname + " = " + value); 
  27.    } 
  28. %> 
  29.   <form action="index.jsp" method="post"> 
  30.     名稱:<input type=text size=20 name="name"> 
  31.      <br> 
  32.     值:<input type=text size=20 name="value"> 
  33.      <br> 
  34.     <input type=submit value="提交"> 
  35.    </form> </body>
  36. </html>

可以看到,由於粘性Session的作用,對網頁的反復操作,都被Apache發送到了同一個Tomcat(worker2)

查看firefox的cookie信息,apache就是根據JSESSIONID后面的routeid實現粘性Session的。

3.集群
    我覺得集群和負載均衡的區別就是集群包括Session復制和故障轉移。
    Session復制是廣義的,實際上就是故障轉移的時候,還可以繼續讀取這個用戶的Session。
    Session復制只是其中的一種方式,也可以采用Session服務器的方式。
    例如:
    http://blog.itpub.net/29254281/viewspace-1063018/

    在負載均衡的基礎上配置集群
    首先,開啟Tomcat的Session復制功能
    

  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> 
  2.           <Manager className="org.apache.catalina.ha.session.DeltaManager" 
  3.              expireSessionsOnShutdown="false" 
  4.              notifyListenersOnReplication="true"/> 
  5.           <Channel className="org.apache.catalina.tribes.group.GroupChannel"> 
  6.              <Membership className="org.apache.catalina.tribes.membership.McastService" 
  7.                 address="224.0.0.0" 
  8.                 port="45564" 
  9.                 frequency="500" 
  10.                 dropTime="3000"/> 
  11.              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
  12.              address="192.168.1.100" 
  13.              port="4000" 
  14.              autoBind="100" 
  15.              selectorTimeout="5000" 
  16.              maxThreads="6"/> 
  17.             <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 
  18.                        <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 
  19.                 </Sender> 
  20.             <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> 
  21.             <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> 
  22.         </Channel> 
  23.         <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
  24.             filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> 
  25.         <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> 
  26.           <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> 
  27.           <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> 
  28.     </Cluster>

    然后在Apache配置故障轉移(nofailover=Off)


    配置了集群之后,請求從前端過來,假如分配到了worker1,那么因為粘性Session,他會一直訪問worker1.
    如果worker1宕機,這個用戶的后續請求會自動轉移到worker2.
    由於Tomcat配置了Session復制,所以Session信息沒有丟失。
    整個過程對於用戶是完全透明的。

參考:
http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/
http://snowolf.iteye.com/blog/743611
http://www.iteye.com/topic/757125
官方文檔:
http://apache.jz123.cn/mod/mod_proxy.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM