Varnish基础进阶

Varnish基础进阶

    前言

    互联网早已惠及全人类, 我们可以通过网络与家人、朋友进行实时通信, 也能通过网络随时随地在各大电商站点上购物, 我们访问web站点的速度也越来越快, 这背后都是有很多精巧的架构以及各种先进的技术来支撑的, 我们就今天主要聊聊Web的缓存技术, 对于当今的互联网来说, Cahe Is King, 缓存真的有那么神奇么? 就由我来带领朋友们先领略一番当今最流行的开源缓存解决方案Varnish的风采

    为什么需要缓存?

    当今的Web站点, 特别是电商站点; 时常承受着高并发访问, 我们之前了解了一些负载均衡的解决方案可以将用户的请求调度到后端不同的服务器, 从而解决单台服务器不能承载高并发访问的情况; 但是我们如果将用户请求的URL所返回的页以特定存储方式存到特定的前端服务器中, 当用户再次请求相同资源时, 直接通过前端服务器响应给用户, 能够有效地减少后端服务器的的需要响应的次数

    我们来举个例子:

    不考虑负载均衡的情况下, 我们有一台工作在prefork模型下LAMP服务器, 2000个并发连接中有1600个都是静态页面, 只有400个是动态页面, 服务器需要1分钟响应完所有的请求, 大家都知道prefork模型一般情况下不能同时响应1024以上的连接数, 那么部分用户的请求就需要排队等待; 我们如果不修改Apache的工作模型, 该如何有效地解决这种问题呢?

    这种时候我们就需要缓存了, 我们可以通过Apache带的缓存模块对用户请求的URI和响应的页面以特定的形式存储在特定介质上(内存、文件), 当有其他用户再次请求此URI可以直接通过文件中的内容响应给用户, 一般这种情况只适用于静态页面; 我们还可以通过memcached来提供MySQL查询结果的缓存, 这样的情况下, 我们对于动态页面的响应速度也上了一个台阶. 经过测试我们只需要10秒左右就能响应所有的请求

    从上面的示例中我们可以看出缓存对web服务器整体性能的提升很大, 但是正常情况下, 我们都会通过特定的缓存服务器来提供缓存, 如varnishsquid等开源的程序

    varnish简介

    varnish是一款非常流行的http加速器, 性能有可能比squid要好; 官方站点: varnish-cache.org
    varnish在请求的接收到响应中间的各个位置都有类似于netfilter钩子函数的东西, 我们称它们为state engine

    具体相关知识查看官方文档, 和下面的图片

    Varnish Architecture

    图片源地址

    Varnish(v4) Work Flow

    图片源地址

    varnish的基本使用

    varnish的配置比较其他的服务有所不同, varnish通过VCL(varnish configuration language)的语法来编写其配置文件, 并且编写完配置文件后还要对其进行编译(基于C编译器), 才能够使用

    varnish简单的配置示例

    多说无益, 我们先给大家做一个实验, 能够明白基本用法了

    实验环境

    主机 IP 功用
    varnish 172.16.1.12 varnish node
    web1 1272.16.1.2 httpd server

    本实验所有主机关闭iptables和SElinux

    配置过程和测试

    注意: 本次实验, varnish主机的系统为CentOS7, varnish版本为4.0.3
    
    以下操作在web服务器上执行
    [[email protected] ~]# yum install httpd -y 
    [[email protected] ~]# vim /etc/httpd/conf/httpd.conf  #编辑配置文件
    Listen 8080   #修改监听端口为8080
    
    [[email protected] ~]# echo "<h1>This is Web1</h1>" > /var/www/html/index.html  #创建主页文件
    [[email protected] ~]# service httpd start  #启动httpd
    
    以下操作在varnish
    服务器上执行
    [[email protected] ~]# yum install varnish -y  #安装varnish
    [[email protected] ~]# systemctl start varnish  #启动varnish
    
    [[email protected] ~]# vim /etc/varnish/varnish.params #编辑varnish的参数配置文件
    VARNISH_LISTEN_PORT=80  # 修改PORT为80
    VARNISH_STORAGE="malloc,256M"  #修改缓存的存储方式为内存, 可以不修改
    
    [[email protected] ~]# vim /etc/varnish/default.vcl   #编辑varnish的主配置文件, 将default{}按照下面进行修改
    
    backend default {
        .host = "172.16.1.2";   #修改为后端的主机
        .port = "8080";  #要和后端的http主机监听端口相同
    }
    
    [[email protected] ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082  #连接到varnish的管理工具
    
    varnish> vcl.load test1 default.vcl  #编译配置文件为test1
    200        
    VCL compiled.
    
    varnish> vcl.use test1   #使用test1
    200        
    VCL ‘test1‘ now active

    测试

    测试访问和缓存效果
    
    [[email protected] html]# curl 172.16.1.12  #通过node2访问varnish IP地址能够获取到web的网页资源
    <h1>This is Web1</h1>
    
    这时候我们查看一下web服务的日志, 可以看到是varnish主机GET index.html
    172.16.1.12 - - [18/Apr/2016:22:37:04 +0800] "GET / HTTP/1.1" 200 22 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"   
    
    我们再次访问web, web的日志并没有更新
    [[email protected] html]# curl 172.16.1.12 
    <h1>This is Web1</h1>
    
    我们查看varnish的部分log如下
    -   VCL_call       HASH
    -   VCL_return     lookup
    -   Hit            2147483654
    -   VCL_call       HIT   #已经通过缓存响应给客户端
    -

    实现动静分离

    通过上面的实验相信大家也看出来了, varnish其实也是一个反向代理服务器, 下面我们使用varnish实现动静分离的效果

    实验环境

    主机 IP 功用
    varnish 172.16.1.12 varnish主机
    dynamic 172.16.1.2 动态页面去主机
    static 172.16.1.3 静态页面主机(图片)

    本实验所有主机关闭iptables和SElinux

    配置过程和测试

    web服务器配置过程

    
    

    varnish配置

    以下操作在varnish主机上执行
    
    [[email protected] ~]# vim /etc/varnish/default.vcl  #编辑配置文件添加以下字段
    
    backend dynamic {
        .host = "172.16.1.2";
        .port = "8080";
    }
    
    backend static {
        .host = "172.16.1.3";
        .port = "8080";
    }
    
    下面的字段在sub vcl_recv中添加
    
    if (req.url ~ "(php|php5)$") {
        set req.backend_hint = dynamic;
    } else {
        set req.backend_hint = static;
    }
    if (req.url ~ "(php|php5)$") {
         return(pass);    #如果请求动态页面不查缓存
     }
    }
    
    [[email protected] varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
    
    varnish> vcl.load test1 default.vcl
    varnish> vcl.use test1

    测试效果

    我们访问index.html

    我们访问index.php

    总结

    本文主要介绍了varnish的基本使用方法. 其实关于varnish我真的不知道该怎么写, 以后会经常会将varnish结合起来做实验的

    作者水平很低, 如果有错误及时指出, 如果你觉得本文写的好请点一波赞~(≧▽≦)/~
    作者: AnyISaIln QQ: 1449472454
    感谢: MageEdu

    时间: 2024-11-09 08:45:33

    Varnish基础进阶的相关文章

    varnish 使用进阶(二)

    varnish 使用进阶(二) ============================================================================== 概述: ============================================================================== 设定varnish使用多个后端主机:  1.介绍 ★两种情况 有多个后端主机,各主机分别响应不同的内容(动静分离) 基于负载均衡轮询的方式进行响

    varnish 使用进阶

    varnish 使用进阶 ================================================================================ 概述: ================================================================================ VCL配置用法详解  1.state engine:状态引擎切换机制(varnish4.0 ) ★request:  vcl_recv   接

    shell脚本基础进阶(四)----作业

    20150913-15作业 1.描述shell程序的运行原理(可附带必要的图形说明) shell脚本基础进阶(一)----shell介绍 2.总结shell编程中所涉及到的所有知识点(如:变量.语法.命令状态等等等,要带图的哟) shell脚本基础进阶(二)----变量及运算符 3.总结课程所讲的所有循环语句.条件判断的使用方法及其相关示例:(if (jpg|png is not exist):echo "You say a XX") shell脚本基础进阶(三)----流程控制语句

    varnish基础概念详解

    varnish基础概念详解 比起squid更加轻量级,大致有以下几个特点: ·可以基于内存缓存,也可以在磁盘上缓存,但是就算存放在磁盘上,也不能实现持久缓存 只要进程崩溃,此前缓存统统失效,无论是在内存还是在磁盘,但是现在已经具备持久缓存功能,但是仍然在实验阶段,经常容易崩溃,而且最大大小不能超过1G 如果期望内存大小超过几十个G,比如图片服务器,纯粹使用内存,性能未必好,这时候可以使用磁盘进行缓存,或SSD X 2 做RAID 避免磁盘损坏,在实现随机访问上 ssd硬盘要比机械硬盘要好的多,如

    tomcat基础进阶

    tomcat基础进阶 大纲 前言 Tomcat Architecture Tomcat Installation Tomcat basic configuration 如何进入Tomcat manager页面? 配置Virtual_Host 总结 前言 我们在前面的博客中介绍以及实现的web架构都是基于"世界上最好的语言"PHP实现动态web站点, 事实上在当今的web服务器端还经常python,perl,Java Script等编程语言实现动态的web站点, 我们今天就介绍一款实现著

    【思库教育】2017PHP项目实战基础+进阶+项目之基础篇

    下载链接: [思库教育]2017PHP项目实战基础+进阶+项目之基础篇 小白变大牛,您的专属资源库! 小白变大牛,您的专属资源库! 内容非常充实,可以看目录,设计的面多,项目多,技能多,如果掌握好,找一份PHP的工作,易如反掌!学完后可以到PHP小白变大牛精华区查找更加符合你的资源或者项目! [思库教育]2017PHP项目实战基础+进阶+项目之基础篇[思库教育]2017PHP项目实战基础+进阶+项目之进阶篇[思库教育]2017PHP项目实战基础+进阶+项目之项目篇小白变大牛!Python小白,J

    前端基础进阶系列

    前端基础进阶(一):内存空间详细图解 前端基础进阶(二):执行上下文详细图解 前端基础进阶(三):变量对象详解 前端基础进阶(四):详细图解作用域链与闭包 前端基础进阶(五):全方位解读this 前端基础进阶(六):在chrome开发者工具中观察函数调用栈.作用域链与闭包 前端基础进阶(七):函数与函数式编程 前端基础进阶(八):深入详解函数的柯里化 前端基础进阶(九):详解面向对象.构造函数.原型与原型链 前端基础进阶(十):面向对象实战之封装拖拽对象 前端基础进阶(十一):详细图解jQuer

    xmind8零基础/进阶/案例全程通关

    课程介绍:国内第一部弥补了xmind8思维导图无视频教程的空缺,是唯一一部严格按照番茄教学法顺序+实战的方式打造的适合国内白领的快快速上手教程.无论是你程序员还是普通hr,行政,亦或者是你是一名外卖的骑士......但是当你看到这个教程,很负责人的告诉您,你离主管职位不远了.曾经大家只要会office系列word,excel,ppt等就能突出自己,当今office乱大街的时候,xmind8刚好就是你的亮点.xmind8能让你在芸芸大众中脱颖而出,迅速得到领导的赏识,同事的肯定,因为她充分体现你的

    java基础进阶篇(六)_HashTable------【java源码栈】

    一.概述 ??前面介绍了HashMap的结构和原理,这里介绍个类似HashMap的结构Hashtable. ??HashTable 官方解释是HashMap的轻量级实现, 和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射. ??所以我们结合HashMap来介绍HashTable, 比较下两者的区别. ??HashTable 使用的很少, 它支持线程安全, 通过内部方法加上 synchronized 实现, 因此同步锁的密度太大了, 在实际情