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

壹頁書發表於2014-01-13
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" "">
  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

官方文件:



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1070221/,如需轉載,請註明出處,否則將追究法律責任。

相關文章