高级(二)CDN之(一)

一、CDN的概念

CDN解析:全称Content Delivery Network,即内容分发网络!

客户需求:对网站的浏览速度和效果,用户体验好!

CDN功能:一款高性能且开源的反向代理服务器和HTTP加速器,可以有效降低web服务器的负载,提升访问速度。

理解角度:从CDN的中文表义去理解:内容、分发、网络!

(1)内容

        指储存在CDN节点上的动静态资源的分发和访问的数据内容,比如JS、CSS、图片和静态页面等静态资源!

        客户端:用户一般主站获取动态内容后,再从CDN下载相应的静态数据

(2)分发

       就是如何让上面提到的数据内容(资源),快速的部署在这个网络中,从而快速为用户服务。

      目的:通过调度让用户访问最近的资源

(3)网络

           1)是部署于者全球(国)的一大堆服务器--->集群

           2)这些服务器基于当前互联网基础架构在其上层再构成一个网络,这个网络专为资源分发而生

二、CDN系统的理解

        CDN是一个经策略性部署的整体系统,从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均而产生的用户访问网站响应速度的根本原因。因此CDN主要作用是通过内容和资源就近分发,保证用户快速访问,提升用户体验的一个内容网络。

        CDN作为网站加速的工具,是一种组合技术,它的重要组成部分包括源站、缓存服务器、智能DNS、客户端等。

        CDN网络的构成如下:

1)折叠源站

源站:指发布内容的原始站点。

操作:添加、删除、更改网站的文件,都是在源站上进行的;

明确:缓存服务器所抓取的对象也全部来自于源站

折叠隐藏的含义,客户端并不知道折叠网站的存在,以为访问的资源站点就是源站!

2)缓存服务器

缓存服务器:是直接提供给用户访问的站点资源(直接面对用户),由一台或数台服务器组成;

用户请求资源的过程

         1)当用户发起url请求时,他的访问请求被智能DNS定位到离他较近的缓存服务器

         2)如果用户所请求的内容刚好在缓存里面,则直接把内容返还给用户;

         3)如果访问所需的内容没有被缓存,则缓存服务器向邻近的缓存服务器直接向源站直接抓取内容,然后再返还给用户。

3)智能DNS 

CDN整个技术核心是智能DNS,它主要根据用户的来源,将其访问请求指向离用户比较近的缓存服务器!

举例1:把深圳电信的用户请求指向到深圳电信IDC机房中的缓存服务器。

举例2:通过智能DNS解析,让用户访问同服务商下的服务器,消除国内南北网络互相访问慢的问题,达到加速作用。

4)客户端

客户端或称用户端即发起访问的普通用户,一般的访问方式是浏览器

简单测试:curl的工具和直接在浏览器访问看实验现象!

复杂测试:可以借助Google Chrome/IE/FireFox查看HTTP请求头request header响应头,了解数据的交互过程!

#####################

三、varnish

    由于目前实验的环境下没有CDN的网络环境,所以这里用相应的软件来进行模拟,目前比较流行的就是varnish!

    Varnish是一款高性能的开源HTTP加速器,具有反向代理,缓存的功能!

     varnish的安装

     rpm的安装方式

(1)varnish的安装

#(1)软件的安装
yum install -y varnish-4.0.5-1.el7.x86_64.rpm varnish-libs-4.0.5-1.el7.x86_64.rpm jemalloc-3.6.0-1.el7.x86_64.rpm -y

# (2)varnish核心配置文件
/etc/varnish/default.vcl      #varnish核心配置文件
/etc/varnish/varnish.params   #varnish的参数配置文件

# (3)varnish的服务启动文件

/usr/lib/systemd/system/varnish.service

# 此服务文件可以看服务的一些限制!

varnish各配置文件的说明

安装Varnish 及遇到的坑

说明:Redhat镜像库中的版本太老,有漏洞,所以安装相对新的版本!

细节:varnish的内存大小和缓存的文件数目

           1)由于Linux是多用户和多任务的系统,所以默认对每个用户分配的资源是固定的;

            2)而varnish的运行也是以varnish的用户身份来运行,所以也会收到系统的限制。

需求:如何取消对varnish用户的限制

        1)由于系统内核对用户的的限制是由于硬件的限制,所以首先改变硬件的配置,改变内存

sysctl -a |grep file           #查看系统的内核允许用户的最大文件数目(文件描述符的数目)

改变:虚拟机的内存,由1G改变成2G!

# 测试:重新sysctl -a |grep file看用户可打开的文件数目的变化!

        2)由于值针对varnish用户不希望针对所有的用户,所以在配置文件中对varnish用户进行配置!

# (1)配置文件

/etc/security/limits.conf

# (2)添加的内容

varnish         -       nofile          131072
varnish         -       memlock         82000

说明:上述是永久生效

临时生效(全局)

ullimit -l 82 #内存改变

ullimit -n 131072 #文件描述符

(2)VCL

VCL:varnish configuration language,是varnish配置语言,其用来定义varnish 的存取策略,vcl语法跟C和perl比较相似!

注意:"\"字符在VCL里没有什么特别的含义,这点和其他语言不同

备注:VCL只是配置语言(使用约定的一些东西),并不是真正的编程语言,所以没有循环自定义变量

/etc/varnish/default.vcl

vcl配置文件的详细内容的说明

Varnish的配置语言VCL及其内置变量介绍

(3)varnish状态引擎

     ①VCL有多个状态引擎,状态之间存在相关性,但彼此间互相隔离;

     ②③每个状态引擎可使用return(x)指明关联至哪个下一级引擎;

6

说明:每个引擎都是一个功能模块,要了解正常的处理流程

相关模块的说明

vcl_recv:接收请求;

Lookup状态:进入此状态后,会在hash表中查找数据,若找到,则进入Hit(命中)状态,否则进入miss(未命中)状态;

pipe状态:请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个链接被关闭;

Pass状态:在此状态下,会进入后端请求,即进入Fetch状态;

Fetch状态:在Fetch状态下,对请求进行后端获取,发送请求,获得数据,是否进行本地存储;

Deliver状态:将获取到的数据发送给客户端,然后完成本次请求;

varnish配置详解

说明:必须明白原理,方便学习Nginx!

线程和进程

varnish和squid的区别

请求头和请求体的解析

核心:理解请求头、请求体、和响应头和响应体,varnish构建请求头和请求头,构建响应头和响应体!

Firefox下载插件

ruby语言!

四、实验

说明:讲解相关功能来理解相应的子模块!

(1)反向代理

# (1)默认的后端服务器的端口
backend default {
    .host = "172.25.2.201";
    .port = "80";
}

 

其它测试curl ip测试

说明:此种测试会将默认页面的内容返回,不会做HTML的解析!

via响应头的字段:是http协议里面的一个header,记录了一次http请求所经过的代理和网关

说明:经过1个代理服务器,就添加一个代理服务器的信息,经过2个就添加2个

回顾:正向代理和反向代理的区别

(2)添加响应信息

sub vcl_deliver {
  
    if (obj.hits>0){
        # 变量的设置(已经定义的变量)
        set resp.http.X-Cache = "HIT from www.wzj.com 从缓存中取";
    }
    else{
        set resp.http.X-Cache = "MISS from www.wzj.com 缓存中没有此资源";
    }
        # 注意:一定要return
        return (deliver);
}

注意:每一行语句必须;结尾,并且字符串必须用双引号

测试

Age响应头信息:标识出这个请求的结果被缓存多长时间,单位是秒!

说明

            首次请求的Age为0,说明varnish还没有没有缓存这个响应的结果

            后续的重复请求将会使Age值增大,超过生命周期,缓存从内存中被自动删除

###########

X-Cache是varnish(squid)代理的自定义header,用来记录缓存的命中与否

规范信息的格式:HIT|MISS from 域名

###########

X-Varnish的含义

1  X-Varnish头信息--->后面会有一个或两个数字
   1)如果是一个数字,就表明varnish在缓存中没有发现这个请求,这个数字的含义是varnish为这个请求所做的标记ID。
   2)如果X-Varnish后是两个数字,就表明varnish在缓存中命中了这个请求,第一个数字是请求的标识ID,第二个数字是缓存的标识ID。

注意1:如果用浏览器测试,由于浏览器的本身缓存原因会影响varnish缓存,可能达不到实验现象!

注意2:浏览器中的Age表示的是浏览器缓存的有效时间,不是varnish资源缓存的有效时间!

原理:在varnish服务器响应客户端的过程中,在HTTP包文中添加相应的响应头信息,然后发送给客户端

(3)配置多个后端服务器

backend web1 {
    .host = "172.25.2.201";
    .port = "80";
}
backend web2 {
    .host = "172.25.2.202";
    .port = "80";
}
sub vcl_recv {
    # 说明:接受客户端的url请求,进行相应的处理,然后进行请求转发
    # 说明:从语法的角度-->这里属于perl的正则匹配
    # 体现:varnish在安装的过程中,会安装许多perl的模块!
    # vcl配置语言参考了C和perl!
    if (req.http.host ~"^(server1.)?wzj.com"){
        # (1)修改请求主机的名字-->用户体验好    
        set req.http.host = "server1.wzj.com";
        # (2)交给后台服务器来处理
        set req.backend_hint = web1;
}elsif (req.http.host ~"^(server2.)?wzj.com") {
        set req.backend_hint = web2;
}else {
        # (3)都不匹配,认为请求的资源主机不存在!
        # 405表示请求的方式不对,常见请求的方式有get、post、head、put!
        # 404表示服务器响应了,但是服务器没有此资源,客户端的请求错误!
        # 503表示服务器不存在,或者存在但没有开启服务!
        return (synth(503));
   }
}

DNS解析

注意:上面的server1和server2的IP是相同的(图片有错误),都是varnish服务器的IP,172.25.2.200!

说明:我将两台后端的服务器的名字wzj.com的域!

备注一定要/etc/resolvconf中写DNS服务器的IP!

补充:也可以本地解析文件/etc/hosts中进行自定义!

实验效果

解析:不同的域名访问相同的varish服务器,分别转发给不同的后端服务器,响应不同的内容

注意1:两个后端服务器必须服务都开启,否则会出现503的错误!

注意2:httpd和varnish不能同时开启--->否则会出现此错误--->bind(): Address already in use

(3)负载均衡

import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
# Default backend definition. Set this to point to your content server.
# (1)默认的后端服务器的端口
 #backend default {
 #    .host = "172.25.2.201";
 #    .port = "80";
 #}

backend web1 {
    .host = "172.25.2.201";
    .port = "80";
}
backend web2 {
    .host = "172.25.2.202";
    .port = "80";
}
sub vcl_init {
        # Load Balance-->负载均衡(lb的缩写)
        # 注意:directors要从库中正确导入
        new lb = directors.round_robin();
        # 说明:负载均衡所构成的集群,或者说lb的此套件中的负载均衡的服务器
        lb.add_backend(web1);
        lb.add_backend(web2);
}
sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
    # 说明:接受客户端的url请求,进行相应的处理,然后进行请求转发
    # 说明:从语法的角度-->这里属于perl的正则匹配
    # 体现:varnish在安装的过程中,会安装许多perl的模块!
    # vcl配置语言参考了C和perl!
    if (req.http.host ~"^(varnish.)?wzj.com"){
        # (1)修改请求主机的名字-->用户体验好    
        set req.http.host = "varnish.wzj.com";
        # (2)说明:此时交给构成负载集群的负载均衡的服务器
        set req.backend_hint = lb.backend();
        # 说明:清除缓存,实验效果更明显!
        return (pass);
}elsif (req.http.host ~"^(server2.)?wzj.org") {
        set req.backend_hint = web2;
}else {
        # (3)都不匹配,认为请求的资源主机不存在!
        # 405表示请求的方式不对,常见请求的方式有get、post、head、put!
        # 404表示服务器响应了,但是服务器没有此资源,客户端的请求错误!
        # 503表示服务器不存在,或者存在但没有开启服务!
        return (synth(503));
}

说明:将varnish服务器也写入DNS的数据中:varnish.wzj.com

注意:测试的时候访问的一定是代理varnish服务器,是通过来访问后台资源!

负载均衡的目的:就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,减轻服务器的压力,加快响应速度

说明:负载均衡(轮询),保证后台的两个服务器资源同步,这里为了说明确是在轮询,让访问的资源不一致!

保证:即使有一台服务机宕机,也能正常提供服务!

varnish 中 pipe 和 pass的区别

备注:注释pass 则会从缓存中访问,而不会去向后台访问!

服务器常见错误代码50X

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值