CDN加速的实现 --- varnish
一、什么是CDN
cdn全称为内容分发网络(Content Delivery Network)。基本思想是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,是内容传输地更快、更稳定。通过在互联网各处放置节点服务器来构成在现有的互联网基础上的一层只能虚拟网络,cdn系统能够实时地根据网络流量和个节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。目的是为了是用户就近取所需内容,解决了网络拥挤问题,提高用户的响应速度。
varnish是一款具有高性能的开源HTTP加速器,具有方向代理、缓存的功能。
二、部署单个后端服务器的varnish过程
1、在官网下载软件包:varnish-libs-3.0.5-1.el6.x86_64.rpm和 varnish-3.0.5-1.el6.x86_64.rpm
2、安装varnish:(安装完成后,可以在/etc/passwd中查看已经生成的varnish用户;所以对varnish的访问控制也相当于通过对varnish用户控制来实现)
---> yum install varnish-3.0.5-1.el6.x86_64.rpm -y
3、编辑varnish文件
---> /etc/sysconfig/varnish # 只修改文件的接听端口为80即可
第66行修改:VARNISH_LISTEN_PORT=80
第8行查看:NFILES=131072 # 表示能打开的最大文件数(varnish用户可自动调整)
第12行查看:MEMLOCK=82000 # 表示最多可使用的内容空间(varnish用户可自动调整)
第15行查看:NPROCS=‘unlimited’ # 表示单个用户可运行的最大线程数
4、编辑varnish用户的限制文件
---> vim /etc/security/limits.conf # 只需要在末尾添加如下信息即可
varnish - memlock 82000
varnish - nproc unlimited
# 注意:此时的最后一列信息与3文件中的内容想对应
5、打开virnish服务器
---> /etc/init.d/varnish start
6、在默认文件中添加访问后端服务器的ip、端口、是否命中执行的相关代码(varnish主机为172.25.2.1)
---> /etc/varnish/default.vcl
.host = "172.25.2.2"
.port = "80"
}
sub val_deliver {
if (obj.hits > 0){
set resp.http.X-Cache = "HIT from westos cache";
# 在vainish中命中HTT访问的域名
}
else{
set resp.http.X-Cache = "MISS from westos cache";
# 在后端服务器中得到访问的域名
}
return (deliver)
}
7、默认配置文件修改之后,要进行文件的加载
---> vim /etc/init.d/varnish reload
8、在后端服务器中安装并开启httpd服务,关闭火墙
---> yum install httpd -y
---> /etc/init.d/httpd start
---> iptables -L # 查看火墙是关闭状态
9、在后端服务器添加一个默认发布目录
---> vim /var/www/html/index.html
<h1>server2 --- www.xniu.com<h1>
---> /etc/init.d/httpd restart
10、此时可以在物理主机中进行测试
---> curl -I 172.25.2.1 # 第一次,显示从后端服务器获取。第二次显示从varnish缓存中获取
注释:### 通过 varnishadm 手动清除缓存,清除之后的结果再测试。此时显示结果时从后端获取。###
varnishadm ban.url /index.html #清除 index.html 页面缓存
varnishadm ban.url /admin/$ #清除 admin 目录缓存
三、具有多台后端服务器的varnish
1、打开vm3主机;并设置ip为172.25.2.3,主机名为server3
---> vim /etc/sysconfig/network # 修改主机名
hostname=server3
---> vim /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=172.25.2.3
2、在server3中安装httpd服务、并编辑默认发布目录
---> vim /var/www/html/index.html
<h1>server3 --- www.linux.com </h1>
---> /etc/init.d/httpd restart
3、在物理主机中添加解析
---> vim /etc/hosts
172.25.2.1 www.linux.com www.xniu.com xniu.com
4、配置varnish的默认文件
---> vim /etc/varnish/default.vcl
backend web1 { # 后端的第一个服务器web1
.port = "80";
}
backend web2 { # 后端的第二个服务器web2
.host = "172.25.2.3"; # 当www.linux.com访问跳转server3
.port = "80";
}
#当访问 www.xniu.com或xniu.com 域名时从 web1 上取数据,访问 www.linux.com 域名时到 web2 取数据。访问其他页面报错。
sub vcl_recv {
if (req.http.host ~ "^(www.)?xniu.com") {
set req.http.host = "www.xniu.com";
set req.backend = web1;
} elsif (req.http.host ~ "^www.linux.com") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
---> /etc/init.d/varnish reload
5、在物理主机中测试(此时,两个结果是不一样的)
---> curl www.linux.com
---> curl www.xniu.com
---> curl xniu.com
注释:使用curl -I xniu.com 与curl -I www.xniu.com查看的缓存信息是一样的。
四、varnish后端服务器的负载均衡
1、负载均衡(Load Balace,简称LB):是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个 服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。负载均衡的算法种类很多,常见的包含:轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等,应根据实际情况选取。在varnish中我们常用的是轮询法,平衡对待每一个服务器。
2、在server3中httpd默认发布目录进行如下操作
---> vim /etc/httpd/conf/httpd.conf # 将990行的注释打开
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName www.linux.com
</VirtualHost>
DocumentRoot /www1
ServerName www.xniu.com
</VirtualHost>
3、在server3中创建/www1目录,并添加index.html;填写内容为 www.xniu.com
4、在varnish主机的默认文件中进行如下添加:
{ .backend = web1;}
{ .backend = web2;}
#把多个后端聚合为一个组,并检测后端健康状况
}
if (req.http.host ~ "^(www.)?xniu.com") {
set req.http.host = "www.xniu.com";
set req.backend = lb;
return (pass); # 表示不经过缓存,直接取服务器取拿东西
} elsif (req.http.host ~ "^www.linux.com") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
---> /etc/init.d/varnish reload
5、在物理主机中测试:
---> cutl -I www.xniu.com
分析:会出现轮询现象。若第一次出现server2 --- www.xniu.com(server2),则在120s内均为该结果(由于varnish对数据进行了缓存);经过120s后,显示结果变为www.xniu.con(server3);出现这样的结果,是由于轮询算法,server2和server3平均被访问。如果默认写上pass之后,则每次测试www.xniu.com界面,会出现上述两个结果交替出现的现象。若server2或者server3中有一个httpd服务损坏后,客户端依然可以访问号的哪个服务器。
健康检查:
通过健康检查来确定服务器和应用的健康状况是负载均衡器的一个非常重要的功能,没有负载负载均衡器,客户端可能会将请求发送到已经停机的服务器上。网络管理员必须手动干预替换掉这台服务器或者排除这台服务器的故障。有时服务器可能没有停机,由于某种原因,比如说软件的漏洞问题,导致服务器上运行的应用系统不能正常运行;此时,负载均衡器能够检测这些情况并立即将客户端的请求定向到正常的服务器而不需要管理员的手动干预。
CDN加速的实现 --- varnish的更多相关文章
- 高并发大流量专题---5、CDN加速
高并发大流量专题---5.CDN加速 一.总结 一句话总结: CDN就是多整几台节点服务器,选距离用户最近的服务器来给用户服务,实现的话可以用阿里云.腾讯云他们提供的功能,简单方便,妈妈再也不用担心我 ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- 阿里云系列——6.给你的域名使用CDN加速(详细步骤+简单配置)
网站部署之~阿里云系列汇总 http://www.cnblogs.com/dunitian/p/4958462.html 进入管理页面:https://home.console.aliyun.com/ ...
- Signalr系列之虚拟目录详解与应用中的CDN加速实战
目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 前段时间一直有人问我 在用SignalR 2.0开发客服系统[系列1:实现群发通讯]这篇文章中的"/Si ...
- 利用免费cdn加速webpack单页应用
回顾现状 在之前的学习过程中,react单页应用经过webpack打包之后会输出大概如下的目录结构,它就是站点的所有前端组成了: 1 2 3 4 5 6 MacBook-Pro:output ba ...
- c#获取ip的方法cdn加速获取真实ip方法
服务端://方法一HttpContext.Current.Request.UserHostAddress; //方法二HttpContext.Current.Request.ServerVariabl ...
- 怎么看网站是否开启CDN加速?测试网站全国访问速度方法详解
注意域名,动静分离的网站,只对静态文件的域名做了cdn 怎么看网站有没开启CDN? 要看一个网站是否开启CDN,方法很简单,只要在不同的地区ping网址就可以,比如在山东济南ping www.jb51 ...
- 2014年十个优秀的免费CDN加速服务-国内和国外免费CDN
这是一篇总结近几年来网络上出现了各类免费CDN服务的文章,文章本来应该早就发出来的,但是因为近期的各种原因一直拖到现在.之前部落已经总结了近几年来的优秀免费空间,新手朋友不必在茫茫“网”海中寻找免费空 ...
- jquery cdn加速点
新浪jquery cdn加速点: <script src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.js">< ...
随机推荐
- 多线程中sleep和wait的区别,以及多线程的实现方式及原因,定时器--Timer
1. Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即 ...
- Swoole学习(一)了解一下Swoole的强大并在Centos安装Swoole及PHP扩展开启
Swoole是面向生产环境的 PHP 异步网络通信引擎,官网:https://www.swoole.com/ 使 PHP 开发人员可以编写高性能的异步并发 TCP.UDP.Unix Socket.HT ...
- mspdb100.dll不见了的解决办法
一.如果在运行某软件或编译程序时提示缺少.找不到mspdb100.dll等类似提示,将下载来的mspdb100.dll拷贝到指定目录即可 (一般是system系统目录或放到软件同级目录里面),或者重新 ...
- 如何用纯 CSS 创作气泡填色的按钮特效
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/eKqZjy 可交互视频 ...
- 非root权限 安装更新gcc
本文主要参考网络上文章,并根据自己安装出现的问题进行补充. 参考文章: 1.gcc和boost的升级步骤(非root权限):https://blog.csdn.net/u010246947/artic ...
- python计算纪念日相关
注意需要python3 1.距离某一特定日期多少天后,如 100天 from datetime import datetime,timedelta pre=datetime(2016,12,12,22 ...
- 20145322 《Java程序设计》第6周学习总结
20145322 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 10.1.1 串流设计的概念 Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象. ...
- Tomcat热部署,Web工程中线程没有终止
近期项目中,用 jenkins 热部署 web工程时,发现工程中静态持有的线程(将ScheduledExecutorService定时任务存储在静态Map中),导致不定时出现数据库访问事务关闭异常,如 ...
- Ubuntu 16.04下EasyOpenJTAG+OpenOCD的安装和使用【转】
本文转载自:http://www.linuxdiyf.com/linux/24086.html Ubuntu 16.04下EasyOpenJTAG+OpenOCD的安装和使用 发布时间:2016-09 ...
- jar包中使用log4j2不起作用
某程序中有使用到log4j2,将该程序打包成jar,使用以下命令执行时,发现log4j不输出 java -cp Tool.jar com.zhen.nameOnce.Log4jTest 且报以下错误 ...