阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

189次阅读
没有评论

共计 7353 个字符,预计需要花费 19 分钟才能阅读完成。

Apache 配置负载均衡和集群使用 mod_jk 的方式比较多,但是 mod_jk 已经停止更新,并且配置相对复杂。Apache2.2 以后, 提供了一种原生的方式配置负载均衡和集群,比 mod_jk 简单很多。

1.Apache 配置反向代理
正向代理一般是指 PC 连接到代理服务器,由代理服务器转发请求到网站。而反向代理指的是用户将请求发送给反向代理服务器,由反向代理服务器将请求路由转发到具体的服务器。
比如机房有两个 Tomcat 提供服务,但是由于防火墙的原因,用户不能直接访问。这个时候,可以使用反向代理服务器,将请求转发到 Tomcat。而防火墙只需要开启反向代理服务器的端口即可。

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

 下面实验假设内网 Tomcat 提供谷歌服务,外网通过反向代理,访问这个服务。
 修改 /etc/httpd/conf/httpd.conf 增加下面的配置

 访问链接:http://192.168.1.105/google

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

Apache 反向代理设置方法 http://www.linuxidc.com/Linux/2014-06/102751.htm

Apache 做反向代理服务器 http://www.linuxidc.com/Linux/2014-02/96839.htm

日志分析工具 Awstats 实战之 Apache 篇 - 多站点日志分析 http://www.linuxidc.com/Linux/2013-11/92273.htm

 2. 负载均衡
    负载均衡应该是最常用的横向扩展技术。Apache 负载均衡将前端的请求,按照配置的比例转发给后台的 Tomcat 服务器,从而提高了并发访问量。作为 mod_proxy 方式,配置负载均衡十分简单,就是在反向代理的基础上,将请求发送到 balancer。
    首先,修改 War 包程序的 web.xml 文件,增加 <distributable/> 标识。
    其次,修改每个 Tomcat 服务器的 server.xml, 配置 jvmRoute   
    最后, 修改 apache 的 httpd.conf 文件,增加如下内容

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

Apache 负载均衡的实现 http://www.linuxidc.com/Linux/2014-09/106581.htm

CentOS 6.4 下 LVS 负载均衡之 VS/NAT 机制(一主一从提供冗余) http://www.linuxidc.com/Linux/2014-04/99982.htm
   
    其中 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

<%@ page language=”Java” contentType=”text/html; charset=UTF-8″
 
    pageEncoding=”UTF-8″%>

<%@ page import=”java.util.*” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>

<title>Insert title here</title>

</head>

<body>

<%

  System.out.println(session.getId());

  out.println(“<br> SESSION ID:” + session.getId()+”<br>”);

  // 如果有新的请求,则添加 session 属性

  String name = request.getParameter(“name”);

  if (name != null && name.length() > 0) {

    String value = request.getParameter(“value”);

    session.setAttribute(name, value);

  }

    out.print(“<b>Session List:</b>”);

    Enumeration<String> names = session.getAttributeNames();

    while (names.hasMoreElements()) {

        String sname = names.nextElement();

        String value = session.getAttribute(sname).toString();

        out.println(sname + ” = ” + value+”<br>”);

        System.out.println(sname + ” = ” + value);

  }

%>

  <form action=”index.jsp” method=”post”>

    名称:<input type=text size=20 name=”name”>

    <br>

    值:<input type=text size=20 name=”value”>

    <br>

    <input type=submit value=” 提交 ”>

  </form> </body>

</html>
可以看到, 由于粘性 Session 的作用, 对网页的反复操作, 都被 Apache 发送到了同一个 Tomcat(worker2)

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

查看 firefox 的 cookie 信息,apache 就是根据 JSESSIONID 后面的 routeid 实现粘性 Session 的。

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

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-09/106634p2.htm

3. 集群
    我觉得集群和负载均衡的区别就是集群包括 Session 复制和故障转移。
    Session 复制是广义的, 实际上就是故障转移的时候, 还可以继续读取这个用户的 Session。
    Session 复制只是其中的一种方式,也可以采用 Session 服务器的方式。
    例如: http://www.linuxidc.com/Linux/2014-09/106635.htm

    在负载均衡的基础上配置集群
    首先, 开启 Tomcat 的 Session 复制功能
   

<Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster” channelSendOptions=”8″>
 
          <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=”224.0.0.0″

                port=”45564″

                frequency=”500″

                dropTime=”3000″/>

            <Receiver className=”org.apache.catalina.tribes.transport.nio.NioReceiver”

            address=”192.168.1.100″

            port=”4000″

            autoBind=”100″

            selectorTimeout=”5000″

            maxThreads=”6″/>

            <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”/>

        </Channel>

        <Valve className=”org.apache.catalina.ha.tcp.ReplicationValve”

            filter=”.*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;”/>

        <Valve className=”org.apache.catalina.ha.session.JvmRouteBinderValve”/>

          <ClusterListener className=”org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener”/>

          <ClusterListener className=”org.apache.catalina.ha.session.ClusterSessionListener”/>

    </Cluster>
    然后在 Apache 配置故障转移(nofailover=Off)

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

配置了集群之后,请求从前端过来,假如分配到了 worker1,那么因为粘性 Session,他会一直访问 worker1.
如果 worker1 宕机, 这个用户的后续请求会自动转移到 worker2.
由于 Tomcat 配置了 Session 复制, 所以 Session 信息没有丢失。
整个过程对于用户是完全透明的。

Apache 配置负载均衡和集群使用 mod_jk 的方式比较多,但是 mod_jk 已经停止更新,并且配置相对复杂。Apache2.2 以后, 提供了一种原生的方式配置负载均衡和集群,比 mod_jk 简单很多。

1.Apache 配置反向代理
正向代理一般是指 PC 连接到代理服务器,由代理服务器转发请求到网站。而反向代理指的是用户将请求发送给反向代理服务器,由反向代理服务器将请求路由转发到具体的服务器。
比如机房有两个 Tomcat 提供服务,但是由于防火墙的原因,用户不能直接访问。这个时候,可以使用反向代理服务器,将请求转发到 Tomcat。而防火墙只需要开启反向代理服务器的端口即可。

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

 下面实验假设内网 Tomcat 提供谷歌服务,外网通过反向代理,访问这个服务。
 修改 /etc/httpd/conf/httpd.conf 增加下面的配置

 访问链接:http://192.168.1.105/google

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

Apache 反向代理设置方法 http://www.linuxidc.com/Linux/2014-06/102751.htm

Apache 做反向代理服务器 http://www.linuxidc.com/Linux/2014-02/96839.htm

日志分析工具 Awstats 实战之 Apache 篇 - 多站点日志分析 http://www.linuxidc.com/Linux/2013-11/92273.htm

 2. 负载均衡
    负载均衡应该是最常用的横向扩展技术。Apache 负载均衡将前端的请求,按照配置的比例转发给后台的 Tomcat 服务器,从而提高了并发访问量。作为 mod_proxy 方式,配置负载均衡十分简单,就是在反向代理的基础上,将请求发送到 balancer。
    首先,修改 War 包程序的 web.xml 文件,增加 <distributable/> 标识。
    其次,修改每个 Tomcat 服务器的 server.xml, 配置 jvmRoute   
    最后, 修改 apache 的 httpd.conf 文件,增加如下内容

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

Apache 负载均衡的实现 http://www.linuxidc.com/Linux/2014-09/106581.htm

CentOS 6.4 下 LVS 负载均衡之 VS/NAT 机制(一主一从提供冗余) http://www.linuxidc.com/Linux/2014-04/99982.htm
   
    其中 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

<%@ page language=”Java” contentType=”text/html; charset=UTF-8″
 
    pageEncoding=”UTF-8″%>

<%@ page import=”java.util.*” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>

<title>Insert title here</title>

</head>

<body>

<%

  System.out.println(session.getId());

  out.println(“<br> SESSION ID:” + session.getId()+”<br>”);

  // 如果有新的请求,则添加 session 属性

  String name = request.getParameter(“name”);

  if (name != null && name.length() > 0) {

    String value = request.getParameter(“value”);

    session.setAttribute(name, value);

  }

    out.print(“<b>Session List:</b>”);

    Enumeration<String> names = session.getAttributeNames();

    while (names.hasMoreElements()) {

        String sname = names.nextElement();

        String value = session.getAttribute(sname).toString();

        out.println(sname + ” = ” + value+”<br>”);

        System.out.println(sname + ” = ” + value);

  }

%>

  <form action=”index.jsp” method=”post”>

    名称:<input type=text size=20 name=”name”>

    <br>

    值:<input type=text size=20 name=”value”>

    <br>

    <input type=submit value=” 提交 ”>

  </form> </body>

</html>
可以看到, 由于粘性 Session 的作用, 对网页的反复操作, 都被 Apache 发送到了同一个 Tomcat(worker2)

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

查看 firefox 的 cookie 信息,apache 就是根据 JSESSIONID 后面的 routeid 实现粘性 Session 的。

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

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-09/106634p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计7353字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中