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

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

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

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

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

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

一、LNMT的试验配置

LNMT:

主机 IP
haproxy 192.168.0.111    node1.soul.com
varnish 192.168.0.112    node2.soul.com
nginx+tomcat 192.168.0.113    node3.soul.com
httpd 192.168.0.114    node4.soul.com

1)配置haproxy

#直接yum安装haproxy即可;
[[email protected] ~]# 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
[[email protected] ~]# service haproxy start
Starting haproxy:                                          [  OK  ]
[[email protected] ~]# ss -tunl | grep 80
tcp    LISTEN     0      128                    *:80                    *:*
#测试启动正常

2)配置varnish:

#安装就不介绍;前面有介绍
[[email protected] ~]# 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文件:

[[email protected] ~]# 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)编译启用:

[[email protected] ~]# 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>

提供静态页面:

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

5)配置nginx和tomcat:

#安装不做说明;配置nginx

[[email protected] ~]# 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

#安装不做说明;也无需做配置;安装完成后启动即可
[[email protected] 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
[[email protected] conf]#
[[email protected] 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
[[email protected] ~]# ss -tunl | grep 8080
tcp    LISTEN     0      100                   :::8080                 :::*

提供jsp页面文件

[[email protected] ROOT]# pwd
/usr/local/tomcat/webapps/ROOT
[[email protected] 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)测试访问:

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

二、LAMT的配置:

大致规划:

主机 IP
haproxy 192.168.0.111  node1.soul.com
varnish 192.168.0.112  node2.soul.com
httpd 192.168.0.113  node3.soul.com
httpd+tomcat 192.168.0.114  node4.soul.com
tomcat 192.168.0.115  node5.soul.com

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

haproxy:

[[email protected] ~]# 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:

[[email protected] ~]# 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模块写一个单独的配置文件:
[[email protected] conf.d]# pwd
/etc/httpd/conf.d
[[email protected] 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上的页面文件:
[[email protected] ~]# 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>

------------------------------------------------------------------

[[email protected] ~]# 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测试。

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

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

#更改httpd代理的配置文件
[[email protected] ~]# 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的配置文件;后端两个节点都需要对应的更改:
[[email protected] ~]# vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">
#在该行添加jvmRoute="TomcatA"这条信息;node5对应添加为TomcatB

重启httpd和tomcat测试:

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

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

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

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

#更改tomcat的配置文件;在engine段添加如下:
[[email protected] ~]# 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中添加:

[[email protected] ~]# cp /usr/local/tomcat/conf/web.xml /usr/local/tomcat/webapps/ROOT/WEB-INF/
#因为本次使用的就是默认目录;所以拷贝到默认目录下;具体情况以自己的为准
[[email protected] ~]# vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
<distributable/>
#在正文空白中添加上面一行即可;同复制一份到node5;

#注释掉调度器的黏性
[[email protected] ~]# vim /etc/httpd/conf.d/mod_proxy.conf
# stickysession=JSESSIONID    注释掉或删掉即可。
#重启httpd和tomcat测试。

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

如有错误;恳请纠正。

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

时间: 2024-11-08 17:30:44

LNMT/LAMT实现动静分离、负载均衡和会话保持的相关文章

nginx实现动静分离负载均衡集群

LB 负载均衡集群分两类: LVS (四层)和 nginx 或 haproxy (七层) 客户端通过访问分发器的 VIP 来访问网站 | 现在应用更复杂,比如现在网站页面有: .php .html .png .jpeg .jsp 等, 有劢态页面有静 态页面.静态页面一般是丌变的,想访问更快些,前面学习过 SQUID. | 但是前面的 LVS 是四层的.基于 IP 的.现在需要在应用层基于丌同的应用迚行分发. | 七层 LB , Nginx / Haproxy 都可以支持 7 层 LB 现在实现

nginx+apache动静分离/负载均衡

[主从] [Mysql-Master] log-bin=mysql-bin server-id = 1 MariaDB [(none)]> grant replication slave on *.* to 'slave'@'192.168.2.158' identified by '123.com'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> show master status; +------------------

nginx实现动静分离负载均衡

拓扑:nginx代理分发器:192.168.2.130web1===192.168.2.131web2===192.168.2.132源码编译安装nginx 1.环境准备:(1)安装nginx时必须先安装相应的编译工具和相关依赖 [[email protected] ~]#yum -y install gcc gcc-c++ autoconf automake [[email protected] ~]#yum -y install zlib zlib-devel openssl openssl

网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析

网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析 文章分类:综合技术 1.HTML静态化其实大家都知道,效率最高.消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法.但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态

apache安装、简单配置负载均衡和会话保持

首先安装apache依赖的apr和apr-util 1.下载(apr.apache.org/download.cgi)源文件, 如apr-1.5.1.tar.gz 2.解压 tar -xzvf apr-1.5.1.tar.gz 3.进入解压目录,依次执行 1 2 3 . /configure make make install 4.下载(apr.apache.org/download.cgi)源文件, 如apr-util-1.5.4.tar.gz 5.解压 tar -xzvf apr-util-

网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析

网站设计阶段是网站开发过程中非常重要的阶段之一,我们只有在设计阶段拥有优秀的设计思路与方法,才能使我们设计出来的网站更加的高效.稳定.本文我们介绍了网站设计过程中需要注意的一些事项,接下来我们就来一起了解一下这一过程. 1.HTML静态化 其实大家都知道,效率最高.消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实 也是最有效的方法.但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS

基于amoeba实现mysql数据库的读写分离/负载均衡

一.Amoeba的简述:[来自百度百科] Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求.与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单). Amoeba相当于一个SQL请求的路由器,目的是为

mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)

mysql主从复制与lvs+keepalived实现负载高可用 目录 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方案    4 3.1.环境    4 3.2.架构图    5 3.3.设计原理    6 4.相关软件安装    6 4.配置mysql的主从    7 5.通过lvs+keepalived实现负载与热备,并实现读写分离    8 1.前言 最近研究了下高可用的东西,这里总结一下mysql主从复制读

数据库主从复制,读写分离,负载均衡,分表分库的概念

谢邀,这是个好问题,而且这个问题好在即使概念非常容易理解,但是这几个不同的概念细节太多太多,而且理解了概念,自己要用,又需要做很多的调研评估和开发工作.作为在这个领域爬坑多年的人,我这里就先介绍下概念,再提供几个开源工具和云服务吧.先来说这些架构解决的问题吧,传统数据库如Mysql(以下工具也会以Mysql为主),存在的问题就是单机部署,单进程,这样就存在一些问题:资源利用不灵活,有可能cpu的性能还有富余,但是磁盘已经顶不住读压力或写压力了,有可能磁盘的性能还有富余,但是cpu的性能已经顶不住