热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Varnish搭建CDN内容分发网络

概述:1.CDN内容分发网络CDN的全称是ContentDeliveryNetwork,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据
概述:

1.CDN内容分发网络

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

2.简述varnish

在当前主流的Web架构中,Cache担任着越来越重要的作用。常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键。而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server。严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器。同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一。

在这里插入图片描述
处理过程

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

特点:

Lookup:用于处理一般的数据;vcl_hash(ip哈希): 将ip与后端服务器绑定,即:同一台主机始终访问的是同一个后端服务器
Pass: 用于处理动态数据;vcl_backend(fetch): 后端查询 ,它不适合缓存
Pipe: 用于处理大文件

安装包:

varnish-3.0.5-1.el6.x86_64.rpm
varnish-libs-3.0.5-1.el6.x86_64.rpm

环境:

server1 172.25.66.1 varnish服务器
server2 172.25.66.2 后端服务器1(apache)
server3 172.25.66.3 后端服务器2(apache)

1.varnish的安装与基础配置

(1).配置varnish服务端

#1.下载varnish安装包
[root@server1 mnt]# ls
varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
#2.安装varnish软件
[root@server1 mnt]# yum install -y varnish-*
#3.查看配置文件
[root@server1 mnt]# rpm -qc varnish
/etc/logrotate.d/varnish
/etc/sysconfig/varnish
/etc/varnish/default.vcl

在这里插入图片描述

#4.配置varnish服务端口
[root@server1 mnt]# vim /etc/sysconfig/varnish
###################
66 VARNISH_LISTEN_PORT=80 #默认后端服务器为80(在浏览网址时默认访问的就是80端口,此时便无需在后边加80,形如: www.baidu.com:80)

在这里插入图片描述

#5.查看配置文件参数
[root@server1 mnt]# vim /etc/sysconfig/varnish

在这里插入图片描述

#查看系统能打开的最大文件
[root@server1 mnt]# sysctl -a | grep file
fs.file-nr = 448 0 47361
fs.file-max = 47361`

在这里插入图片描述
问题1

1.varnish服务能打开的最大文件数目远远超过系统能打开的最大文件
2.最大锁定内存空间:82000
3.最大进程数:无限制

解决问题1

1).更改varnish配置文件参数显然不合理,不提倡使用)
2).增加内存

#查看系统剩余内存
[root@server1 mnt]# free -mtotal used free shared buffers cached
Mem: 490 190 299 0 11 125
-/+ buffers/cache: 54 436
Swap: 991 0 991

在这里插入图片描述
增加内存:
在这里插入图片描述

#再次查看系统能打开的最大文件
[root@server1 ~]# sysctl -a | grep file
fs.file-nr = 384 0 188466
fs.file-max = 188466

在这里插入图片描述
解决问题2和问题3:

[root@server1 ~]# vim /etc/security/limits.conf
#################
varnish - nofile 131072 #最大文件主数
varnish - memlock 82000 #最大锁定内存空间
varnish - nproc unlimited #最大进程数

在这里插入图片描述

#6.开启varnish
[root@server1 ~]# /etc/init.d/varnish start
Starting Varnish Cache: [ OK ]

#此时查看到系统自动生成了varnish用户
[root@server1 ~]# cat /etc/passwd

在这里插入图片描述

#过滤出与varnish有关的进程
[root@server1 ~]# ps aux | grep varnish

在这里插入图片描述

root用户: master(主进程) 用来监控,读取配置, fork创建子进程
varnish用户: 子进程

#查看root用户的线程数(只有一个)
[root@server1 ~]# cat /proc/1050/status

在这里插入图片描述

#查看varnish用户的线程数(有很多个)
[root@server1 ~]# cat /proc/1051/status

在这里插入图片描述

#7.更改主配置文件:制作调度器
[root@server1 ~]# vim /etc/varnish/default.vcl
#################7 backend default {8 .host = "172.25.66.2"; ##server2的ip9 .port = "80";10 }

在这里插入图片描述

#8.重启varnish服务
[root@server1 ~]# /etc/init.d/varnish restart
Stopping Varnish Cache: [ OK ]
Starting Varnish Cache: [ OK ]

(2).配置后端服务器

#1.安装apahce
[root@server2 ~]# yum install -y httpd
#2.开启apache
[root@server2 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.2 for ServerName[ OK ]
#3.编写默认发布文件
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# ls
[root@server2 html]# vim index.html
####################

www.westos.org ---- server2


测试:
(1)物理机上:

[root@foundation66 ~]# curl 172.25.66.1

www.westos.org ---- server2


(2)在网页上:

输入: 172.25.66.1

在这里插入图片描述

2.查看缓存命中情况

配置varnish服务端:

#1.更改主配置文件
[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);
}

在这里插入图片描述

#2.重新加载配置
[root@server1 ~]# /etc/init.d/varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2019-01-24T14:02:25
VCL compiled.available 2 boot
active 0 reload_2019-01-24T14:02:25Done

测试:

[root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述

[root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述

[root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述
清理缓存:

#1.清理所有缓存
[root@server1 ~]# varnishadm ban.url .*$

#测试:
[root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述

#2.清理某个网页的缓存(注意:访问方式改变了)#第一次访问未命中缓存,之后再访问都能命中缓存
[root@foundation66 ~]# curl -I 172.25.66.1/index.html

在这里插入图片描述

[root@foundation66 ~]# curl -I 172.25.66.1/index.html

在这里插入图片描述

#清理网页index.html缓存
[root@server1 ~]# varnishadm ban.url /index.html

#测试:
[root@foundation66 ~]# curl -I 172.25.66.1/index.html

在这里插入图片描述

3.配置多个后端服务器

#1.编写主配置文件:配置调度器
[root@server1 ~]# vim /etc/varnish/default.vcl
#################
backend web1 {.host = "172.25.66.2"; # 后端服务器1(server2).port = "80";
}backend web2 {.host = "172.25.66.3"; # 后端服务器2(server3).port = "80";
}sub vcl_recv {if (req.http.host ~ "^(www.)?westos.org") {set req.http.host = "www.westos.org"; set req.backend = web1;
} elsif (req.http.host ~ "^bbs.westos.org") {set req.backend = web2;
} else {error 404 "westos cache";}
}

在这里插入图片描述
注意:要注释掉命中缓存情况的设定
在这里插入图片描述

#2.重新加载配置
[root@server1 ~]# /etc/init.d/varnish reload

2.配置后端服务器

[root@server3 ~]# yum install -y httpd
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# ls
# 编写apache默认发布文件
[root@server3 html]# vim index.html
####################

bbs.westos.org ---- server3

在这里插入图片描述

[root@server3 html]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.3 for ServerName[ OK ]

3.本地解析

#本地解析:便于直接访问域名,无需访问ip
[root@foundation66 ~]# vim /etc/hosts
######################
172.25.66.1 server1 www.westos.org bbs.westos.org

测试:

访问www.westos.org时,调度server2结点,当访问bbs.westos.org时,调度server3结点

[root@foundation66 ~]# curl www.westos.org

www.westos.org ---- server2


[root@foundation66 ~]# curl bbs.westos.org

bbs.westos.org ---- server3


4.负载均衡

1.配置varnish服务端

#1.编写主配置文件
[root@server1 ~]# vim /etc/varnish/default.vcl
#################
#配置负载均衡lb
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;
} elsif (req.http.host ~ "^bbs.westos.org") {set req.backend = web2;
} else {error 404 "westos cache";}
}

在这里插入图片描述

#2.重新加载
[root@server1 ~]# /etc/init.d/varnish reload

测试:发现此时并没有实现负载均衡,因为有缓存

#此时没有实现负载均衡,因为有缓存
[root@foundation66 ~]# curl www.westos.org

www.westos.org ---- server2


[root@foundation66 ~]# curl www.westos.org

www.westos.org ---- server2


解决方案:清理缓存

#1).手动清理缓存
[root@server1 ~]# varnishadm ban.url .*$
[root@foundation66 ~]# curl www.westos.org

bbs.westos.org ---- server3


[root@server1 ~]# varnishadm ban.url .*$
[root@foundation66 ~]# curl www.westos.org

www.westos.org ---- server2


不能每一次访问都要手动清理缓存,相对于麻烦,因此作出改进

改进:跳过缓存

#2).更改配置文件
[root@server1 ~]# vim /etc/varnish/default.vcl
#################27 return (pass); #不进行缓存(跳过缓存)

在这里插入图片描述

#重新加载
[root@server1 ~]# /etc/init.d/varnish reload

测试:

#此时便不会有缓存干扰,实现了负载均衡
[root@foundation66 ~]# curl www.westos.org

www.westos.org ---- server2


[root@foundation66 ~]# curl www.westos.org

bbs.westos.org ---- server3


5.同一台主机上定义多个域名

1.配置后端服务器(本实验在后端1和后端2做均可)

#1.更改配置文件
[root@server3 html]# vim /etc/httpd/conf/httpd.conf
####################
990 NameVirtualHost *:80 #打开虚拟主机端口 #定义虚拟主机1DocumentRoot /www #定义根目录ServerName www.westos.org
#定义虚拟主机2DocumentRoot /bbs #定义根目录ServerName bbs.westos.org

在这里插入图片描述

#2.重启apache
[root@server3 html]# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: Warning: DocumentRoot [/www] does not exist
Warning: DocumentRoot [/bbs] does not exist
httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.3 for ServerName[ OK ]
#3.建立根目录
[root@server3 html]# mkdir /www
[root@server3 html]# mkdir /bbs
[root@server3 html]# cd /www/
[root@server3 www]# ls
#4.编写发布文件1
[root@server3 www]# vim index.html
###################

www.westos.org ---- server3

在这里插入图片描述

[root@server3 www]# cd /bbs/
[root@server3 bbs]# ls
#5.编写发布文件2
[root@server3 bbs]# vim index.html
###################

bbs.westos.org ---- server3

在这里插入图片描述

#6.重启apache
[root@server3 bbs]# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.3 for ServerName[ OK ]

2.本地解析

[root@foundation66 ~]# vim /etc/hosts
######################
172.25.66.1 server1
172.25.66.3 server3 bbs.westos.org www.westos.org

在这里插入图片描述
测试:
当访问不同的域名时,访问的是同一个主机,即实现了同一台主机上定义多个域名

[root@foundation66 ~]# curl www.westos.org

www.westos.org ---- server3


[root@foundation66 ~]# curl bbs.westos.org

bbs.westos.org ---- server3



6.web界面的制作

web界面:也是实现清理缓存的一种方式,但与之前最大的不同在于:它可以批量,高效的清理缓存
安装包:

bansys.zip

配置varnish服务端:

#1.下载安装包
[root@server1 ~]# cd /mnt
[root@server1 mnt]# ls
bansys.zip varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
#报错:因为没有unzip命令
[root@server1 mnt]# unzip bansys.zip -d /var/www/
-bash: unzip: command not found
#2.安装unzip apache php等(用到了php语言)
[root@server1 mnt]# yum install -y unzip httpd php
#3.解压,-d表示解压路径
[root@server1 mnt]# unzip bansys.zip -d /var/www/html
[root@server1 ~]# cd /var/www/html/
[root@server1 html]# ls
bansys class_socket.php config.php index.php purge_action.php static
[root@server1 html]# cd bansys/
[root@server1 bansys]# pwd
/var/www/html/bansys
[root@server1 bansys]# ls
class_socket.php config.php index.php purge_action.php static

#4.定义varnish主机列表和群组
[root@server1 bansys]# vim config.php
######################
$var_group1 = array('host' => array('172.25.66.1'), #本机ip'port' => '8080', #不能写80端口,因为varnish服务已经占用了80端口);
$VAR_CLUSTER = array('www.westos.org' => $var_group1, # );

在这里插入图片描述

#5.更改apache的端口;因为varnish已经占用了80端口
[root@server1 bansys]# vim /etc/httpd/conf/httpd.conf
#####################136 Listen 8080

#6.重启apache
[root@server1 bansys]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.1 for ServerName[ OK ]

#7.两者皆可查看端口,查看到apache的端口是否更改为8080
[root@server1 bansys]# netstat -tnlp

在这里插入图片描述

[root@server1 bansys]# netstat -antlup

在这里插入图片描述
网页测试:

输入:172.25.66.1:8080

在这里插入图片描述
此时访问的是默认发布目录,因为bansys里的内容没有共享

[root@server1 bansys]# pwd
/var/www/html/bansys
#8.将bansys里的所有内容移动到/var/www/html/(apahce默认发布目录)中,以达到共享的目的
[root@server1 bansys]# mv * ../
[root@server1 bansys]# cd ..
[root@server1 html]# ls
bansys class_socket.php config.php index.php purge_action.php static

再次测试:此时便可以查看到推送界面

输入:172.25.66.1:8080

在这里插入图片描述

#9.配置varnish访问控制
[root@server1 bansys]# vim /etc/httpd/conf/httpd.conf
###################### 定义允许推送的主机ip
acl westos {
"127.0.0.1"; #本机可以访问
"172.25.66.0"/24; #66网段均可访问
}# 若不在允许ip列表中则报错
sub vcl_recv {if (req.request == "BAN"){if (!client.ip ~ westos) {error 405 "Not allowed.";}ban("req.url ~ " + req.url);error 200 "ban added";}
}

在这里插入图片描述
测试:
第一次未命中缓存,之后都可以命中缓存

[root@foundation66 Desktop]# curl -I www.westos.org

在这里插入图片描述

[root@foundation66 Desktop]# curl -I www.westos.org

在这里插入图片描述
网页推送:相当于批量清除缓存
在这里插入图片描述
发现推送成功后,测试未命中,即完成了缓存的清理

[root@foundation66 Desktop]# curl -I www.westos.org

在这里插入图片描述


推荐阅读
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
author-avatar
mobiledu2502927267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有