varnish+nginx+bind实现简单CDN加速_第1张图片

实现过程如下(该配置过程中IP和网关均为临时使用,生产中应配置在配置文件中):

1.配置网关服务器(用以模拟ISP)

ifconfig eth0:0 192.168.10.254

ifconfig eth0:1 192.168.20.254

ifconfig eth0:2 192.168.30.254

ifconfig eth0:3 192.168.40.254

ifconfig eth0:4 192.168.50.254

echo 1 > /proc/sys/net/ipv4/ip_forward  #开启网卡转发,实现数据包的转发,使该服务器能够具有路由功能

 

2.配置DNS服务器

#配置服务器IP和默认网关

ifconfig eth0 192.168.30.11/24

route add default gw 192.168.30.254

#安装DNS软件包-bind

yum install bind bind-chroot

#配置DNS主配置文件

#vim /etc/named/chroot/etc/named.conf

   
   
   
   
  1. options{ 
  2.         directory "var/named"
  3. }; 
  4. #创建acl地址池
  5. acl beijing { 
  6.         192.168.10.0/24; 
  7. #       10.1.0.0/16; 
  8. #       172.16.0.1; 
  9. }; 
  10. acl shanghai { 
  11.         192.168.20.0/24; 
  12. }; 
  13. 创建试图,匹配包括在不同地址池中的地址,为其分配不同的区域配置文件
  14. view beijing { 
  15.         match-clients      { beijing; }; 
  16.         recursion no
  17.         zone    "smileliuyb.com." { 
  18.                 type master; 
  19.                 file "beijing.smileliuyb.com.zone"
  20.         }; 
  21. }; 
  22. view shanghai { 
  23.         match-clients   { shanghai; }; 
  24.         recursion no
  25.         zone    "smileliuyb.com." { 
  26.                 type master; 
  27.                 file "shanghai.smileliuyb.com.zone"
  28.         }; 
  29. }; 
  30. view other { 
  31.         match-clients   { any; }; 
  32.         recursion no
  33.         zone    "smileliuyb.com." { 
  34.                 type master; 
  35.                 file "beijing.smileliuyb.com.zone"
  36. }; 

#配置区域文件

#cd /var/named/chroot/var/named/

#cp /usr/share/doc/bind-9.3.6/sample/var/named/named.local beijing.smileliuyb.com.zone

#vim beijing.smileliuyb.com.zone

   
   
   
   
  1. $TTL    86400 
  2. @       IN      SOA     localhost. root.localhost.  ( 
  3.                                       1997022700 ; Serial 
  4.                                       28800      ; Refresh 
  5.                                       14400      ; Retry 
  6.                                       3600000    ; Expire 
  7.                                       86400 )    ; Minimum 
  8.         IN      NS      localhost. 
  9. www.smileliuyb.com.     IN      A       192.168.40.250 
  10. p_w_picpath.smileliuyb.com.   IN      A       192.168.40.251 

#cp beijing.smileliuyb.com.zone shanghai.smileliuyb.com.zone

#vim shanghai.smileliuyb.com.zone

   
   
   
   
  1. $TTL    86400 
  2. @       IN      SOA     localhost. root.localhost.  ( 
  3.                                       1997022700 ; Serial 
  4.                                       28800      ; Refresh 
  5.                                       14400      ; Retry 
  6.                                       3600000    ; Expire 
  7.                                       86400 )    ; Minimum 
  8.         IN      NS      localhost. 
  9. www.smileliuyb.com.     IN      A       192.168.40.250 
  10. p_w_picpath.smileliuyb.com.   IN      A       192.168.50.251

#修改区域配置文件的属主和属组

chown named.named *.smileliuyb.com.zone

#重启DNS服务

/etc/init.d/named restart

 

3.配置网页服务器-Apache

#配置服务器IP和网关

ifconfig eth0 192.168.40.250/24

route add default gw 192.168.40.254

#安装apache服务软件包

yum install httpd -y

#创建一个测试页

#vim /var/www/html/index.html

   
   
   
   
  1. <html> 
  2.   <body> 
  3.     <p> 
  4.       <img border="0" src="http://p_w_picpath.smileliuyb.com/a.jpg"/> 
  5.     p> 
  6.   body> 
  7. html> 

#重启apache服务

/etc/init.d/httpd restart

 

4.配置图片服务器-nginx

#配置服务器ip和默认网关

ifconfig eth0 192.168.40.251/24

route add default gw 192.168.40.254

#安装nginx软件包

rpm -Uvh nginx-~.el5.i386.rpm

#配置nginx服务主配置文件

#vim /etc/nginx/nginx.conf

   
   
   
   
  1. server { 
  2.         listen  80; 
  3.         server_name p_w_picpath.smileliuyb.com; 
  4.         location / { 
  5.             root  /tmp/p_w_picpath; 
  6. # 开启目录访问
  7.             autoindex on
  8.     } 

#重启nginx服务

/etc/init.d/nginx restart

 

5.配置图片缓存服务器-varnish

#配置服务器IP和网关

ifconfig eth0:0 192.168.50.251/24

route add default gw 192.168.50.254

#编译varnish源码包

yum install gcc pcre-devel ncurses-devel -y

tar fxz varnish.~.gz

cd varnish.~

./configure --prefix=/usr/local/varnish && make && make install

#编辑varnish配置文件,加入下面内容

#vim /usr/local/varnish/etc/varnish/default.vcl

   
   
   
   
  1. #建立默认的反向代理
  2. backend default { 
  3.         .host = "192.168.40.250"
  4.         .port = "80"
  5. #建立p_w_picpath的反向代理
  6. backend p_w_picpath { 
  7.         .host = "192.168.40.251"
  8.         .port = "80"
  9. #建立规则匹配不同的反向代理
  10. sub vcl_recv { 
  11. # 匹配以.jpg结尾的url
  12.         if (req.url ~ "\.jpg$") { 
  13.                 set req.backend = p_w_picpath; 
  14. #                return (pass);
  15. return (lookup);  
  16.         } 
  17. # 匹配其他
  18.         else { 
  19.                 set req.backend = default;
  20. return (pass);
  21.         } 

#启动vanishi服务,该命令中,-f指定配置文件位置,-s为缓存文件分配的内存大小,-T指定管理ip,-a指定监听端口

/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,100M -T 127.0.0.1:2000 -a 0.0.0.0:80

 

    在该项业务中,当北京用户需要访问站点www.smileliuyb.com时,需要执行以下过程:首先,用户需要向DNS服务器发出请求,请求www.smileliuyb.com对应的ip地址;

DNS协议 TCP协议 IP协议 MAC
www.smileliuyb.com's IP is? dport:53

Dip:192.168.30.11
Sip:192.168.10.X

源目MAC地址

varnish+nginx+bind实现简单CDN加速_第2张图片

    DNS接受到该请求,则比对配置文件中的acl地址池,发现其对应的区域文件为beijing.smileliuyb.com.zone,则读取该区域文件内容,并将其中的ip地址回复给用户

DNS协议 TCP协议 IP协议 MAC
www.smileliuyb.com's ip is
192.168.40.250
sport:53

Dip:192.168.10.X
Sip:192.168.30.11

源目MAC地址

varnish+nginx+bind实现简单CDN加速_第3张图片

    用户在得到该解析后,向www.smileliuyb.com站点发出浏览请求

HTTP协议 TCP协议 IP协议 MAC
GET *.html
HEAD www.smileliuyb.com
dport:80 Dip:192.168.40.250
Sip:192.168.10.X
源目MAC地址

varnish+nginx+bind实现简单CDN加速_第4张图片

    服务器在接受到用户请求后,分析该请求并返回相应的页面

HTTP协议 TCP协议 IP协议 MAC
Type:text/html
DATA(index.html)
sport:80 Dip:192.168.10.X
Sip:192.168.40.250
源目MAC地址

varnish+nginx+bind实现简单CDN加速_第5张图片

    用户在得到相应的页面后,发现页面中存在代码 ,此时,用户再次向DNS服务器发出请求,请求p_w_picpath.smileliuyb.com的IP地址。

DNS协议 TCP协议 IP协议 MAC
p_w_picpath.smileliuyb.com's IP is? dport:53

Dip:192.168.30.11
Sip:192.168.10.X

源目MAC地址

varnish+nginx+bind实现简单CDN加速_第6张图片

    DNS服务器在接受到用户请求时,比对acl地址池并返回相应视图所对应的区域文件中关于该网址的IP数据

DNS协议 TCP协议 IP协议 MAC
p_w_picpath.smileliuyb.com's ip is
192.168.40.251
sport:53

Dip:192.168.10.X
Sip:192.168.30.11

源目MAC地址

varnish+nginx+bind实现简单CDN加速_第7张图片

    在此之前,北京用户与上海用户的数据包基本相同,之后,请求a.jpg时,才会出现不同,上一个DNS请求,上海用户得到的回复数据包如下

DNS协议 TCP协议 IP协议 MAC
p_w_picpath.smileliuyb.com's ip is
192.168.50.251
sport:53

Dip:192.168.20.X
Sip:192.168.30.11

源目MAC地址

varnish+nginx+bind实现简单CDN加速_第8张图片

varnish+nginx+bind实现简单CDN加速_第9张图片

    用户在得到DNS的解析应答后,向相应的服务器请求,此时,北京用户发出的请求如下

HTTP协议 TCP协议 IP协议 MAC
GET a.jpg
HEAD p_w_picpath.smileliuyb.com
dport:80 Dip:192.168.40.251
Sip:192.168.10.X
源目MAC地址

varnish+nginx+bind实现简单CDN加速_第10张图片

    上海用户发出的请求如下

HTTP协议 TCP协议 IP协议 MAC
GET a.jpg
HEAD p_w_picpath.smileliuyb.com
dport:80 Dip:192.168.50.251
Sip:192.168.10.X
源目MAC地址

varnish+nginx+bind实现简单CDN加速_第11张图片

    当北京用户的请求被图片服务器接收到之后,服务器将返回a.jpg文件,用户得到该文件后,这次访问就完成了。

HTTP协议 TCP协议 IP协议 MAC
Type:p_w_picpath
DATA(a.jpg)
sport:80 Dip:192.168.10.X
Sip:192.168.40.251
源目MAC地址

varnish+nginx+bind实现简单CDN加速_第12张图片

    而上海用户的请求被图片缓存服务其接收到之后,该缓存服务器将查看自己的缓存空间,如果缓存空间中已近缓存了该图片,则直接应答用户请求;如果缓存空间中没有该文件,则需要先向图片服务器发送请求,请求该图片,在得到应答后,在向用户发送应答数据包,并将该文件存入到自己的缓存空间中。该过程数据包如下:

a.缓存服务器请求图片

HTTP协议 TCP协议 IP协议 MAC
GET a.jpg
HEAD p_w_picpath.smileliuyb.com
dport:80 Dip:192.168.40.251
Sip:192.168.50.251
源目MAC地址

varnish+nginx+bind实现简单CDN加速_第13张图片

b.图片服务器应答请求缓存服务器请求

HTTP协议 TCP协议 IP协议 MAC
Type:p_w_picpath
DATA(a.jpg)
sport:80 Dip:192.168.50.251
Sip:192.168.40.251
源目MAC地址

varnish+nginx+bind实现简单CDN加速_第14张图片

c.缓存服务器应答用户请求

HTTP协议 TCP协议 IP协议 MAC
Type:p_w_picpath
DATA(a.jpg)
sport:80 Dip:192.168.50.251
Sip:192.168.20.X
源目MAC地址

varnish+nginx+bind实现简单CDN加速_第15张图片

    当上海其他用户再次请求该图片时,因为该图片已近在缓存服务器的缓存中,缓存服务器可以直接向用户返回应答请求,达到加速的目的。