CDN技术简介      

CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN 的作用是采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避免单点失效带来的不良影响。 CDN 利用全局负载均衡技术将用户的访问指向离用户最近的工作正常的流媒体服务器上,由流媒体服务器直接响应用户的请求。服务器中如果没有用户要访问的内容,会根据配置自动从原服务器抓取相应的内容并提供给用户。 IPTV 可利用 CDN 为用户提供 VOD 业务,通过 CDN 把视频内容分发到靠近用户端的 CDN 节点后,可以在一定程度上保证端到端的服务质量。

1、负载均衡技术  

         负载均衡技术不仅仅应用于CDN中,在网络的很多领域都得到了广泛的应用,如服务器的负载均衡、网络流量的负载均衡。顾名思义,网络中的负载均衡就是将网络的流量尽可能均匀分配到几个能完成相同任务的服务器或网络节点上,由此来避免部分网络节点过载。这样既可以提高网络流量,又提高了网络的整体性能。在CDN中,负载均衡又分为服务器负载均衡和服务器整体负载均衡(也有的称为服务器全局负载均衡)。服务器负载均衡是指能够在性能不同的服务器之间进行任务分配,既能保证性能差的服务器不成为系统的瓶颈,又能保证性能高的服务器的资源得到充分利用。而服务器整体负载均衡允许Web网络托管商、门户站点和企业根据地理位置分配内容和服务。通过使用多站点内容和服务来提高容错性和可用性,防止因本地网或区域网络中断、断电或自然灾害而导致的故障。在CDN的方案中服务器整体负载均衡将发挥重要作用,其性能高低将直接影响整个CDN的性能。

2、动态内容分发与复制技术

  大家都知道,网站访问响应速度取决于许多因素,如网络的带宽是否有瓶颈、传输途中的路由是否有阻塞和延迟、网站服务器的处理能力及访问距离等。多数情况下,网站响应速度和访问者与网站服务器之间的距离有密切的关系。如果访问者和网站之间的距离过远的话,它们之间的通信一样需要经过重重的路由转发和处理,网络延误不可避免。一个有效的方法就是利用内容分发与复制技术,将占网站主体的大部分静态网页、图像和流媒体数据分发复制到各地的加速节点上。所以动态内容分发与复制技术也是CDN所需的一个主要技术。

3、缓存技术

  缓存技术已经不是一种新鲜技术。Web缓存服务通过几种方式来改善用户的响应时间,如代理缓存服务、透明代理缓存服务、使用重定向服务的透明代理缓存服务等。通过Web缓存服务,用户访问网页时可以将广域网的流量降至最低。对于公司内联网用户来说,这意味着将内容在本地缓存,而无须通过专用的广域网来检索网页。对于Internet用户来说,这意味着将内容存储在他们的ISP的缓存器中,而无须通过Internet来检索网页。这样无疑会提高用户的访问速度。CDN的核心作用正是提高网络的访问速度,所以,缓存技术将是CDN所采用的又一个主要技术。

一、原理     

    Squid是一种在Linux系统下使用的优秀的代理服务器软件。 

    squid不仅可用在Linux系统上,还可以用在AIX、Digital Unix、FreeBSDHP-UXIrixNetBSDNextstepSCOSolaris等系统上。 

    Squid与Linux下其它的代理软件如ApacheSocks、TIS FWTK和delegate相比,下载安装简单,配置简单灵活,支持缓存和多种协议。用ipchains+Squid的解决方案,就可以获得通过缓存高性能的同时能够无缝的访问Internet。

      Squid是一个缓存internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户想要下载一个主页时,它向Squid发出一个申请,要Squid替它下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。 

    对于Web用户来说,Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Internet的速度,提高客户机的访问命中率。Squid不仅支持HTTP协议,还支持FTPgopherSSLWAIS等协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。 Squid将数据元缓存在内存中,同时也缓存DNS查寻的结果,除此之外,它还支持非模块化的DNS查询,对失败的请求进行消极缓存。Squid支持SSL,支持访问控制。由于使用了ICP,Squid能够实现重叠的代理阵列,从而最大限度的节约带宽。 

     Squid由一个主要的服务程序Squid,一个DNS查询程序dnsserver,几个重写请求和执行认证的程序,以及几个管理工具组成。当Squid启动以后,它可以派生出指定数目的dnsserver进程,而每一个dnsserver进程都可以执行单独的DNS查询,这样一来就大大减少了服务器等待DNS查询的时间。 Squid的另一个优越性在于它使用访问控制清单(ACL)和访问权限清单(ARL)。访问控制清单和访问权限清单通过阻止特定的网络连接来减少潜在的Internet非法连接,可以使用这些清单来确保内部网的主机无法访问有威胁的或不适宜的站点。 

     Squid对硬件的要求是内存一定要大,不应小于128M,硬盘转速越快越好,最好使用服务器专用SCSI硬盘,处理器要求不高,400MH以上既可。

代理服务器原理

       代理服务器接受到请求后,首先与访问控制列表中的访问规则相对照,如果满足规则,则在缓存中查找是否存在需要的信息。 客户端B向代理服务器提出相同的请求。代理服务器也首先与访问控制列表中的访问规则相对照。如果满足规则,则将缓存中的信息传送给客户端B

 squid简介 访问控制清单和访问权限清单通过阻止特定的网络连接来减少潜在的Internet非法连接,可以使用这些清单来确保内部网的主机无法访问有威胁的或不适宜的站点。

以下是一些squid的基本配置参数解释 

      http_port 3128 //设置监听的IP与端口号 

      cache_mem 64 MB //设置内存缓冲的大小 

      cache_dir ufs /var/spool/squid 2000 16 256 //设置硬盘缓冲大小 

      cache_effective_user squid //设置缓存的有效用户 

      cache_effective_group squid //设置缓存的有效用户组 

      dns_nameservers 192.168.145.254 //设置DNS服务器地址,一般可以不设置,默认使用服务器自己设置的dns   

     cache_access_log /var/log/squid/access.log //设置访问日志文件        cache_log /var/log/squid/cache.log //设置缓存日志文件

     visible_hostname 192.168.145.254 //设置squid主机名称

以上全局参数根据你自己的需要修改 

         其实linux下的服务器配置文件最好就是squid,它对每个参数都有解释,而且很多有很多实例

1.ACL元素

该元素定义的语法如下:

    acl aclname acltype string1…

    acl aclname acltype "file"…

    当使用文件时,该文件的格式为每行包含一个条目。

    其中,acltype可以是src、dst、srcdomain、dstdomain、url_regex、urlpath_regex、time、port、proto、method中的一任意一种。

    src:指明源地址。可以用以下的方法指定:

    acl aclname src ip-address/netmask ... 客户ip地址

    acl aclname src addr1-addr2/netmask ... 地址范围

    dst:指明目标地址,即客户请求的服务器的IP地址。语法为:

    acl aclname dst ip-address/netmask ...

    srcdomain:指明客户所属的域,Squid将根据客户IP反向查询DNS。语法为: acl aclname srcdomain foo.com ...

    dstdomain:指明请求服务器所属的域,由客户请求的URL决定。语法为:

    acl aclname dstdomain foo.com ...。此处需要注意的是:如果用户使用服务器IP而非完整的域名时,Squid将进行反向的DNS解析来确定其完整域名,如果失败,就记录为“none”。

    time:指明访问时间。语法如下:

    acl aclname time [day-abbrevs] [h1:m1-h2:m2][hh:mm-hh:mm] 日期的缩写指代关系如下:

  1. S:指代Sunday
  2. M:指代Monday
  3. T:指代Tuesday
  4. W:指代Wednesday
  5. H:指代Thursday
  6. F:指代Friday
  7. A:指代Saturday 另外,h1:m1必须小于h2:m2,表达式为[hh:mm-hh:mm]。

port:指定访问端口。可以指定多个端口,比如:

acl aclname port 80 70 21 ...acl aclname port 0-1024 ... 指定一个端口范围

proto:指定使用协议。可以指定多个协议:

acl aclname proto HTTP FTP ...

method:指定请求方法。比如:

acl aclname method GET POST ...

url_regex:URL规则表达式匹配,语法为:

acl aclname url_regex[-i] pattern

urlpath_regex:URL-path规则表达式匹配,略去协议和主机名。其语法为:

acl aclname urlpath_regex[-i] pattern

 

    在使用上述ACL元素的过程中,要注意如下几点:
  1. acltype可以是任一个在ACL中定义的名称。
  2. 任何两个ACL元素不能用相同的名字。
  3. 每个ACL由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换句话说,任一ACL元素的值被匹配,则这个ACL元素即被匹配。
  4. 并不是所有的ACL元素都能使用访问列表中的全部类型。
  5. 不同的ACL元素写在不同行中,Squid将这些元素组合在一个列表中。

squid常用调试命令  

      1、初始化你在 squid.conf 里配置的 cache 目录  

 #squid/sbin/squid -z //第一次启动squid服务时必须输入此命令  

 如果有错误提示,请检查你的 cache目录的权限。

       2、对你的squid.conf 排错,即验证 squid.conf 的 语法和配置。

  #squid/sbin/squid -k parse

  如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动squid。

  3、在前台启动squid,并输出启动过程。

  #squid/sbin/squid -N -d1

  如果有到 ready to server reques,恭喜,启动成功。

  然后 ctrl + c,停止squid,并以后台运行的方式启动它。

  4、启动squid在后台运行。

  #squid/sbin/squid -s

  这时候可以 ps -A 来查看系统进程,可以看到俩个 squid 进程。

  5、停止 squid

  #squid/sbin/squid -k shutdown

  这个不用解释吧。

  6、重引导修改过的 squid.conf

  #squid/sbin/squid -k reconfigure

  这个估计用的时候比较多,当你发现你的配置有不尽你意的时候,可以随时修改squid.conf,然后别忘记对你的 squid.conf排错,然后再执行此指令,即可让运行中squid重新按照你的squid.conf 来运行。

  7、把squid添加到系统启动项

  编辑 /etc/rc.d/rc.local

  添加如下行: /usr/local/squid/sbin/squid -s

  当然,并不是每个人都喜欢这种启动方式,你可以用你最习惯的方式;或者把它安装为服务。

  再来点其他的。

 1、修改cache 缓存目录的权限。

  #chown -R squid:squid /home/cache

  我的cache缓存目录是 /home/cache,squid执行用户和用户组是 squid,squid。   2、修改squid 日志目录的权限

  #chown -R squid:squid /usr/local/squid/var/logs

  这一步并不是适合每一个使用squid的用户.意为让squid有权限在该目录进行写操作 。

  例如生成 access.log cache.log store.log   

3、查看你的日志文档。

  #more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT

  该指令可以看到在squid运行过程中,有那些文件被squid缓存到内存中,并返回给访问用户。

  #more /usr/local/squid/var/logs/access.log | grep TCP_HIT

  该指令可以看到在squid运行过程中,有那些文件被squid缓存到cache目录中,并返回给访问用户。

  #more /usr/local/squid/var/logs/access.log | grep TCP_MISS

  该指令可以看到在squid运行过程中,有那些文件没有被squid缓存,而是现重原始服务器获取并返回给访问用户。    

4、squid -k rotate 轮换squid的日志文件/var/log/squid,Squid代理服务器日志文件

  的增长速度是惊人的,很容易点球满磁盘空间导致系统不能正常工作,甚至是死机.为了解决日志文件增长太快的问题,squid采用了"轮换"的方法.在squid.conf中可以通过logfile_rotate来设置文件轮换的个数,如:

  logfile_rotate 10 ,轮换的工作一般用crontab定时器完在周期性的日志轮换,例如每周六凌晨2:00进行日志轮换,则执行如下命令: crontab -e

  0 2 * * 6 squid -k rotate

  小贴士:Squid默认的错误提示信息为英文,对于英文不好的用户来说,实在不方便.在/etc/squid/squid.conf里添加如下:

  error_directory /usr/share/squid/errors/Simplify_Chinese 即可显示中文的错误提示。

案例:

本实验采用光盘搭建squid服务。

案例一透明代理以及squid控制元素的综合应用

要求:内网用户并不知道代理服务器的存在。实现对外网的访问。以及acl的一些小案例应用。

拓扑图

image

配置

[root@localhost ~]# mkdir /mnt/cdrom

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom

[root@localhost ~]# cd /mnt/cdrom/Server/

[root@localhost Server]# rpm -ivh squid-2.6.STABLE21-3.el5.i386.rpm

[root@localhost Server]# cd /var/spool/squid/

[root@localhost squid]# service squid start

会提示初始化squid目录

[root@localhost squid]# vim /etc/squid/squid.conf

squid 默认是拒绝所有访问。为了试验需求。允许通过所有。与acl的结合。

2994 visible_hostname www.zz.com //可选,出错信息显示

636 http_access allow localhost
637 http_access allow all
638 http_access deny all

[root@localhost squid]# service squid restart

首先进行一个小测试。

代理服务器地址:192.168.145.254 3128

image

image

这需要用户知道代理服务器的存在。然而对于大多数用户来说。他们并不知道这种存在。这就需要squid的透明代理。

透明代理的配置:

用户并不知道代理服务器的存在。所以我们的服务器需要用到nat。我们也需要指明网关。

image

打开服务器的路由转发功能。

[root@localhost squid]# vim /etc/sysctl.conf

7 net.ipv4.ip_forward = 1

[root@localhost squid]# sysctl –p    //编辑生效
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456

[root@localhost squid]# iptables  -t nat -A POSTROUTING -s 192.168.145.0/24 -p udp --dport 53  -o eth1 -j MASQUERADE

在POSTROUTING追加规则对来自192.168.145.0 网段的udp 端口号53 的dns解析从eth1出去的进行MYSQUERADE动作。(使用eth1的地址为nat转换的源地址)

[root@localhost squid]# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0  -j REDIRECT --to-ports 3128

在PREROUTING追加规则对来自任意地址的tcp 端口号为80 的http请求从eth0进来的进行重定向动作。端口重定向为3128.

[root@localhost squid]# vim /etc/squid/squid.conf

920 http_port 192.168.145.254:3128 transparent     //设为透明代理

image

acl的使用

修改过配置文件都要重新启动squid服务。

[root@localhost squid]# vim /etc/squid/squid.conf

590 acl badip src 192.168.145.20/32

591  http_access deny badip

[root@localhost squid]# service squid restart

[root@localhost squid]# tail -f  /var/log/squid/access.log   //查看日志文件

1346299978.297    346 192.168.145.20 TCP_MISS/200 566 GET http://www.baidu.com/favicon.ico - DIRECT/119.75.217.56 image/x-icon

image

其他案例大家可以进行测试。更多的只能自己实验了。

1)acl badip src 192.168.145.20-192.168.145.30/32   

       http_access deny badip

2)acl badip src 192.168.145.20/32

       http_access deny badip

3) acl webip  dst 119.75.218.77/32   //百度地址
       http_access deny webip

4)acl webip  dst 119.75.218.77/32   
     acl manip  src 192.168.145.10/32
     http_access deny !manip webip   //禁止非manip访问Webip

5)acl badweb  dstdomain .sina.com.cn
      http_access deny badweb

6)acl worktime time MTWHF 08:00-18:00
      http_access deny worktime

7)acl badweb  url_regex -i sina
      http_access deny badweb

8)acl badcontent  urlpath_regex -i \.jpg$ \.gif$
     http_access deny badcontent

案例二

反向代理的实现

 

image

在内网搭建Web服务器

192.168.145.200

[root@localhost ~]# mkdir /mnt/cdrom

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom

[root@localhost ~]# cd /mnt/cdrom/Server/

[root@localhost Server]# rpm -ivh httpd-2.2.3-22.el5.i386.rpm

[root@localhost Server]# cd /var/www/html/

[root@localhost html]# echo "welcome to ZZ's home" >index.html //测试网页

服务器端

[root@localhost squid]# vim /etc/squid/squid.conf

919 http_port 192.168.101.10:80 vhost    //监听端口

1180 #       #                                        proxy  icp
1181 #       #          hostname             type     port   port  options
1182 #       #          -------------------- -------- ----- -----  -----------
1183 #       cache_peer parent.foo.net       parent    3128  3130  proxy-only default
1184         cache_peer 192.168.145.200      parent    80     0    originserver   
1185 #       cache_peer sib2.foo.net         sibling   3128  3130  proxy-only 测试:

image