CDN介紹:
1 . 對cdn的理解: CDN的全稱是(Content Delivery Network),即內容分發網絡;加速器,反向代理緩存。CDN系統能夠實時的根據網絡流量和各節點的連接,負載狀況以及到用戶的舉例和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上,其目的是使用戶可以就近取得所需內容,解決Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度。
2. 基本原理: CDN的基本原理是廣泛采用各種緩存服務器,將這些緩存服務器分布到用戶訪問相對集中的地區或網絡中,在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工作正常的緩存服務器上,由緩存服務器直接響應用戶請求。
3 . 服務模式: 簡單地說,內容分發網絡(CDN)是一個經策略性部署的整體系統,包括分布式存儲、負載均衡、網絡請求的重定向和內容管理 4個要件,
內容管理和全局的網絡流量管理(Traffic Management)是CDN的核心所在。通過用戶就近性和服務器負載的判斷,CDN確保內容以一種極為高效的方式為用戶的請求提供服務 。
內容服務基于緩存服務器,也稱作代理緩存(Surrogate) ,它位于網絡的邊緣,距用戶僅有"一跳"(Single Hop)之遙。同時,代理緩存是內容提供商源服務器(通常位于CDN服務提供商的數據中心)的一個透明鏡像。這樣的架構使得CDN服務提供商能夠代表他們客戶,即內容供應商,向最終用戶提供盡可能好的體驗,而這些用戶是不能容忍請求響應時間有任何延遲的。
varnish介紹:
1 . varnish: 是一款具有高性能的開源http加速器,具有反向代理、緩存功能。
Varnish的功能與Squid服務器相似,都可以用來做HTTP緩存。Squid是從硬盤讀取緩存的數據,而Varnish把數據存放在內存中,直接從讀取內存,避免了頻繁在內存、磁盤中交換文件,所以Varnish要相對更高效,但也有缺點,內存中的緩存在服務器重啟后會丟失。
2 . varnish 如何工作: varnish主要存在兩個進程,manage進程及child進程,
manage 進程:更新配置,vcl 文件編譯,varnish 監控,初始化 varnish 及提供 varnish 管理接口。
child 進程:主要進行請求任務的處理,接受請求等。
child 進程中各線程的處理任務:
accept 線程: 監聽端口,接受連接;接受連接后組成 session 結構,查看是否有空閑線程,若有則分配給其處理,若無,則檢查等待隊列 overflow 的大小,若過大,則拋棄請求,否則加入 overflow 隊列。
work 線程: 從 overflow 隊列中獲取任務, 走 Varnish 狀態機流程處理任務,完成后通過 pipe 的線程通信,傳遞給 epoll 線程,等待下一個事件觸發。
epoll 線程:將事件發送時對應的 session , 放入 overflow 隊列,以供 work 線程從中取出繼續處理。當然,在等待事件發送時,會檢查該 session 是否過期。
expire 線程:對以二叉樹形式組織的緩存對象,進行過期檢查,對過期的對象進行處理(更新或者棄用。
cdn加速的實現:
實驗環境:
三臺主機:為了實驗方便,全部關閉防火墻,selinux設置為disabled
代理服務器(varnish服務器):172.25.5.111
后端資源服務器:172.25.5.112
客戶端物理主機:172.25.5.250
1 . 代理服務端安裝:
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
rpm -qc 軟件包 查看生成的文件
2)查看varnish的服務文件:
vim /usr/lib/systemd/system/varnish.service
Varnish打開的最大文件數限制為131072
Varnish鎖定的共享內存大小為82M
3)查看本機系統最大文件訪問數量
sysctl -a | grep file
發現滿足Varnish打開的最大文件數限制
4)全局臨時更改共享內存及最大文件數
ulimit -n 131072 ##臨時更改更改最大文件數ulimit -l 82 ##臨時更改更改最大共享內存ulimit -a ##查看用戶限制
5)編輯varnish用戶的限制文件
vim /etc/security/limits.conf ##將最大文件訪問數以及鎖定的內存大小寫入文件最后
6)修改varnish服務端口
vim /etc/varnish/varnish.params 更改端口為80
7)varnish主配置文件中指定后端服務器
vim /etc/varnish/default.vcl 指定后端服務和端口
最后重啟vanish服務
2 . 設置后端服務器
yum install httpd -ycd /var/www/html/vim index.htmlsystemctl start httpd
3 . 測試:使用物理主機直接訪問代理服務器,可以得到資源服務器中的內容
Varnish緩存命中情況:
作為varnish代理端,在配置文件中添加了后端服務器的ip及端口,在訪問代理端的時候實際是在訪問后端服務器,則第一次訪問會產生緩存,下一次訪問的時侯則由緩存服務器直接響應客戶端需求,減少延時。
修改配置文件,在緩存數據時發送信息給客戶端(查看緩存命中情況),根據數據是來自后端服務器還是來自緩存的內容,返回不同的消息給客戶端主機。
vim /etc/varnish/default.vcl
在緩存數據將要發送到客戶端時調用的子進程。
在代理服務器上對varnish緩存進行清理:
varnishadm ban req.url "~" / # 清理所有的緩存varnishadm ban req.url "~" /index.html # 對指定文件的緩存進行清理
先對varnish服務器的緩存進行清理:
varnishadm ban req.url "~" /
使用客戶主機進行測試緩存命中情況:
第一次訪問的時候不存在緩存內容,數據由后端服務器獲取
再次訪問的時候已經有了緩存數據,命中緩存。
定義不同域名站點的后端服務器:
在使用不同的域名訪問同一臺代理服務器的時候,可以進行設置,將請求由發送到不同的后端服務器。
需要在代理服務器的varnish配置文件中設置多個后端服務器,并在vcl_recv 子程序中設置對不同的域名請求發送到不同的后端服務器。
vim /etc/varnish/default.vcl 在varnish端添加
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") { ##如果請求的域名為www.westos.org或者 westos.orgset req.http.host = "www.westos.org"; ##當將其賦值為 www.westos.orgset req.backend_hint = web1; ##讓后將請求發送給為web1 后端服務器
}elsif (req.http.host ~ "^bbs.westos.org") { ##如果請求域名為bbs.westos.orgset req.backend_hint = web2; ##就將請求發送給web2
}else {return (synth(405)); ##其他的域名返回一個405錯誤
}
}
寫好之后重啟varnish服務
在客戶端寫好解析:
解析好之后進行測試:
輪詢機制實現后端服務器負載均衡:
當某臺后端服務器的訪問壓力過大的時候,可以設置多臺后端服務器,提供相同的內容服務,將客戶請求分配給多臺服務器,減緩一臺服務器的壓力。
可以把多臺 backends 聚合成一個組,這些組被叫做 directors。這樣可以增強性能和彈力.
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so"; ##導入模塊
backend web1 {.host = "172.25.5.112"; 定義第一個后端服務器.port = "80";
}
backend web2 {.host = "172.25.5.113"; 定義第二個后端服務器.port = "80";
}sub vcl_init {new lb = directors.round_robin(); 新建一個組lb.add_backend(web1); 將web1 添加到這個組lb.add_backend(web2); 將web2 添加到這個組
}sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {set req.http.host = "www.westos.org";set req.backend_hint = lb.backend(); 發送請求循環組,讓組中的后端服務器輪流處理請求return(pass); 設置直接將請求發送到后端服務器,并且不緩存返回的內容
}elsif (req.http.host ~ "^bbs.westos.org") {set req.backend_hint = web2;
}else {return (synth(405));
}
}
round_robin()這個 director 是一個循環的 director。它的含義就是 director 使用循環的方式把backends 分給請求。
測試:
推送管理平臺:
為了更加快捷方便及時對代理服務器中緩存內容進行清理更新。可以在代理服務器上設置網絡推送頁面,直接在網頁上推送平臺對代理服務器緩存進行修改。
1 代理服務器上安裝php 以及http
由于推送平臺使用的是php進行編寫,需要安裝php插件識別php腳本內容。
yum install php httpd -y
vim /etc/httpd/conf/httpd.conf 更改http端口為8080,80默認端口已經被varnish占用
systemctl restart httpd 重啟http服務
2 解壓平臺安裝包到httpd公共目錄里
unzip bansys.zip -d /var/www/html (沒有unzip的可以先yum install unzip)
cd /var/www/html
mv bansys/* /var/www/html # 將解壓出目錄中的文件全部放到公共目錄中
vim config.php 修改推送平臺配置文件如下
3 . 修改varnish配置文件
vim /etc/varnish/default.vcl
重啟varnish服務
4 . 客戶端進行測試 :http://172.25.5.111:8080