首页 > 代码库 > LNMT/LAMT实现动静分离、负载均衡和会话保持

LNMT/LAMT实现动静分离、负载均衡和会话保持

1、本次试验主要是通过nginx代理到tomcat处理动态响应;

2、通过httpd代理到tomcat做动态请求的处理;

3、通过httpd和tomcat实现session会话的绑定;

4、通过httpd和tomcat实现session会话的保持;

5、通过httpd实现tomcat负载均衡效果;

一、LNMT的试验配置

LNMT:

主机IP
haproxy192.168.0.111    node1.soul.com
varnish192.168.0.112    node2.soul.com
nginx+tomcat192.168.0.113    node3.soul.com
httpd192.168.0.114    node4.soul.com

wKioL1NvnmjiD8CvAACva2U_STA485.jpg

1)配置haproxy

#直接yum安装haproxy即可;
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg
frontend  main *:80
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js .html .htm
    acl url_dynamic      path_end       -i .jsp .do
    use_backend static          if url_static
    use_backend dynamic         if url_dynamic
    default_backend             static
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
    balance     roundrobin
    server      static 192.168.0.112:80 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend dynamic
    balance     roundrobin
    server  node3 192.168.0.113:80 check
[root@node1 ~]# service haproxy start
Starting haproxy:                                          [  OK  ]
[root@node1 ~]# ss -tunl | grep 80
tcp    LISTEN     0      128                    *:80                    *:* 
#测试启动正常

2)配置varnish:

#安装就不介绍;前面有介绍
[root@node2 ~]# vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80    更改监听端口
#
# # Telnet admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
#
# # Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret
#
# # The minimum number of worker threads to start
VARNISH_MIN_THREADS=50
#
# # The Maximum number of worker threads to start
VARNISH_MAX_THREADS=1000
#
# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120
#
# # Cache file location
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=1G
#
# # Backend storage specification
#VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
VARNISH_STORAGE="malloc,100M"    更改存储类型

3)配置vcl文件:

[root@node2 ~]# vim /etc/varnish/test.vcl
backend static {
  .host = "192.168.0.114";
  .port = "80";
}
acl purgers {
  "127.0.0.1";
  "192.168.0.0"/24;
}
sub vcl_recv {
  if(req.request == "PURGE") {
    if(!client.ip ~ purgers)  {
    error 405 "Method not allowd.";
    }
  }
   if (req.restarts == 0) {
      if (req.http.x-forwarded-for) {
          set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
      } else {
          set req.http.X-Forwarded-For = client.ip;
      }
   }
   return(lookup);
}
sub vcl_hit {
  if(req.request == "PURGE") {
    purge;
    error 200 "Purged Success.";
  }
}
sub vcl_miss {
  if(req.request == "PURGE") {
    purge;
    error 404 "Not in cache.";
  }
}
sub vcl_pass {
  if(req.request == "PURGE") {
    error 502 "Purged on a passed object.";
  }
}
sub vcl_fetch {
  if(req.url ~ "\.(jpg|png|gif|jpeg)$") {
     set beresp.ttl = 7200s;
  }
  if(req.url ~ "\.(html|htm|css|js)$") {
     set beresp.ttl = 1200s;
  }
}
sub vcl_deliver {
  if (obj.hits > 0) {
    set resp.http.X-Cache = "HIT from " + server.ip;
  }else {
    set resp.http.X-Cache = "MISS";
  }
}

4)编译启用:

[root@node2 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
varnish> vcl.load test2 test.vcl
200      
VCL compiled.
varnish> vcl.use test2
200      
varnish>

提供静态页面:

[root@node4 ~]# service httpd start
Starting httpd:                                            [  OK  ]
[root@node4 ~]# vim /var/www/html/index.html
<h1>This is static page!IP:192.168.0.114</h1>

5)配置nginx和tomcat:

#安装不做说明;配置nginx
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
[root@node3 ~]# vim /etc/nginx/conf.d/default.conf
#在location中定义proxy_pass即可
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
    location / {
#        root   /usr/share/nginx/html;
#        index  index.html index.htm;
         proxy_pass http://192.168.0.113:8080;    #全部代理到后端8080端口
    }

配置tomcat

#安装不做说明;也无需做配置;安装完成后启动即可
[root@node3 conf]# ll /etc/rc.d/init.d/tomcat
-rwxr-xr-x 1 root root 1288 May 11 18:28 /etc/rc.d/init.d/tomcat
[root@node3 conf]#
[root@node3 conf]# service tomcat start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/latest
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@node3 ~]# ss -tunl | grep 8080
tcp    LISTEN     0      100                   :::8080                 :::*

提供jsp页面文件

[root@node3 ROOT]# pwd
/usr/local/tomcat/webapps/ROOT
[root@node3 ROOT]# vim dynamic.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
  <head>
    <title>JSP test page.</title>
  </head>
  <body>
    <% out.println("This is dynamic page!"); %>
  </body>
</html>

6)测试访问:

wKioL1NvVAKyhtZDAAEJeBCSh4c494.jpg

wKiom1NvVDux8UVlAADUnrKShD0379.jpg测试访问正常;动静分离正常。到此LNMT配置完成。mysql可以安装测试与LAMP大致相同。

二、LAMT的配置:

大致规划:

主机IP
haproxy192.168.0.111  node1.soul.com
varnish192.168.0.112  node2.soul.com
httpd192.168.0.113  node3.soul.com
httpd+tomcat
192.168.0.114  node4.soul.com
tomcat192.168.0.115  node5.soul.com

wKiom1Nvnqug23ifAAEp9gqhULA106.jpg

这里是接着上面的配置来的;所以关于haproxy和varnish的配置不做说明了;重点来看httpd和tomcat的整合和负载均衡;其中对应的IP需要更改下:

haproxy:

[root@node1 ~]# vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend dynamic
    balance     roundrobin
    server  node4 192.168.0.114:80 check    #这里的后端更改为114主机

node2上的varnish:

[root@node2 ~]# vim /etc/varnish/test.vcl
backend static {
  .host = "192.168.0.113";
  .port = "80";
}

重新编译后测试即可.

基于Apache做为Tomcat前端的架构来讲,Apache通过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。而对Tomcat来说,每个Web容器实例都有一个Java语言开发的连接器模块组件,在Tomcat6中,这个连接器是org.apache.catalina.Connector类。这个类的构造器可以构造两种类别的连接器:HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。但可以简单地通过在server.xml配置文件中实现连接器的创建,但创建时所使用的类根据系统是支持APR(Apache Portable Runtime)而有所不同。

APR是附加在提供了通用和标准API的操作系统之上一个通讯层的本地库的集合,它能够为使用了APR的应用程序在与Apache通信时提供较好伸缩能力时带去平衡效用。

同时,需要说明的是,mod_jk2模块目前已经不再被支持了,mod_jk模块目前还apache被支持,但其项目活跃度已经大大降低。因此,目前更常用 的方式是使用mod_proxy模块。

本次以mod_proxy模块做实验:

1)配置node4上的httpd和tomcat:

#配置httpd;基于mod_proxy模块与后端tomcat联系;这里直接为mod_proxy模块写一个单独的配置文件:
[root@node4 conf.d]# pwd
/etc/httpd/conf.d
[root@node4 conf.d]# vim mod_proxy.conf
ProxyVia on
ProxyRequests off
ProxyPreserveHost on
<proxy balancer://lb>    #定义一个组
BalancerMember ajp://192.168.0.114:8009 loadfactor=1 route=TomcatA
BalancerMember ajp://192.168.0.115:8009 loadfactor=1 route=TomcatB
</proxy>    #组内使用ajp协议进行后端代理
ProxyPass / balancer://lb/        #代理到后端的组
ProxyPassReverse / balancer://lb/
                                                                                                                                                                                                                                                                                                                                                                                                                                
#tomcat的安装就不再赘述;提供node4和node5上的页面文件:
[root@node4 ~]# vim /usr/local/tomcat/webapps/ROOT/dynamic.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA </font></h1>
    <table align="centre" 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>
                                                                                                                                                                                                                                                                                                                                                                                                                                
------------------------------------------------------------------
                                                                                                                                                                                                                                                                                                                                                                                                                                
[root@node5 ~]# vim /usr/local/tomcat/webapps/ROOT/dynamic.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="blue">TomcatB </font></h1>
    <table align="centre" 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>
                                                                                                                                                                                                                                                                                                                                                                                                                                
#完成后重启httpd测试。

wKioL1NveaDyIoADAAEnu0iL4D0287.jpg

wKiom1Nved6gQ7ERAAELnSAI98w948.jpg

测试haproxy的地址192.168.0.111同样生效:

wKioL1NveiixfRmKAAEMmy6r7EA833.jpg

2)绑定session会话和开启负载均衡管理界面:

#更改httpd代理的配置文件
[root@node4 ~]# vim /etc/httpd/conf.d/mod_proxy.conf
ProxyVia on
ProxyRequests off
ProxyPreserveHost on
<proxy balancer://lb>
BalancerMember ajp://192.168.0.114:8009 loadfactor=1 route=TomcatA
BalancerMember ajp://192.168.0.115:8009 loadfactor=1 route=TomcatB
</proxy>
<Location /lbmanager>    #定义负载均衡管理界面
        SetHandler balancer-manager
</Location>
ProxyPass /lbmanager !    #该界面是不做代理
ProxyPass / balancer://lb/ stickysession=JSESSIONID    #开启session绑定
ProxyPassReverse / balancer://lb/
                                                                                                                                                                                                                                                                                                                                                                                       
#除了httpd配置文件;还需要更改tomcat的配置文件;后端两个节点都需要对应的更改:
[root@node4 ~]# vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">
#在该行添加jvmRoute="TomcatA"这条信息;node5对应添加为TomcatB

重启httpd和tomcat测试:

wKioL1NvfR6TMATcAAE7udfzD14640.jpg

可以发现后面已有session信息;且刷新页面不会在调度到TomcatA主机上。

wKioL1NvfXrCjS4EAAJW5QDg3L8343.jpg

测试管理界面也是正常的。可以在此处做简单的管理操作。

3)下面配置tomcat的session会话集群:

由于各版本可能有差异;可以参考官方文档:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

#更改tomcat的配置文件;在engine段添加如下:
[root@node4 ~]# vim /usr/local/tomcat/conf/server.xml
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">
    <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="228.0.40.4"    #广播地址
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      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"/>
          </Channel>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
          <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.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
                                                                                                                                                                                                                                                                                                                             
#完成后复制一份到node5上;对应的jvmRoute更改即可;

还需在web.xml中添加:

[root@node4 ~]# cp /usr/local/tomcat/conf/web.xml /usr/local/tomcat/webapps/ROOT/WEB-INF/
#因为本次使用的就是默认目录;所以拷贝到默认目录下;具体情况以自己的为准
[root@node4 ~]# vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
<distributable/>
#在正文空白中添加上面一行即可;同复制一份到node5;
                                                                                                                                                                                                                                                                                                                     
#注释掉调度器的黏性
[root@node4 ~]# vim /etc/httpd/conf.d/mod_proxy.conf
# stickysession=JSESSIONID    注释掉或删掉即可。
#重启httpd和tomcat测试。

wKioL1Nvhu6RIzRcAAEyvGgKRqc580.jpg

wKiom1NvhyjSObNyAAEVlrIlrfc258.jpg

可以看见上述虽然节点改变了;但是sessionID还是相同的;到此实现了session会话保持。




如有错误;恳请纠正。

本文出自 “Soul” 博客,请务必保留此出处http://chenpipi.blog.51cto.com/8563610/1409622