varnish搭建cdn网络-------3.0.5版本
CDN分发网络
CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
#varnish

VCL 处理流程图

处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
环境搭建
server1 172.25.78.1 cdn调度器
server2 172.25.78.2 后端服务器web1
server3 172.25.78.3 后端服务器web2
1.只有一个后端服务器web1时的调度
varnish安装包下载网址
配置调度器server1
[root@server1 ~]# ls
varnish-libs-3.0.5-1.el6.x86_64.rpm
varnish-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]# yum install -y varnish-* jemalloc-3.6.0-1.el7.x86_64.rpm
[root@server1 ~]# rpm -qc varnish-3.0.5-1.el6.x86_64 # 查看varnish的配置文件
/etc/logrotate.d/varnish # varnish的日志文件
/etc/sysconfig/varnish # varnish的命令参数配置文件
/etc/varnish/default.vcl # varnish的程序主配置文件
[root@server1 ~]# vim /etc/sysconfig/varnish
NFILES=131072 # 最多打开文件的个数
MEMLOCK=82000 # 最大内存锁定大小
NPROCS="unlimited" # 进程数,unlimited表示不做限制
[root@server1 ~]# sysctl -a | grep file # 查看系统可以打开文件的个数,发现远小于varnish的最大个数
fs.file-nr = 448 0 98864
fs.file-max = 98864
为了和varnish软件匹配,需要修改文件个数,而文件个数是通过内存大小来控制的,所以我们需要通过加大内存来增加文件个数

[root@server1 ~]# sysctl -a | grep file # 再次查看,发现可以打开文件的个数可以满足varnish的最大需求
[root@server1 ~]# ulimit -l # 查看系统允许的进程数,远小于varnish允许数,但是我们不能修改系统的,只能来修改varnish的
64
[root@server1 ~]# vim /etc/security/limits.conf # 为了和varnish匹配,修改系统对varnish的默认参数和varnish本身保持一致
varnish - nofile 131072
varnish - memlock 82000
varnish - nproc unlimited
[root@server1 ~]# /etc/init.d/varnish start # 开启varnish服务
[root@server1 ~]# netstat -antlp | grep varnish # 查看varnish的端口
[root@server1 ~]# ps aux | grep varnish # 开启varnish服务之后,会自动开启两个进程
[root@server1 ~]# vim /etc/varnish/default.vcl # 配置后端服务器
backend default {
.host = "172.25.78.2";
.port = "80";
[root@server1 ~]# vim /etc/sysconfig/varnish # 修改varnish的端口,方便连接后端服务器
VARNISH_LISTEN_PORT=80
配置后端服务器server2
[root@server2 ~]# yum install -y httpd
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# vim index.html
www.westos.org ---server2
[oot@server2 html]# /etc/init.d/httpd start
测试当访问调度器的时候,会自动跳转到后端服务器上
[root@foundation78 ~]# curl 172.25.78.1 # 当访问172.25.78.1时,自动调转到172.25.78.2这台服务器上
www.westos.org ---server2
查看缓存命中情况
server1上
[root@server1 ~]# vim /etc/varnish/default.vcl
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
[root@server1 ~]# varnishadm ban.url .*$ # 清除所有的缓存
[root@server1 ~]# varnishadm ban.url /index.html # 清除index.html的缓存
[root@server1 ~]# /etc/init.d/varnish reload # 重新加载服务
测试,查看缓存命中情况
[root@foundation78 ~]# curl -I 172.25.78.1
[root@foundation78 ~]# curl -I 172.25.78.1
2.把不同的服务定义到不同的后端服务器上(web1,web2)
当访问www.westos.org 就会从web1(172.25.78.2)中取数据缓存到cdn中
当访问bbs.westos.org 就会从web2(172.25.78.3)中取数据缓存到cdn中
在server1上
[root@server1 ~]# vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.78.2";
.port = "80";
}
backend web2 {
.host = "172.25.78.3";
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") { # 当访问信息以www.开头时,跳转到web1服务器上
set req.http.host = "www.westos.org";
set req.backend = web1;
return (pass); #为了测试方便,不进行缓存
} elsif (req.http.host ~ "^bbs.westos.org") { # 当访问信息以bbs开头时,跳转到web2服务器上
set req.backend = web2;
} else {
error 404 "westos cache"; # 其他报错 }
}
}
在web2服务器上配置
[root@server3 ~]# yum install -y httpd
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# vim index.html
bbs.westos.org --- server3
[root@server3 html]# /etc/init.d/httpd start
测试
(1)先写解析(可以通过访问域名来访问服务)
[root@foundation78 ~]# vim /etc/hosts
172.25.78.1 server1 www.westos.org bbs.westos.org
(2)开始测试
[root@foundation78 ~]# curl www.westos.org
www.westos.org ---server2
[root@foundation78 ~]# curl bbs.westos.org
bbs.westos.org --- server3
3. 负载均衡
把一个文件发布到两个服务器上面,从而缓解后台服务器的压力,提高数据的稳定性,这
种情况多用于当访问量过大时负载均衡到两个服务器上,即使有一个服务器坏掉了,还有一个服
务器来顶替他的工作。varnish还是可以从终端的服务器中取出客户端访问的数据缓存起来。
在server1上
[root@server1 ~]# vim /etc/varnish/default.vcl # 把多个后端聚合为一个组,并检测后端健康状况
director lb round-robin {
{.backend = web1;}
{.backend = web2;}
}# 当访问 www.westos.org 域名时从 web1 上取数据,访问 bbs.westos.org 域名时到 web2 取数据,访问其他页面报错。
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
return (pass); #为了测试方便,不进行缓存,pass生效表示不在cdn中取缓存据,直接在后台取数据,
这样的话,了在测试中更好的看到实验效果,实际中不需要添加.实验中
当清空了缓存数据,有一端的后台服务器挂掉之后,另一个服务器会顶
替他,如果挂掉的服务器数据还在有效期,还是可以在cdn中方问到
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
[root@server1 ~]# /etc/init.d/varnish reload
1
测试(实现了负载均衡)
[root@foundation78 ~]# curl www.westos.org
www.westos.org ---server2
[root@foundation78 ~]# curl www.westos.org
bbs.westos.org --- server3
[root@foundation78 ~]# curl www.westos.org
www.westos.org ---server2
[root@foundation78 ~]# curl www.westos.org
bbs.westos.org --- server3
当我们在cdn上把从服务器上缓存清空时,如果有一个服务器坏掉了我们依然能够访问到但此时只有从开启的服务器中缓存数据
4.一台主机上定义多个域名服务(虚拟主机的搭建)
在server3上
[root@server3 ~]# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80 # 打开虚拟主机的端口
<VirtualHost *:80>
DocumentRoot /www S
erverName www.westos.org
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /bbs
ServerName bbs.westos.org
</VirtualHost>
[root@server3 ~]# mkdir /www
[root@server3 ~]# mkdir /bbs
[root@server3 ~]# vim /www/index.html # 写测试页面
www.westos.org -- server3
[root@server3 ~]# vim /bbs/index.html # 写测试页面
bbs.westos.org -- server3
[root@server3 ~]# /etc/init.d/httpd restart
测试
(1)写解析
[root@foundation78 ~]# vim /etc/hosts
172.25.78.3 server3 bbs.westos.org www.westos.org
(2)测试
[root@foundation78 ~]# curl www.westos.org
www.westos.org -- server3
[root@foundation78 ~]# curl bbs.westos.org
bbs.westos.org -- server3
5.varnish cdn 推送平台(web界面清除缓存)
bansys.zip来源
在 server1 上
[root@server1 ~]# yum install -y unzip httpd php # 如果下不了,就重启一下真机的httpd
[root@server1 ~]# ls
bansys.zip
[root@server1 ~]# unzip bansys.zip -d /var/www/html # 解压到/var/www/html 下
[root@server1 ~]# cd /var/www/html
[root@server1 html]# ls
bansys
[root@server1 html]# cd bansys/
[root@server1 bansys]# ls
class_socket.php config.php index.php purge_action.php static
[root@server1 bansys]# vim config.php
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('172.25.78.1'),
'port'=>'8080',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
[root@server1 bansys]# vim /etc/varnish/default.vcl
# 设置访问控制列表,在列表中的主机才能进行推送操作
acl westos {
"127.0.0.1";
"172.25.78.0"/24
}
sub vcl_recv {
if (req.request == "BAN") { #BAN为设置缓存
if (!client.ip ~ westos) { #westos为访问控制列表
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}
backend web1 {
.host = "172.25.78.2";
.port = "80";
}
backend web2 {
.host = "172.25.78.3";
.port = "80";
}
director lb round-robin {
{.backend = web1;}
{.backend = web2;}
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
#return (pass); # 注释掉此行的目的是为了进行缓存
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = web1;
#return (pass); #为了测试方便,不进行缓存
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
} 


[root@server1 bansys]# /etc/init.d/varnish reload
[root@server1 bansys]# vim /etc/httpd/conf/httpd.conf # 修改httpd端口,因为80端口被varnish占用了,所以把httpd的端口改为8080
Listen 8080
[root@server1 bansys]# mv * .. # 把bansys所有的配置文件移动到html里
[root@server1 bansys]# /etc/init.d/httpd restart
测试
(1)修改解析
[root@foundation78 ~]# vim /etc/hosts
172.25.78.1 server1 bbs.westos.org www.westos.org
(2)测试 

返回到shell测试(查看命中情况)
[root@foundation78 ~]# curl -I www.westos.org # 推送成功之后,再次查看,没有缓存命中,说明成功

varnish搭建cdn网络-------3.0.5版本的更多相关文章
- MongoDBV3.0.7版本(shard+replica)集群的搭建及验证
集群的模块介绍: 从MongoDB官方给的集群架构了解,整个集群主要有4个模块:Config Server.mongs. shard.replica set: Config Server:用来存放集群 ...
- 第九章 搭建Hadoop 2.2.0版本HDFS的HA配置
Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作.在hadoop1时代,只有一个NameNode.如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了.这是 ...
- Ubuntu下搭建Hyperledger Fabric v1.0环境
多次尝试才正常启动了Fabric,如遇到各种莫名错误,请参考如下一步步严格安装,特别用户权限需要注意. 一.安装Ubuntu16 虚拟机或双系统,虚拟机有VirtualBox或者VMware,Ub ...
- 搭建Data Mining环境(Spark版本)
前言:工欲善其事,必先利其器.倘若不懂得构建一套大数据挖掘环境,何来谈Data Mining!何来领悟“Data Mining Engineer”中的工程二字!也仅仅是在做数据分析相关的事罢了!此文来 ...
- Hyperledger Fabric手动生成CA证书搭建Fabric网络
之前介绍了使用官方脚本自动化启动一个Fabric网络,并且所有的证书都是通过官方的命令行工具cryptogen直接生成网络中的所有节点的证书.在开发环境可以这么简单进行,但是生成环境下还是需要我们自定 ...
- 用Nginx搭建CDN服务器方法-开启Nginx缓存与镜像,自建图片服务器
利用Nginx的proxy_cache搭建缓存服务器一:编译ngx_cache_purge1.Nginx的Proxy_cache是根据Key值md5哈希存储缓存,支持任意的Key,例如你可以根据”域名 ...
- 【Hadoop离线基础总结】zookeeper的介绍以及集群环境搭建、网络编程和RPC的简单了解
ZooKeeper的介绍以及集群环境搭建.网络编程和RPC的简单了解 ZooKeeper介绍 概述 ZooKeeper是一个分布式协调服务的开源框架,主要用来解决分布式集群中应用系统的一致性问题.例如 ...
- QuantumTunnel:v1.0.0 正式版本发布
经过一段时间运行,代码已经稳定是时候发布正式版本了! v1.0.0 正式版本发布 对核心能力的简要说明: 支持协议路由和端口路由:QuantumTunnel:端口路由 vs 协议路由 基于Netty实 ...
- CDN网络科普小文(小说版)
引言 作为公司 cdn 小组的一名小码仔,我为写一篇 cdn 的科普文章准备了好一段时间(大概有一个多月没有更新我的社交账号了). 在我刚进入公司,培训完,进入小组,了解到我们做的是 cdn 相关的工 ...
随机推荐
- 【BZOJ4487】[JSOI2015]染色问题(容斥)
[BZOJ4487][JSOI2015]染色问题(容斥) 题面 BZOJ 题解 看起来是一个比较显然的题目? 首先枚举一下至少有多少种颜色没有被用到过,然后考虑用至多\(k\)种颜色染色的方案数. 那 ...
- golang--生成某区间的随机数
import ( "crypto/rand" "fmt" "math" "math/big" ) func main() ...
- 【01】Jenkins:安装配置
写在前面的话 从我的工作经历来看,刚出来的时候的第一家公司我们上线采用的是脚本上线.就是那种开发合并完代码以后,在一个固定的时间点,我们上服务器执行更新脚本打包更新.这种方法有一个很大的问题,就是对于 ...
- 基于NPOI对Excel进行简单的操作
1. 关于NPOI NPOI是一个开源的用于在C#程序中读写Excel.WORD等微软OLE2组件文档的项目,使用NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. 2 ...
- Box2d刚体轨迹预测
前言 在游戏开发中经常会接触到各种物理引擎,虽然开源的引擎各种各样,但是基本原理是相通的.实质上物理引擎只是以时间为单位的刷新物理世界中的刚体的位置(其中运用了大量物理公式和知识),然后刷新刚体关联的 ...
- 安装centos6.10时,安装完成重启报错error 15,file not found
今天在一台老式联想服务器上安装centos6.10操作系统,安装完成,重启时,出现报错 error 15, file not found...... 在百度上搜索到进grub编辑,可还是无法解决问题, ...
- Linux操作系统的日志管理之rsyslog实战案例
Linux操作系统的日志管理之rsyslog实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志介绍 1>.什么是日志 历史事件: 时间,地点,人物,事件 日志级 ...
- 目标检测论文解读11——Mask R-CNN
目的 让Faster R-CNN能做实例分割的任务. 方法 模型的结构图如下. 与Faster R-CNN相比,主要有两点变化. (1) 用RoI Align替代RoI Pool. 首先回顾一下RoI ...
- 201871010135 张玉晶 《2019面向对象程序设计(java)课程学习进度条》
<2019面向对象程序设计(java)课程学习进度条> 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序 阅读或编译让我 第一周 25/ ...
- 201871020225-牟星源《面向对象程序设计(java)》第四周学习总结
201871020225-牟星源<面向对象程序设计(java)>第四周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...