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服务器整体性能的提升很大, 但是正常情况下, 我们都会通过特定的缓存服务器来提供缓存, 如varnish, squid等开源的程序

varnish简介

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

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

Varnish Architecture

Alt textblob.png

图片源地址

Varnish(v4) Work Flow

blob.pngAlt text

图片源地址

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服务器上执行
[root@web ~]# yum install httpd -y 
[root@web ~]# vim /etc/httpd/conf/httpd.conf  #编辑配置文件
Listen 8080   #修改监听端口为8080

[root@web ~]# echo "<h1>This is Web1</h1>" > /var/www/html/index.html  #创建主页文件
[root@web ~]# service httpd start  #启动httpd



以下操作在varnish
服务器上执行
[root@varnish ~]# yum install varnish -y  #安装varnish
[root@varnish ~]# systemctl start varnish  #启动varnish

[root@varnish ~]# vim /etc/varnish/varnish.params #编辑varnish的参数配置文件
VARNISH_LISTEN_PORT=80  # 修改PORT为80
VARNISH_STORAGE="malloc,256M"  #修改缓存的存储方式为内存, 可以不修改


[root@varnish ~]# vim /etc/varnish/default.vcl   #编辑varnish的主配置文件, 将default{}按照下面进行修改

backend default {
    .host = "172.16.1.2";   #修改为后端的主机
    .port = "8080";  #要和后端的http主机监听端口相同
}

[root@varnish ~]# 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

测试

测试访问和缓存效果

[root@node2 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的日志并没有更新
[root@node2 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服务器配置过程

以下操作在dynamic下进行

[root@dynamic ~]# yum install httpd  php -y   #安装httpd和php

[root@dynamic ~]# vim /etc/httpd/conf/httpd.conf  #修改监听端口为8080
Listen 8080

[root@dynamic html]# vim /var/www/html/index.php    #创建动态网页文件
<html>   
   <body>
   <img src="1.gif"/>
   <h1>This is Index on node1 dynamic</h1>
   <?php
      echo "<This is PHP Page";
  ?>
  </body>
</html>

[root@dynamic html]# service httpd start   #启动httpd


以下操作在static下进行

[root@static ~]# yum install httpd -y

[root@sttaic ~]# vim /etc/httpd/conf/httpd.conf  #修改监听端口为8080
Listen 8080

[root@static ~]# vim /var/www/html/index.html   #创建静态网页文件
<h1>This is Index on Node2 static </h1>

[root@static html]# ls  #我们从本地上传了一张gif图
1.gif  index.html
[root@static html]# service httpd start #启动httpd

varnish配置

以下操作在varnish主机上执行

[root@varnish ~]# 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);    #如果请求动态页面不查缓存
 }
}


[root@varnish varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082

varnish> vcl.load test1 default.vcl
varnish> vcl.use test1

测试效果

我们访问index.html

Alt textblob.png

我们访问index.php

Alt textblob.png

总结

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

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

原创文章,作者:Net18-AnyISalIn,如若转载,请注明出处:http://www.178linux.com/15080

(0)
Net18-AnyISalInNet18-AnyISalIn
上一篇 2016-04-18 17:15
下一篇 2016-04-19 10:03

相关推荐

  • keepalived单主模型和nginx双主模型

    主程序:keepalived 主配置文件:/etc/keepalived/keepalived.conf 单主模型ipvs: global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.…

    Linux干货 2017-08-08
  • Linux三剑客之grep使用入门指南

    Linux的grep是一个具有强大功能的文本搜索工具,正确的学习和使用,能很大程度上提高工作效率,减轻运维工作所面临的压力。

    2017-09-09
  • 脚本数组及yum软件包管理器

    一、数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 数组名和索引索引:编号从0开始,属于数值索引注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持。bash的数组支持稀疏格式(索引不连续) 1.定义数组声明数组:    declare …

    Linux干货 2016-08-25
  • N22-第七周作业

    1、创建一个10G分区,并格式为ext4文件系统;   (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;   (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; 在扩展分区/dev/sda4下新建一个10G的分…

    Linux干货 2016-10-25
  • 【linux】正则表达式之grep、egrep、元字符

    正则表达式:     又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。是一类字符所书写的模式,其中许多字符(元字符)不表示其字面意义,而是表达控制或通配等功能。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符…

    Linux干货 2015-04-01
  • 作业管理

    作业管理 ·Linux的作业控制:          前台作业:通过终端启动,且启动后一直占据终端;          后台作业:可通过终端启动,但启动后即转入后台运行(释放终端) ·如何让作业运行于…

    Linux干货 2016-09-11