文章目錄
1. CDN的介紹
CDN的全稱是Content Delivery Network,即內容分發網絡。CDN是構建在現有網絡基礎之上的智能虛擬網絡,依靠部署在各地的邊緣服務器,通過中心平臺的負載均衡、內容分發、調度等功能模塊,使用戶就近獲取所需內容,降低網絡擁塞,提高用戶訪問響應速度和命中率。CDN的關鍵技術主要有內容存儲和分發技術。
CDN網絡中包含的功能實體包括內容緩存設備、內容交換機、內容路由器、CDN內容管理系統等組成。內容服務基於緩存服務器,也稱作代理緩存。包括分佈式存儲、負載均衡、網絡請求的重定向和內容管理4個要件。
2. CDN的實現
實驗環境:
在servera作爲CDN
在所有試驗機中需要關閉火牆,selinux,NetworkManager 避免影響
[root@serverc ~]# systemctl stop NetworkManager
[root@serverc ~]# systemctl disable NetworkManager
[root@serverc ~]# systemctl stop firewalld.service
[root@serverc ~]# systemctl disable firewalld.service
[root@serverc ~]# vim /etc/sysconfig/selinux ##關閉selinux
在serverb上作爲CDN轉交請求的對象
安裝httpd
在serverc上作爲CDN轉交請求的對象
安裝httpd
在rhel7主機充當用戶訪問
2.1 varnish的安裝
Varnish是一款高性能的開源HTTP加速器
2.2 使系統與varnish匹配
1.修改varnish的啓動腳本中的端口號
vim /usr/lib/systemd/system/varnish.service
2.檢查系統允許的最大文件數和內存
注意:檢查系統允許打開的最大文件數和內存需要大於varnish中允許端最大文件數。
sysctl -a | grep file
如果系統允許的最大文件數少於varnish中的最大文件數可以通過給系統增加內存的方式。
ulimit -a
3.使系統允許varnish需要的運行內存和最大文件數
vim /etc/security/limits.conf
4.varnish的啓動
systemctl start varnish
啓動varnish
netstat -ntlp
檢查端口是否打開
2.3 varnish的配置文件
varnish的配置文件——/etc/varnish/default.vcl
[root@servera ~]# rpm -qa | grep vanish
[root@servera ~]# rpm -qa | grep varnish
varnish-6.4.0-1.el7.x86_64
[root@servera ~]# rpm -qc varnish-6.4.0-1.el7.x86_64
/etc/ld.so.conf.d/varnish-x86_64.conf
/etc/logrotate.d/varnish
/etc/varnish/default.vcl
2.4 varnish的命令行管理
varnishadm
3.CDN的功能
3.1實現CDN的反向代理功能(內容轉發)
vim /etc/varnish/default.vcl
修改CDN配置文件
# 4.0 or 4.1 syntax.
vcl 4.1;
# Default backend definition. Set this to point to your content server.
backend default {
.host = "192.168.43.20";
.port = "80";
}
systemctl restart varnish
測試:
反向代理服務器位於用戶與目標服務器之間,但是對於用戶而言,反向代理服務器就相當於目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源。同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定。反向代理服務器通常可用來作爲Web加速,即使用反向代理作爲Web服務器的前置機來降低網絡和服務器的負載,提高訪問效率。
注意:開啓varnish後有兩個進程
3.2實現CDN緩存內容
1.實現緩存功能
vim /etc/varnish/default.vcl
修改CDN配置文件
vcl 4.1;
# Default backend definition. Set this to point to your content server.
backend default {
.host = "192.168.43.20";
.port = "80";
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from CDN cache";
}
else {
set resp.http.X-Cache = "MISS from CDN cache";
}
return (deliver);
}
2.手動清理緩存
如果訪問目標更新,可以手動清除緩存
varnishadm ban req.url "~" /
清空所有緩存
varnishadm ban req.url "~" /index.html
清空發佈頁面的緩存
3.3實現CDN負載均衡的功能
1.請求不同域名(同一IP),分配不同後端
CDN(servera)把請求均分到後端(serverb和serverc)
vcl 4.1;
.host = "192.168.43.20";
.port = "80";
}
backend serverc {
.host = "192.168.43.30";
.port = "80";
}
ub vcl_recv {
if (req.http.hosts ~ "^(www.)?red.com"){
set req.http.host = "www.red.com";
set req.backend_hint = web1;
}
elsif (req.http.host ~ "^bbs.red.com"){
set req.backend_hint = web2;
}
else {
return (synth(405));
}
}
測試:
2.負載均衡,輪循請求
serverb與serverc輪循被訪問,實現負載均衡
實現負載均衡需要導入vmod_directors模塊
man vcl
可查看vcl的語法
man vmod_directors
查看模塊的導入
調度器的模塊:/usr/lib64/varnish/vmods/libvmod_directors.so
vcl 4.1;
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
backend web1 {
.host = "192.168.43.20";
.port = "80";
}
backend web2 {
.host = "192.168.43.30";
.port = "80";
}
sub vcl_init {
new lb = directors.round_robin();
lb.add_backend(web1);
lb.add_backend(web2);
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?red.com"){
set req.http.host = "www.red.com";
set req.backend_hint = lb.backend();
#return (pass);
}
elsif (req.http.host ~ "^bbs.red.com"){
set req.backend_hint = web2;
}
else {
return (synth(405));
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from CDN cache";
}
else {
set resp.http.X-Cache = "MISS from CDN cache";
}
return (deliver);
}
測試:
3.4 bansys實現CDN推送
我們在實現CDN高速緩存時有些時候通過命令等對CDN的管理有些麻煩,我們就可以使用CDN推送的方法同步後端服務內容
1.在CDN服務器安裝httpd、php
2.在bansys配置文件中設定主機並綁定
vim config.php
<?php
//varnish主機列表
//可定義多個主機列表
$var_group1 = array(
'host' => array('192.168.43.10'),
'port' => '8080',
);
//varnish羣組定義
//對主機列表進行綁定
$VAR_CLUSTER = array(
'www.red.com' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一樣
$VAR_VERSION = "3";
?>
vim /etc/httpd/conf/httpd.conf
vim /etc/varnish/default.vcl
vcl 4.1;
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
acl red {
"127.0.0.1";##本機IP
"192.168.43.0"/24; ##允許訪問的IP
}
backend web1 {
.host = "192.168.43.20";
.port = "80";
}
backend web2 {
.host = "192.168.43.30";
.port = "80";
}
sub vcl_init {
new lb = directors.round_robin();
lb.add_backend(web1);
lb.add_backend(web2);
}
sub vcl_recv {
if (req.method == "BAN"){ ##清除緩存
if(!client.ip ~ red){
return (synth(405,"Not allow"));
}
ban("req.url ~"+ req.url);
return (purge)
}
if (req.http.host ~ "^(www.)?red.com"){
set req.http.host = "www.red.com";
set req.backend_hint = lb.backend();
}
elsif (req.http.host ~ "^bbs.red.com"){
set req.backend_hint = web2;
}
else {
return (synth(405));
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from CDN cache";
}
else {
set resp.http.X-Cache = "MISS from CDN cache";
}
return (deliver);
}
測試: