cdn內容分發網絡

CDN內容分發網絡

CDN的全稱是Content Delivery Network,即內容分發網絡。其基本思路是儘可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度。
今天我們來應用cdn來發布多臺服務器的內容,不僅用來加速客戶端訪問網絡的速度,還可以分擔服務器的壓力.避免因爲訪問量過大,導致服務器的雪崩,當然也提高了網絡數據的穩定性.
首先小編爲大家帶來的是環境的部署,在企業中我們要操作多臺企業6.5的服務器,因此我們製作了6.5版本的最簡母盤,然後製作了幾個子盤。

母盤設置:

母盤虛擬機 base rhel6.5->512MB 最小化安裝選用RAM爲512MB默認爲最小化安裝,這樣的環境比較簡易:


內存大小:

母盤命名爲base

鍵盤設置:


跳過檢測:

區域選擇:

超戶密碼:


分區類型:

初始化所有:

寫入磁盤:

完成reboot

封裝母盤:

ip設置:

yum 源配置:

更改主機名和域名解析:

火牆iptables:

SELINUX:

物理機上面製作base子盤

virt-sysprep --help
如果沒有該命令需要yum whatprovides virt-sysprep
1 yum install /usr/bin/virt-sparsify
壓縮母盤,一般當需要copy母盤文件時
#virt-sysprep --compress base.qcow2 new.qcow
2 cd /var/lib/libvirt/images/
3 ls
4 ll base.qcow2
5 virt-sysprep -d base # 清除緩存


在圖形環境中刪除母盤但不刪除母盤源文件爲了以後不打開母盤動用母盤中的東西

1  virt-manager 
2  qemu-img create  -f qcow2 -b base.qcow2 test1 #用base.qcow2建立子盤test1
3  qemu-img create  -f qcow2 -b base.qcow2 test2
4  qemu-img create  -f qcow2 -b base.qcow2 test3
5  ls
6  du -sh base.qcow2  #查看base母盤容量
7  du -sh test1 
8  du -sh test2
9  du -sh test3


在virt-manager中添加已有鏡像test1
import existing disk image
並給添加的虛擬機命名爲test1 OS type linux Version rhel6.5

所有的操作都存儲在子盤中
如果刪掉了/etc 當重新啓動時,虛擬機起不來不用着急,把壞掉的子盤文件刪掉重新制作
添加就ok
實驗:(子盤終端)dd if=/dev/zero of=file bs=1M count=100
在物理機中查看子盤容量會增加100M du -sh 子盤文件

1 qemu-img info test1 #查看子盤的母盤是誰
2 systemctl status libvirtd
當關閉libvirtd時,在virt-manager中是看不見這些子盤的,但他們還是工作的
我們可以用ssh 連接它,也可以ping
3 systemctl stop libvirtd
4 virsh list
在物理機中vnet0上沒有橋接怎麼辦
ip link set up dev vnet0


kvm(cpu,memory)+qemu(disk,net,i/o)
虛擬機操作:
virsh start test1 #開啓test1子盤虛擬機

cdn實驗:

客戶端一般訪問數據的程序:

client->dns->cdn->server->cdn->cache->client

在這裏我們讓server1作爲cdn服務器:
server2作爲http後臺終端服務器:

varnish

主機環境: rhel6 selinux and iptables disabled
實驗主機: 172.25.30.250
 varnish
172.25.30.1
 apache
172.25.30.2
 apache
172.25.30.3

VCL 處理流程圖


處理過程大致分爲如下幾個步驟:
(1)Receive 狀態,也就是請求處理的入口狀態,根據 VCL 規則判斷該請求應該是 Pass 或
Pipe,或者進入 Lookup(本地查詢)。
(2)Lookup 狀態,進入此狀態後,會在 hash 表中查找數據,若找到,則進入 Hit 狀態,否則進
入 miss 狀態。
(3)Pass 狀態,在此狀態下,會進入後端請求,即進入 fetch 狀態。
(4)Fetch 狀態,在 Fetch 狀態下,對請求進行後端的獲取,發送請求,獲得數據,並進行本地
的存儲。
(5)Deliver 狀態, 將獲取到的數據發送給客戶端,然後完成本次請求。

**varnish**
yum install varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
內核參數<-操作系統<-程序
vim /etc/security/limits.conf #操作系統
vim /etc/sysconfig/varnish/ #varnish參數配置設置
vim /etc/varnish/default.vcl #程序主配置文件

varnish參數設置:
當需要在多臺服務器上面緩存數據,就需要Varnish映射所有的URL到一臺單獨的主機

NFILES========可以打開的最大文件數目
MEMLOCK=====存儲鎖定
NPROCS======進程要求
VARNISH_LISTEN_PORT=80 =========修改VARNISH監聽端口,當Varnish需要訪問後端服務器時,就會訪問自己的80端口.
RELOAD_VCL=1====Varnish指定重新reload varnish的時候,重新reload一下VCL配置文件
VARNISH_VCL_CONF=/etc/varnish/default.vcl #Varnish默認主配置文件
VARNISH_MIN_THREADS=50 #等待連接後端的最短時間
VARNISH_MAX_THREADS=1000
VARNISH_THREAD_TIMEOUT=120 #Varnish中的數據超過120s就會過期
VARNISH_STORAGE_SIZE=1G #存儲空間
VARNISH_SECRET_FILE==指定shell接口使用的密鑰文件
指定varnish進程的屬主和屬組
VARNISH_USER=varnish
VARNISH_GROUP=varnish# 指定運行時的參數,使用-p選項來指定,thread_pools=6:表示啓用6個線程池,thread_pool_min=5:表示每個線程池裏面最少5個線程,thread_pool_max=500:表示每個線程池裏面最大500個線程,thread_pool_timeout=300:表示線程的請求超時時長
DAEMON_OPTS=”-p thread_pools=6 -p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300”


    1  vim /etc/sysconfig/varnish
    2  /etc/init.d/varnish restart
    3  sysctl -a |grep file


根據varnish的參數設置,將系統的內核參數也設置和他匹配從而加快varnish緩存速度:
vim /etc/security/limits.conf

在後端服務器上面發佈index.html

1 yum install httpd
2 /etc/init.d/httpd start
3 vim /var/www/html/index.html


配置一個後端服務器:
測試是否發佈:

1 vim /etc/varnish/default.vcl 
配置一個後端服務器
backend web1 {
  .host = "172.25.30.2";
  .port = "80";
}
查看緩存命中情況
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 /etc/init.d/varnish restart


在客戶端測試查看發佈的信息是否被varnish緩存命中:

   1  vim /etc/hosts #本地域名解析
   2  curl -I www.westos.org
   X-Cache: HIT from westos cache #命中
   X-Cache: MISS from westos cache #未命中
1:req.:由客戶發來的http請求相關
req.http.:拿到請求報文各個首部值
例如:req.http.Cookie 拿到請求報文中的Cookie首部的值
2:resp.:由varnish響應給client的http響應報文
resp.http. :響應報文的各個首部
例如:set resp.http.X-Cache = "HIT from " + server.hostname 給X-Cache首部賦值
3:bereq.:由varnish向backend主機發出的http請求 (backend request:後端主機的請求報文)
bereq.http. :向backend主機發送的請求報文的對象
4:beresp.:由backend主機發來的http響應報文
beresp.http. :由backend主機發來的http的響應報文的對象
5:obj. :存儲在緩存空間中的緩存對象屬性
 在編寫vcl配置文件中,常用的對象,已經對象的意義說明

定義多個不同域名站點的後端服務器:

server3:添加一個http服務器2

 1  yum install httpd -y
 2  /etc/init.d/httpd start 
 3  vim /var/www/html/index.html


varnish配置多臺http服務器:

vim /etc/varnish/default.vcl
定義多個不同域名站點的後端服務器
#當訪問www.westos.org 就會從web1(172.25.30.2)中取數據緩存到cdn中,
當訪問bbs.westos.org 就會從web2(172.25.30.3)中取數據緩存到cdn中
backend web1 {
  .host = "172.25.30.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.30.3";
  .port = "80";
}
#當訪問 www.westos.org 域名時從 web1 上取數據,訪問 bbs.westos.org 域名時到 web2 取數據,訪問其他頁面報錯。
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";}
}

客戶端訪問查看是否命中:
<1>當沒有(req.http.host ~ “^(www.)?westos.org”)時在客戶端訪問westos.org時是不能識別和命中的

<2>當添加(req.http.host ~ “^(www.)?westos.org”)時在客戶端訪問westos.com相當於訪問www.westos.com


<3>訪問bbs.westos.com即訪問服務器3

把一個文件發佈到兩個服務器上面,從而緩解後臺服務器的壓力,提高數據的穩定性,這種情況多用於當訪問量過大時負載均衡到兩個服務器上,即使有一個服務器壞掉了,還有一個服務器來頂替他的工作。varnish還是可以從終端的服務器中取出客戶端訪問的數據緩存起來。
在server3上面發佈和server2上一樣的網頁.

1 mkdir /www1/
2 vim /www1/index.html
www.westos.org --server3/http
vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80 
#當訪問bbs.westos.org域名時,系統默認發佈根目錄爲/var/www/html
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName bbs.westos.org
</VirtualHost>
#當訪問bbs.westos.org域名時,系統默認發佈根目錄爲/www1
<VirtualHost *:80>
    DocumentRoot /www1
    ServerName www.westos.org
</VirtualHost>
3 /etc/init.d/httpd restart


varnish上面部署負載均衡

1 vim /etc/varnish/default.vcl 
## 輪循分配方法round-robin  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;}
    ## 調用lb,當訪問www.westos.org時,輪循訪問web1,web2
#return (pass);
# http中pass生效表示不在cdn中取緩存數據,直接在後臺取數據,這樣的話,varnish沒有起到任何作用相當於負載均衡,他只是爲了在測試中更好的看到實驗效果,實際中不需要添加.實驗中當清空了緩存數據,有一端的後臺服務器掛掉之>後,另一個服務器會頂替他,如果掛掉的服務器數據還在有效期,還是可以在cdn中方問到
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
2 /etc/init.d/varnish reload


pass可以讓我們更好地看到實驗效果,但他是直接跳過cdn直接從服務器中取數據,並沒有什麼實際作用。

註釋掉pass之後,我們可以看到客戶端訪問數據時,如果有一個服務器壞掉了,varnish還是可以從另一個服務器中緩存數據
我們可以看到即便down掉了後臺的一個服務器,在他被varnish緩存數據沒有過期時,客戶端還是可以訪問到,但當他的數據過期時,就要從另一個服務器中緩存了,可以證明,我們訪問的數據是從cdn緩存中取到的

當我們在cdn上把從服務器上緩存清空時,如果有一個服務器壞掉了我們依然能夠訪問到但此時只有從開啓的服務器中緩存數據
![](https://img-blog.csdn.net/2018072814594823?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RyZWFtZXJfeGl4aXhp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

通過 varnishadm 手動清除緩存

# varnishadm ban.url .*$
#清除所有
# varnishadm ban.url /index.html
#清除 index.html 頁面緩存
# varnishadm ban.url /admin/$
#清除 admin 目錄緩存

CDN推送平臺:

  • 應用於網站信息已經更新但是還在cdn中緩存這樣就會導致用戶在訪問服務器時影響信息的時效性和準確性
  • cdn推送:清除緩存信息,推送什麼,清除什麼
  • http終端服務器服務要打開:
  • 在cdn服務器上面安裝httpd,爲了避免和cdn端口衝突,需要將端口改爲8080,這裏的http安裝是爲推送cdn平臺
vim /etc/httpd/conf/httpd.conf #修改cdn中的http端口避免和cdn衝突
/etc/iniit.d/httpd reload
安裝yum install bansys.zip php #banzip.zip給壓縮包解壓,php推送平臺是用php語言寫的
unzip bansys.zip -d /var/www/html/ #-d指定解壓路徑
cd /var/www/html/
cd bansys/
mv * /var/www/html/
cd /var/www/html/
vim config.php #更改
#只保留如下設置,其餘註釋掉
<?php
$var_group1 = array(
'host' => array('172.25.30.1'), #varnish服務端
'port' => '80',
);
//varnish 羣組定義
//對主機列表進行綁定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1, 
);
//varnish 版本//2.x 和 3.x 推送命令不一樣
$VAR_VERSION = "3";
?>
#bansys 有兩種工作模式,分別是:telnet 和 http 模式
#telnet 模式需要關閉 varnish 服務管理端口的驗證,註釋掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”這行,重啓 varnish 服務即可。
#如果是 http 模式需要對 varnish 做以下設置:
vi /etc/varnish/default.vcl
acl westos {
#設置訪問控制
"127.0.0.1";
"172.25.30.1"/24;
}
sub vcl_recv {
if (req.request == "BAN")
{
  if (!client.ip ~ westos)
    {error 405 "Not allowed.";}
    ban("req.url ~ " + req.url);
    error 200 "ban added";
}
             }
# service varnish reload
 #訪問推送:172.25.30.1:8080 -->推送文件
crul www.westos.org/index.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章