Windows下Apache+Tomcat做簡單負載均衡--使用mod_proxy實現


  Apache作為前端的Web服務器,將客戶端的請求分流到后端的多個Tomcat應用服務器。

  1、准備環境

    1)確保已安裝好不低於1.5版本的JDK,並配置好相應的環境變量

    2)下載Apache HTTP Server

      2.1)windows版本下載地址:http://archive.apache.org/dist/httpd/binaries/win32/  我下載的是:httpd-2.2.22-win32-x86-openssl-0.9.8t.msi

      2.2)安裝Apache HTTP Server,選擇典型安裝就行了。在安裝界面出現Server Information界面時,需要填寫Network Domain、Server Name和Administrator's Email Address,我只是在自己的機器上配置,所以我就按如下填寫了。

                                                   

        填寫好之后,一路Next。

      2.3)檢查Apache HTTP Server是否安裝成功,在瀏覽器輸入 http://localhost/ 如果出現下面的頁面即可。

                      

    3)准備兩個Tomcat應用服務器

      我這里使用的是apache-tomcat-7.0.33.zip

      解壓后分別取名tomcat-7-1和tomcat-7-2

                

  2、配置Apache HTTP Server負載均衡

    1)修改Apache HTTP Server安裝路徑conf目錄下的httpd.conf文件,找到以下內容,去掉前面的#注釋,啟用mod_proxy模塊

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so

    mod_proxy  提供HTTP/1.1的代理/網關功能支持

    mod_proxy_ajp  mod_proxy的擴展,提供Apache JServ Protocol支持

    mod_proxy_balancer  mod_proxy的擴展,提供負載均衡支持

    mod_proxy_connect  mod_proxy的擴展,提供對處理HTTP CONNECT方法的支持

    mod_proxy_ftp  mod_proxy的FTP支持模塊

    mod_proxy_http  mod_proxy的HTTP支持模塊

    2)在httpd.conf文件的最后面添加以下內容

ProxyRequests Off  
<proxy balancer://cluster>  
    BalancerMember ajp://localhost:8009 loadfactor=1 route=jvm1  
    BalancerMember ajp://localhost:9009 loadfactor=1 route=jvm2  
</proxy>

    ProxyRequests Off  使用反向代理

    BalancerMember  把服務器添加到負載均衡組

    loadfactor  負載比例分配,上面的設置是按1:1的比例給兩台服務器分配請求,loadfactor的值是1-100之間

    因為是在同一台機器上,所以我把其中一個應用服務器tomcat-7-2的AJP協議端口改為9009,怎么改在后面tomcat的配置中會說,在不同的機器上無需修改。route也要和各自的應用服務器配置的引擎一致

    3)找到httpd.conf文件中的Include conf/extra/httpd-vhosts.conf,去掉前面的#注釋,導入虛擬主機配置文件。修改后如下

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

    4)修改conf目錄下extra目錄中的httpd-vhosts.conf文件,在文件最后添加以下內容,將80端口的請求轉發給負載均衡代理處理器

<VirtualHost *:80> 
    ServerName localhost
    ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
    ProxyPassReverse / balancer://cluster/  
</VirtualHost>

  

  3、配置Tomcat的server.xml文件

    1)因為是在同一台機器上,所以將其中一個應用服務器tomcat-7-2的端口做如下修改

    1.1)找到:

<Server port="8005" shutdown="SHUTDOWN">

      修改成:

<Server port="9005" shutdown="SHUTDOWN">

    1.2)找到:

  <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

      修改成:

  <Connector port="9080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="9443" />

    1.3)找到:

 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

      修改成:

<Connector port="9009" protocol="AJP/1.3" redirectPort="9443" />

    2)配置引擎Engine

    2.1)找到:

<Engine name="Catalina" defaultHost="localhost">

      tomcat-7-1修改成如下內容,將tomcat-7-1配置成集群成員

<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">

      tomcat-7-2修改成如下內容,將tomcat-7-2配置成集群成員

<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm2">

    3)配置一個集群環境中的session復制

    3.1)找到:

<!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

    去掉注釋,在tomcat-7-1中修改為:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> 
      
        <Manager className="org.apache.catalina.ha.session.DeltaManager" 
                expireSessionsOnShutdown="false" 
                notifyListenersOnReplication="true"/> 

        <Channel className="org.apache.catalina.tribes.group.GroupChannel"> 
            <Membership className="org.apache.catalina.tribes.membership.McastService" 
                        address="228.0.0.4" 
                        port="45564" 
                        frequency="500" 
                        dropTime="3000"/> 
            
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
                      address="auto" 
                      port="5001" 
                      selectorTimeout="100" 
                      maxThreads="6"/> 
                      <!--因為tomcat都在同一台機器上,這里的端口設置成5001-->
                      
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 
                    <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 
            </Sender> 
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> 
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> 
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> 
        </Channel> 
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
               filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/> 
        
        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" 
                  tempDir="/tmp/war-temp/" 
                  deployDir="/tmp/war-deploy/" 
                  watchDir="/tmp/war-listen/" 
                  watchEnabled="false"/> 
        
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> 
 
</Cluster>

      在tomcat-7-2中修改為:

  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> 

        <Manager className="org.apache.catalina.ha.session.DeltaManager" 
                expireSessionsOnShutdown="false" 
                notifyListenersOnReplication="true"/> 

        <Channel className="org.apache.catalina.tribes.group.GroupChannel"> 
            <Membership className="org.apache.catalina.tribes.membership.McastService" 
                        address="228.0.0.4" 
                        port="45564" 
                        frequency="500" 
                        dropTime="3000"/> 
                        
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
                      address="auto" 
                      port="5002" 
                      selectorTimeout="100" 
                      maxThreads="6"/> 
            <!--因為tomcat都在同一台機器上,這里的端口設置成5002-->
                                          
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 
                    <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 
            </Sender> 
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> 
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> 
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> 
        </Channel> 
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
               filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/> 

        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" 
                  tempDir="/tmp/war-temp/" 
                  deployDir="/tmp/war-deploy/" 
                  watchDir="/tmp/war-listen/" 
                  watchEnabled="false"/> 
               
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> 
 
</Cluster>

 

  4、在應用程序的web.xml中加入<distributable/>元素使應用程序支持集群

  5、放入session中的對象需要實現序列化接口

  6、測試,建立一個web項目叫webapp。

    1)在index.jsp中,把一個值存到session中

<%@ page language="java"  pageEncoding="UTF-8"%>
<%

    request.getSession().setAttribute("myName", "Luxh");
    System.out.println("set value success!");
%>

<!DOCTYPE html>
<html>
  <head>
    
    <title>My JSP 'index.jsp' starting page</title>
    
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    hello,apache and tomcat!  this is index.jsp file.<br>
  </body>
</html>

    2)寫一個Servlet,把存在session中的值取出

package cn.luxh.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        
        
        System.out.println("Hello,Apache and Tomcat!!!!!!!!====="+request.getSession().getAttribute("myName"));
        
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the GET method");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

    3)配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>cn.luxh.servlet.MyServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/servlet/MyServlet</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <distributable/>
  
</web-app>

    4)將項目打成war包,分別放到tomcat的webapps目錄下

    5)啟動Apache HTTP Server,啟動tomcat-7-1,啟動tomcat-7-2

    訪問:http://localhost/webapp/ ,可以看到請求被分發到tomcat-7-1中,並且把值存到session中

 

      接下來,我們不斷訪問servlet,可以看到,請求被平均分發到兩個應用服務器,並且能從session中取到值。

 

      接下來,停掉tomcat-7-1,繼續不斷訪問servlet,在剩下的那個tomcat中依然可以取到session中的值

 


免責聲明!

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



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