实现基于Keepalived+Haproxy+Varnish+LNMP企业级架构

原理:缓存,又称加速器,用于加速运行速度较快的设备与较慢设备之间的通信。基于程序的运行具有局部性特征其能实现加速的功能

一、环境准备

1.1 相关配置

机器名称 IP配置 服务角色 备注
haproxy-server-master VIP:172.17.120.120 RIP:172.17.66.66 负载均衡器主服务器 配置keepalived
haproxy-server-backup VIP:172.17.120.120 RIP:172.17.251.66 负载均衡器从服务器 配置keepalived
varnish 192.168.37.111 缓存服务器 开启代理功能
rs01 192.168.37.222 后端服务器 开启lnmp的web服务
rs02 192.168.37.100 后端服务器 开启lnmp的web服务

1.2 安装服务

  我们需要在相应的机器上安装我们的服务:
1)haproxy-server-master&haproxy-server-backup 上:

    yum install haproxy -y
yum install keepalived -y

2)varnish 上:
  varnish服务器请用centos7来做。

    yum install varnish -y

3)rs01&rs02 上:
  安装配置LNMP。详情见我之前的博客——Nginx详解以及LNMP的搭建

1.3 关闭防火墙及selinux

    iptables -F && setenforing

  
  本步骤完成。

二、配置 Haproxy

  我们需要把两个机器的Haproxy都设置好。我们去修改一下Haproxy的配置文件——/etc/haproxy/haproxy.cfg
  global段和default段都是设置好的,我们就不需要修改,下面是我们需要修改的部分:
1)frontend段

frontend  web
bind *:80
default_backend varnish-server

2)backend段

backend varnish-server
balance roundrobin
server varnishsrv 192.168.37.111:6081 check inter 3000 rise 3 fall 5

3)listen段

listen admin
bind :9527
stats enable
stats uri /haproxyadmin
stats auth admin:admin
stats refresh 20s
stats admin if TRUE

  第一台机器设置好了以后,直接使用scp命令发到第二台机器即可。
  然后把两台机器的服务都开启:

    service haproxy start

  本步骤完成。

三、配置keepalived

3.1 配置 haproxy-server-master (主服务器)

  配置文件为/etcc/keeplalived/keepalived.conf,我们编辑以下三段即可:
1)全局段——设置发送邮件

global_defs {
notification_email {
root@localhost
}
notification_email_from root@keer.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id keepalived_haproxy
}

2)编辑健康监测脚本
  该脚本作用是对haproxy进行健康监测,每隔2s监测一次haproxy进程。

vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
fall 2
rise 2
weight -4
}

3)定义主从和VIP

vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 170
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass keer
}
virtual_ipaddress {
172.17.120.120
}
track_script {
chk_haproxy
}
}

3.2 配置 haproxy-server-backup (从服务器)

  从服务器和主服务器的配置很是相似,我们可以直接使用scp命令把主服务器的配置文件拷过来,然后,我们只需要把第二段删掉,同时修改一下第三段的主从和优先级即可:

vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 170
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass keer
}
virtual_ipaddress {
172.17.120.120
}
}

  本步骤完成。

四、配置Varnish

4.1 修改Management进程配置文件

  Management进程的配置文件为/etc/varnish/varnish.params。我们先来修改一下这个文件,主要是修改端口和缓存类型及大小:

    VARNISH_ADMIN_LISTEN_PORT=6082
VARNISH_STORAGE="file,/data/cache,1G"

4.2 修改Varnish总配置文件

  Varnish的总配置文件为/etc/varnish/default.vcl,我们来修改一下这个配置文件:
1)第一段
① 定义一个健康监测:

vcl 4.0;        #指定版本
import directors; #加载后端的轮询模块
probe backend_healthcheck { #设置名为backend_healthcheck的健康监测
.url = "/index.html";
.window = 5; #窗口
.threshold = 2; #门槛
.interval = 3s;
.timeout = 1s;
}

② 设置后端server:

backend web1 {
.host = "192.168.37.222";
.port = "80";
.probe = backend_healthcheck;
}
backend web2 {
.host = "192.168.37.100";
.port = "80";
.probe = backend_healthcheck;
}

③ 配置后端集群事件

sub vcl_init {
new img_cluster = directors.round_robin();
img_cluster.add_backend(web1);
img_cluster.add_backend(web2);
} acl purgers { # 定义可访问来源IP,权限控制
"127.0.0.1";
"172.17.0.0"/16;
}

2)第二段——定义引擎

① 定义vcl_recv引擎
  定义不认识的头部请求直接扔后端的pass

sub vcl_recv {
if (req.method == "GET" && req.http.cookie) {
return(hash); //处理完recv 引擎,给下一个hash引擎处理
}
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "PURGE" &&
req.method != "DELETE") {
return (pipe); //除了上边的请求头部,通过通道直接扔后端的pass
}

  定义index.php通过特殊通道给后端的server,不经过缓存

    if (req.url ~ "index.php") {
return(pass);
}

  定义删除缓存的方法

    if (req.method == "PURGE") {   //PURGE请求的处理的头部,清缓存
if (client.ip ~ purgers) {
return(purge);
}
}

  为发往后端主机的请求添加X-Forward-For首部

    if (req.http.X-Forward-For) {    //为发往后端主机的请求添加X-Forward-For首部
set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip;
} else {
set req.http.X-Forward-For = client.ip;
}
return(hash);
}

② 定义vcl_hash 引擎,后没有定义hit和Miss的路径,所以走默认路径

sub vcl_hash {
hash_data(req.url);
}

③ 定义要缓存的文件时长

sub vcl_backend_response {     //自定义缓存文件的缓存时长,即TTL值
if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
set beresp.ttl = 30d;
}
if (bereq.url ~ "\.(html|css|js)$") {
set beresp.ttl = 7d;
}
if (beresp.http.Set-Cookie) { //定义带Set-Cookie首部的后端响应不缓存,直接返回给客户端
set beresp.grace = 30m;
return(deliver);
}
}

④ 定义deliver 引擎

sub vcl_deliver {
if (obj.hits > 0) { //为响应添加X-Cache首部,显示缓存是否命中
set resp.http.X-Cache = "HIT from " + server.ip;
} else {
set resp.http.X-Cache = "MISS";
}
unset resp.http.X-Powered-By; //取消显示php框架版本的header头
unset resp.http.Via; //取消显示varnish的header头
}

  
  本步骤完成。

五、开启服务的顺序

1)先开启后端server事先搭建好的lnmp web服务

    systemctl start nginx
systemctl start php-fpm
systemctl start mariadb

2)再开启varnish缓存服务器

    service varnish start

3)开启主从的keepalived,提供VIP

    service keepalived start

4)开启haproxy服务

    service haproxy start

  本步骤完成。

六、测试

1)配置完成后,client访问,http://172.17.120.120/ ,成功访问web

2)访问http://172.17.120.120:9527/haproxy?admin ,haproxy的web监测页面,正常

3)当主haproxy 宕机时,VIP自动漂移到从上,且服务正常使用;
在主haproxy 上,server stop haproxy,VIP会漂到从上。

4)varnish 缓存服务器上,确实生成了缓存文件

  F12打开网页的调试页面,查看确实缓存了:

5)测试清缓存的功能,PURGE 发送头部信息

6)后端有一台server 宕机,服务照常使用
  我们停掉一台后端服务器:

    systemctl stop nginx


  然后我们再去浏览器查看一下:

  bing~实验完成


  以上~如果有不足之处还请大家多多指教喏٩(๑>◡<๑)۶

Varnish 实战的更多相关文章

  1. Varnish 实战项目

    实现基于Keepalived+Haproxy+Varnish+LNMP企业级架构 原理:缓存,又称加速器,用于加速运行速度较快的设备与较慢设备之间的通信.基于程序的运行具有局部性特征其能实现加速的功能 ...

  2. Varnish 缓存加速, Varnish 菜鸟看过来,Varnish实战

    Varnish可以有效降低web服务器的负载,提升访问速度.按照HTTP协议的处理过程,web服务器接受请求并且返回处理结果,理想情况下服务器要在不做额外处理的情况下,立即返回结果,但实际情况并非如此 ...

  3. 项目实战5—企业级缓存系统varnish应用与实战

    企业级缓存系统varnish应用与实战 环境背景:随着公司业务快速发展,公司的电子商务平台已经聚集了很多的忠实粉丝,公司也拿到了投资,这时老板想通过一场类似双十一的活动,进行一场大的促销,届时会有非常 ...

  4. varnish 项目实战

    1.工作原理 在当前主流的Web服务架构体系中,Cache担任着越来越重要的作用.常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键.而最近几年由FreeBSD创始人之一Kamp ...

  5. Varnish 4.0 实战(转)

    简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高.速度更快.管 ...

  6. Varnish 4.0 实战

    简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高.速度更快.管 ...

  7. 优化系统资源ulimit《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》

    优化系统资源ulimit<高性能Linux服务器构建实战:运维监控.性能调优与集群应用> 假设有这样一种情况,一台Linux 主机上同时登录了10个用户,在没有限制系统资源的情况下,这10 ...

  8. 优化Linux内核参数/etc/sysctl.conf sysctl 《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》

    优化Linux内核参数/etc/sysctl.conf  sysctl  <高性能Linux服务器构建实战:运维监控.性能调优与集群应用> http://book.51cto.com/ar ...

  9. Varnish 4.0

    Varnish 4.0 实战   简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varn ...

随机推荐

  1. tee---将数据重定向到文件,

    tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin.简单的说就是把数据重定向到给定文件和屏幕上. 存在缓存机制,每1024个字节将输出一次.若从管道接收输 ...

  2. leetcode: Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  3. 【Android界面实现】使用GestureOverlayView控件实现手势识别

    在Android开发中,我们不光能够使用已有的实现方式.并且,我们还能够利用Android这个智能手机平台.实现一些比較有特色的功能. 本篇文章介绍使用GestureOverlayView这个控件.实 ...

  4. 通过Debug-->Attach to Process的方式来调试网站

    找到网站所对应的应用程序池

  5. SpringBoot与Dubbo整合-项目搭建

    本章节建立生产者和消费者来演示dubbo的demo 生产者:springboot-dubbo-provider 和 消费者:springboot-dubbo-consumer 工程配置详解 Apach ...

  6. Anders Hejlsberg 和 Erich Gamma

    Anders Hejlsberg 和 Erich Gamma 大概半年前,我写了一篇名叫<有点软文>的文章,深情并茂地告诉大家,我司其实隐藏着很多牛人巨擘.有些人是身怀屠龙技,但是大家不认 ...

  7. js -- canvas img 封装

    鼠标   1.操作canvas 中的 img. 右键放大缩小,左键移动img. 2.拖动input type= range  改变图片的透明度 html 代码 <!DOCTYPE html> ...

  8. java接口理解(转载)

    今天和同事好好的讨论了java接口的原理和作用,发现原来自己的对接口的理解仅仅是局限在概念的高度抽象上,觉得好像理解了但是不会变化应用其实和没有理解差不多.以前看一个帖子说学习一个东西不管什么时候都要 ...

  9. ps---报告当前系统的进程状态

    ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同.现在的大部分Linux系统都是可以同时使用这两种方式的. linux上进程有5种状态: ...

  10. Hive通过查询语句向表中插入数据过程中发现的坑

    前言 近期在学习使用Hive(版本号0.13.1)的过程中,发现了一些坑,它们也许是Hive提倡的比关系数据库更加自由的体现(同一时候引来一些问题).也许是一些bug.总而言之,这些都须要使用Hive ...