关于varnish的原理及配置流程

1 总体流程

主进程 fork 子进程,主进程等待子进程的信号,子进程退出后,主进程重新启动子进程

子进程生成若干线程。

Accept 线程:接受请求,将请求挂在 overflow队列上

Work 线程: 多个,从对列上摘除请求,对请求进行处理,直到完成,然后处理下一个

请求

Epoll 线程: 一个请求处理称作一个 session,在 session 周期内,处理完请求后,会交给

Epoll 处理,监听是否还有事件发生。

Expire 线程:对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的

根,处理过期的文件。

处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。

线程之间的关系:

2. accept 线程

监听端口,接受连接。

接受后组织成 struct ses(session 结构) ,看是否有空闲的工作线程,如果有,将请求给它,

pthread_cond_signal 信号通知它没有空闲线程,如果 overflow过大,则放弃该请求。否则,

将其挂在 overflow 上(需要更多工作线程,发通知)。

继续监听 2.1.2 work 线程

从 overflow队列上摘取请求(struct ses),进入状态机处理,处理结束后,通过 pipe通信,

将 struct ses发送给 epoll 线程。

2.1.3 Epoll 线程,得到传过来的 struct ses,若还没有过期,将 socket 放入 epoll 的事件中,事

件发生时,也会将其放入到 overflow中进行。

varnish的简单配置

1.准备4台虚拟机

主配置机其ip为172.25.79.1 名称为wyx1

安装varnish

[root@wyx1 ~]# yum install varnish-3.0.5-1.el6.x86_64.rpm   varnish-libs-3.0.5-1.el6.x86_64.rpm -y

俩个安装包必须同时安装 ,否则会出现依赖性的问题,导致无法安装

配置 varnish文件

vim /etc/sysconfig/varnish 配置varnish服务端口

vim /etc/varnish/default.vcl 配置一个后台服务器

配置完成后重新启动服务

/etc/init.d/varnish reload

测试:

在实验机上安装httpd

进行编辑/var/www/html/index

在物理机上输入curl 172.25.79.1

进行测试测试结果如下

###查看缓存命中情况
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from wyx cache";(从1号缓存机中获取的)
}
else {
set resp.http.X-Cache = "MISS from wyx cache";(从2号缓存机中获取的)
}
return (deliver);
}
# service varnish reload

当第一次访问时访问结果如下

当第二次及之后访问结果如下

### 通过 varnishadm 手动清除缓存

由于之前在文件/etc/sysconfig/varnish设置了1号机会缓存文件120秒,导致2号机进行更新 /etc/www/html/index.html中的

文件中,客户访问网站时没有得到实时更新,访问的还是之前的文件,需要清除1号机缓存,使得客户端访问的文件时最新的

# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120
# varnishadm ban.url .*$
#清除所有(注意,一般情况下不要用此命令,此命令会时前端缓存清空,导致所有访问都会到后端从而使后端服务器压力过大,可能奔溃)
# varnishadm ban.url /index.html
#清除 index.html 页面缓存
# varnishadm ban.url /admin/$
#清除 admin 目录缓存

###定义多个不同域名站点的后端服务器

backend wyx1 {
  .host = "172.25.79.2";
  .port = "80";
}
backend wyx2 {
.host = "172.25.79.3";
.port = "80";
}

#当访问 www.wyx.org 域名时从 wyx1 上取数据,访问 bbs.wyx.org 域名时到 wyx2 取数据,
访问其他页面报错。

if (req.http.host ~ "^(www.)?wyx.org") {
set req.http.host = "www.wyx.org";
set req.backend = wyx1;
} elsif (req.http.host ~ "^bbs.wyx.org") {
set req.backend = wyx2;
} else {error 404 "wyx cache";
}
}

测试

开启2.3号机的http服务,当客户端访问该域名时结果如下

###定义负载均衡

关于这个测试项目有俩种测试方法,一种是在3号机上配置http服务 配置一个域名为www。wyx。org

或者通过在打开一个虚拟机4进行安装http服务。在实验时我使用的是在加一个虚拟机4

在进行配置文件//etc/varnish/default.vcl

}
backend wyx3 {
  .host = "172.25.79.4";
  .port = "80";
}
backend wyx1 {
  .host = "172.25.79.2";
  .port = "80";
}
backend wyx2 {
.host = "172.25.79.3";
.port = "80";
}

定义一个轮询负载均衡lb编写如下

director lb round-robin {
{
.backend = wyx1;}

{.backend = wyx3;
#把多个后端聚合为一个组,并检测后端健康状况
}
}

if (req.http.host ~ "^(www.)?wyx.org") {
set req.http.host = "www.wyx.org";
set req.backend = lb;
return (pass);
#为了测试方便,不进行缓存。
} elsif (req.http.host ~ "^bbs.wyx.org") {
set req.backend = wyx2;
} else {
error 404 "westos cache";
}

测试

配置虚拟机4上的http配置文件在默认发目录中书写文件index.html文件

输入域名进行测试结果如下

###varnish cdn 推送平台

之前讲过手动清理缓存以便进行实时同步文件的更新,而在正常的应用中。有很多的服务端要同时更新,此时在用手动更新

就显得有点浪费时间了。这是引入varnish cdn 推送平台来解决这一问题。
http://www.wyx.org/p/bansys/
#需要安装 php 支持
# unzip bansys.zip -d /var/www/html

由于之前配置过varnish的服务端口为80,而此时应用到的http默认端口也为80

这是就需要进行对http的 默认端口进行更改

更改配置文件/etc/htttpd/conf/httpd.conf

中的Listen  的80端改为8080 避免与varnish的服务端口冲突
# vi /var/www/html/bansys/config.php
#只保留如下设置,其余注释掉

<?php    
            
 $var_group1 = array(
                        'host' => array('172.25.79.1'),
                        'port' => '80',            
                    );

//varnish群组定义
 //对主机列表进行绑定
 $VAR_CLUSTER = array(
                         'www.wyx.org' => $var_group1,
                     );

//varnish版本
 //2.x和3.x推送命令不一样
 $VAR_VERSION = "3";

?>

#bansys 有两种工作模式,分别是:telnet 和 http 模式。
#telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
#如果是 http 模式需要对 varnish 做以下设置:

acl wyx {
#设置访问控制
"127.0.0.1";
"172.25.0.0"/24;
}

if (req.request == "BAN") {
if (!client.ip ~ wyx) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}

测试

在主机上输入http://172.25.79.1:8080/bansys/ 进行cdn推送管理页面

选者HTTP推送模式 群组编辑需要更改的网站

推送内容编辑你要进行更改的文件

编辑前的网站访问结果为

修改4号机index.html文件

进行推送后
得到结果

可见更新成功

lanm中cdn之varnish服务的搭建相关推荐

  1. Linux中Tomcat 服务的搭建

    目录 一.Tomcat 服务简介: 二.Tomcat 服务的搭建 (1)需要学习: (2)安装 tomcat tomcat (3)确认安装 JDK (4)启动 tomcat (5)主机访问查看: (6 ...

  2. cdn之高速缓存服务器的搭建和配置

    一.cdn 1.名词解释 以下引用子百度百科 CDN的全称是Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节, ...

  3. 使用varnish + nginx + lua搭建网站的降级系统

    前言 通常一个网站数据库挂掉后,后果将是非常严重的.基本上整个网站基本不可用了.对于一些网站来说,当数据库挂掉后,如果能提供基本的浏览服务,也是不错的.本文将尝试使用 varnish + nginx ...

  4. 个人云服务的搭建(折腾)之旅

    目录 WebDAV挂载阿里网盘 什么是WebDAV服务? WebDAV挂载阿里网盘步骤 又拍云领取免费空间和流量 搭建chevereto图床挂载又拍云 chevereto外部存储使用准备 chever ...

  5. 企业CDN缓存 varnish--varnish的基本搭建(1)

    一  varnish的概述及原理 前面我先给大家讲述一下基本原理和思想,帮助大家彻底理解什么是varnish加速器 虽然互联网企业大多数使用nginx这个功能比较多的服务器,但是单学一个varnish ...

  6. 基于SpringCloud微服务的服务平台搭建的一些总结

    工作上项目的后台进行微服务改造后已经平稳运行将近1年了,起初项目为若干个单体web应用组成,之后由于上线App,需求的多样性和对于需求的响应速度有了更高的要求,因此为了快速响应需求变化,将后台进行微服 ...

  7. windows 下frp服务启动_内网穿透frp linux服务端搭建和windows客户端使用

    一.Linux 服务端搭建 1.下载安装 wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-in ...

  8. Nuget服务的搭建-打包-上传-删除

    为了便于公共库的内部复用,我们可以架设自己的nuget服务.首先创建一个Asp.net的空项目NugetServer,其次使用nuget安装nuget.server包,如下图 添加了nuget.ser ...

  9. 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】

    基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...

最新文章

  1. 前沿分享:连接统计学,机器学习与自动推理的新兴交叉领域
  2. 如何规划自己的博士五年生活?
  3. 【震惊】史上最牛的市场推广/营销
  4. plsql如何显示表结构图_工地新人如何看懂图纸
  5. 信息安全完全参考手册之遵循标准、法规和法律(第三章)
  6. 贪心算法及常见例子(附python实现代码)
  7. DM8与Oracle关于模式、用户等概念的分析
  8. Linux下视频流媒体直播服务器搭建详解
  9. win10上Redis设置密码
  10. 站群服务器找11火星软件
  11. 风力发电机组的基本结构
  12. 03-平方矩阵的快速解法
  13. 2022牛客多校9 BTwo Frogs(概率DP)
  14. softmax溢出问题
  15. BZOJ1050 [HAOI2006]旅行comf(Kruskal算法)
  16. [ZT]金融衍生品的重大危害性——兼谈3.27国债风暴
  17. Rabbitmq Ambiguous payload parameter for public xxx
  18. 线性代数 李永乐强化班
  19. 安科瑞“智慧用电”一个适合高校学生公寓安全用电的智能控制与管理系统
  20. python判断字符是英文字母怎么回事_python判断字符串是否包含字母

热门文章

  1. 字符指针分拣C语言,一种货物自动分拣方法及系统与流程
  2. php对象和json对象的互相转换——json_encode、json_decode
  3. FPGA数码管流动显示学号
  4. 区位码和国际码的转换, 点阵存储
  5. 【通讯原理】Ch.5:模拟信号调制
  6. 个人计算机安全意识如何提高,个人电脑安全意识如何提高..doc
  7. Teleport Ultra抓取不到登陆后的页面
  8. input上传图片并同步获取图片分辨率
  9. Half year work at Ericsson
  10. 泛工具产品深度分析 #1 独立产品周刊