企業CDN緩存系統--varnish

企業CDN緩存系統–varnish

1.CDN工作原理及varnish的基本概念

  1. CDN緩存系統
    CDN:content distribute network(內容分發網絡)或者content delivery network(內容交付網絡)。CDN的任務是將內容從源站傳遞給用戶。
人們常這樣說,互聯網由兩層組成:一層是以TCP/IP爲代表的網絡層(狹義的互聯網internet),另一層是以www爲代表的應用層。
過各種網絡設備,實現各個計算機之間的互聯互通,實現各種信息數據的低成本傳輸。
舉個簡單例子來區分而這之間的差異:internet就是鐵路軌道和各種信號燈,而www則是運行在internet上的衆多火車中的一種。
  1. CDN的工作原理
無cdn時,用戶通過瀏覽器訪問網站的過程
1.用戶在瀏覽器輸入URL
2.瀏覽器向本地DNS請求域名解析
3.如果本地DNS緩存有該域名的解析結果,則直接將解析結果返回給瀏覽器
4.如果本地DNS緩存中無該域名的解析結果,則以遞歸方式向整個DNS系統請求域名解析,在獲得應答後將解析結果返回給瀏覽器
5.瀏覽器獲得解析結果,提取出IP信息,使用IP向服務器請求數據
6.服務器返回數據給瀏覽器

有cdn時,用戶通過瀏覽器訪問網站的過程
1.用戶在瀏覽器中輸入URL
2.瀏覽器向本地DNS請求域名解析,DNS會將域名解析權轉交給CNAME指向的CDN專用的DNS服務器
3.CDN專用的DNS服務器將CDN的全局負載均衡設備的IP返回給瀏覽器
4.瀏覽器向CDN全局負載均衡設備發起URL請求
5.CDN全局負載均衡設備根據請求的URL和用戶的IP地址,將用戶請求轉發到用戶所在區域的區域負載均衡設備
6.區域負載均衡設備,根據用戶IP、請求URL、緩存服務器的負載情況等,返回一臺合適的服務器IP給用戶
7.用戶向緩存服務器發起請求
8.緩存服務器響應用戶請求,如果用戶請求的內容緩存服務器上不存在,則緩存服務器要向上一級緩存服務器請求內容,直到追溯到網站的源服務器
  1. varnish的基本概念
    什麼是varnish?
varnish是一個反向HTTP代理,有時稱爲HTTP加速器或web加速器
varnish將文件或文件片段儲存在內存中,使他們能夠快速被提供
varnish本質上是一個鍵/值存儲,它通常使用url作爲鍵
varnish是爲現代硬件、現在操作系統和現代工作負載而設計的

varnish加速器與Squid加速器的對比

Squid加速器(代理緩存服務器)是將從服務器要回來的資源放在自己的硬盤裏,客戶讀取的速率很慢,代理的效率低
varnish加速器(代理緩存服務器)是將從服務器要回來的資源放在自己的內存裏,客戶讀取的速率很快,代理的效率高

varnish代理服務器的工作方式

僅僅作爲一個代理服務器:幫客戶端去問服務端要數據,要回來的數據直接給客戶端自己不緩存一份,這種情況是客戶的隱私信息、熱點信息、更新比較快的數據,不緩存,只代理。
既代理又緩存:幫客戶端去問服務端要數據,要回來的數據先給自己緩存一份,然後再發給客戶端,這種情況是用於更新比較慢的數據,此時varnish既代理又緩存。

爲什麼要使用varnish加速緩存代理服務器?

舉個例子:全國有許多用戶都在使用淘寶網購,而阿里的服務器總部在杭州。
全國許多用戶都在使用淘寶時,會對瀏覽器造成很大的訪問壓力,甚至會造成服務器癱瘓。
現在阿里總部給每個地區都放varnish代理服務器,每個地區的用戶想訪問淘寶資源的時候,都會間接去問自己地區的varnish代理服務器要資源。
如果varnish代理服務器上面沒有資源,此時varnish代理服務器就會去向杭州的服務器要資源,將要回來的資源視情況而定給自己緩存一份,然後再給客戶端發一份。
這種情況下,varnish代理服務器的數量遠遠少於淘寶用戶的數量,即使所有的varnish代理服務器同時向杭州總部的服務器要資源的時候,也不會給總部的服務器造成很大的壓力,用戶的瀏覽速度也不會因爲人數太多而卡頓。
假如代理服務器緩存了一些更新過的數據,當客戶端再次要這個數據的時候,代理服務器會直接返回給客戶端,不需要再去問總部的服務器要資源。
這就是把varnish服務器叫做加速器的原因,加快了客戶端和服務端之間的訪問速率。

varnish加速器的工作流程
Varnish啓動會產生master主(management)進程和child子(worker ,主要做cache的工作)進程。

作用:
master進程讀入(更新)配置,vcl文件編譯,varnish監控,初始化varnish及提供varnish管理接口。
child進程分配若干線程進行工作,主要包括一些管理線程和很多worker線程。
在這裏插入圖片描述

注意:Manegement進程每隔幾秒探測以下child進程以判斷其是否正常運行,如果在指定的時長內未得到child進程的迴應,management將會重啓此child進程。

具體流程:

針對文件緩存部分,master讀入存儲配置,調用合適的存儲類型,然後創建/讀入相應大小的緩存大文件。
接着,master初始化管理該存儲空間的結構體。這些變量都是全局變量,在fork以後會被child進程所繼承(包括文件描述符)。
在child進程主線程初始化過程中,將前面打開的存儲大文件整個mmap到內存中(如果超出系統的虛擬內存,mmap失敗,進程會減少原來的配置mmap大小,然後繼續mmap)
此時創建並初始化空閒存儲結構體,掛到存儲管理結構體,以待分配。
接着,真正的工作開始,Varnish的某個負責接受新HTTP連接的線程開始等待用戶,如果有新的HTTP連接過來,它總負責接收,
然後叫醒某個等待中的線程,並把具體的處理過程交給它。Worker線程讀入HTTP請求的URI,查找已有的object,
如果命中則直接返回並回複用戶。如果沒有命中,則需要將所請求的內容,從後端服務器中取過來,存到緩存中,然後再回復。

分配緩存的過程:

varnish根據所讀到object的大小,創建相應大小的緩存文件。
爲了讀寫方便,程序會把每個object的大小變爲最接近其大小的內存頁面倍數。
然後從現有的空閒存儲結構體中查找,找到最合適的大小的空閒存儲塊,分配給它。
如果空閒塊沒有用完,就把多餘的內存另外組成一個空閒存儲塊,掛到管理結構體上。
如果緩存已滿,就根據LRU機制,把最舊的object釋放掉。釋放緩存的過程是這樣的:有一個超時線程,檢測緩存中所有object的生存期。
如果超初設定的TTL(Time To Live)沒有被訪問,就刪除它,並且釋放相應的結構體及存儲內存。(釋放時會檢查該存儲內存塊前面或後面的空閒內存塊。如果前面或後面的空閒內存和該釋放內存是連續的,就將它們合併成更大一塊內存。)
整個文件緩存的管理,沒有考慮文件與內存的關係,實際上是將所有的object都考慮是在內存中, 如果系統內存不足,系統會自動將其換到swap空間,而不需要varnish程序去控制。

2.varnish的部署

實驗環境:
首先創建一個封裝好的rhel7的虛擬機,最小化安裝,因爲我們要對封裝好的虛擬機進行克隆,此實驗我們需要三臺虛擬機,最小化安裝就可以避免負載過大

封裝虛擬機注意事項:
我們在創建封裝好的最小化虛擬機的時候需要:
1.配置網卡
在配置的時候用ip addr show 去看我們的網卡名稱,如果是eth0就不需要修改,直接配置網卡信息即可
如果用ip addr show顯示網卡,我們的網卡名稱不是eth0時,我們要對其修改,修改爲eth0,
首先編輯文件/boot/grub2/grub.cfg

在文件100行utf-8 後面加上 net.ifnames=0,修改之後保存,重啓虛擬機,我們就可以看到網卡名稱爲eth0。然後配置網卡信息就可以了。

vim /boot/grub2/grub.cfg

在這裏插入圖片描述
2.配置yum源
3.關閉NetworkManager,防火牆,SELINUX,添加相應的解析
4.安裝常用的軟件 vim ,bash-*,net-tools,lftp等
5.關機,然後就不要啓動此臺虛擬機了,克隆出我們實驗需要的三臺虛擬機server1,server2,server3

下面就進入我們varnish的部署環節了

  1. 安裝varnish服務
    注意:在這裏我使用server1作爲varnish代理服務器。
    第一步我們需要獲取varnish的安裝包,這個我們可以在官網上下載。
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    我們發現,安裝過程中出現了報錯。
    注意:varnish還需要一個解決依賴性的安裝 jemalloc3.6.01.el7.x86_64.rpm,這個安裝包可以在pkgs.org網站中獲取下載。

安裝:
在這裏插入圖片描述
在這裏插入圖片描述
查看varnish服務的基本配置信息:
在這裏插入圖片描述
主配置文件爲:

/etc/varnish/default.vcl

注意:
爲了使varnish性能更優,我們需要對相關參數進行修改。

查看varnish服務的基本參數:

varnish服務的啓動腳本: /usr/lib/systemd/system/varnish.service
在這裏插入圖片描述
查看系統允許開啓文件的最大個數

在這裏插入圖片描述
可以看出,開啓文件的最大個數滿足varnish

查看系統的內存大小
在這裏插入圖片描述
系統的內存大小爲64,不滿足,所以我們要進行修改

在系統參數限制文件/etc/security/limits.conf中
寫入限制信息:

在這裏插入圖片描述
修改端口:

vim /usr/lib/systemd/system/varnish.service

在這裏插入圖片描述

在varnish主機中設置後端服務器的ip和端口
也就是說在訪問varnish時,把請求轉交給server2
在這裏插入圖片描述
server2中:
查看是否有80端口
在這裏插入圖片描述
發現沒有,那我們來安裝一個

1. yum install httpd -y
2. echo hello world > /var/www/html/index.html
3. systemctl start httpd   這是我們就可以看到80端口

最後重啓varnish,進行測試
在瀏覽器中訪問有varnish的server1時 ,varnish後端給我們反饋的信息其實是server2的,但是我們作爲客戶端是不知道的,這就體現了反向代理。
在這裏插入圖片描述

3.varnish-----清理緩存

1.緩存
varnish本身就是一個緩存系統,但如果有些東西不常用,我們需要清理對應的緩存。
首先通過實驗瞭解什麼是varnish的緩存:

在server1中:

vim /etc/varnish/default.vcl
systemctl restart varnish

查看緩存命中情況:沒有緩存時第一次連接會顯示MISS,有緩存時連接它會顯示HIT。
在這裏插入圖片描述
測試:
清理緩存之前:
第一次連接時會顯示MISS,後面的每次連接都會顯示HIT
在這裏插入圖片描述
在這裏插入圖片描述
那麼,怎樣來清理緩存呢?

2.命令清理緩存

varnish默認清理緩存時間爲120秒,但是我們可以手動清理緩存。
varnishadm ban req.url "~" /				#清除全部緩存
varnishadm ban req.url "~" /index.html		#清除指定頁面的緩存

在這裏插入圖片描述
測試:
在這裏插入圖片描述
3.圖形化清理緩存

CDN推送平臺:
1.解壓推送平臺的安裝包:

yum install php unzip httpd -y		#安裝需要用到的軟件包
unzip bansys.zip					#解壓
mv ./bansys/* /var/www/html         

2.修改apache使用的端口:
因爲apache本來使用的80端口被varnish服務佔了,所以需要修改
所以在server1中:
vim /etc/httpd/conf/httpd.conf
在這裏插入圖片描述

3.修改config.php
在這裏插入圖片描述
在這裏插入圖片描述
4.修改varnish配置文件

vim /etc/varnish/default.vcl
systemctl restart varnish    重啓之後沒有問題就說明配置沒有問題

在這裏插入圖片描述
5.修改本地解析
在這裏插入圖片描述
測試:
在這裏插入圖片描述
在這裏插入圖片描述

4.varnish-----多臺後端服務器

1.搭建多個web後端
目的:多個後端服務器可以減少服務器的壓力,可以使多個用戶同時使用時更加流暢。
在這裏我們打開server3作爲第二臺後端服務器

1.yum install httpd -y
2.echo 你好,我是server3 > /var/www/html/index.html
3.systemctl start httpd

2.在varnish代理服務器中配置

在裝有varnish的主機中:
編輯主配置文件: vim /etc/varnish/default.vcl

在這裏插入圖片描述
3.定義不同域名站點的後端服務器

爲什麼呢?
因爲我們在訪問網站時很少使用ip地址來訪問,因爲IP不容易記憶,所以通常我們都使用它的域名去訪問。
在這裏插入圖片描述
4.寫入本地解析&測試

在客戶主機中添加解析:
在這裏插入圖片描述
測試:
在這裏插入圖片描述

5.varnish-----負載均衡(輪詢)

1.負載均衡
如果用戶使用率較高時,我們可以指定一個後端服務器工作一次,就換另一個服務器,兩個服務器輪流工作,會減小服務器的壓力,也就是輪詢。
2.配置apache虛擬主機
在server3中:

vim /etc/httpd/conf.d/vhost.conf

<VirtualHost *:80>
        DocumentRoot /www
        ServerName www.westos.org
</VirtualHost>
<Directory "/www">
        Require all granted
</Directory>


<VirtualHost *:80>
        DocumentRoot /bbs
        ServerName bbs.westos.org
</VirtualHost>
<Directory "/bbs">
        Require all granted
</Directory>

在這裏插入圖片描述
在這裏插入圖片描述
3.配置代理服務器varnish

定義負載均衡:

在server1中:
vim /etc/varnish/default.vcl

backend web1 {
    .host = "192.168.43.72";
    .port = "80";
}
backend web2 {
    .host = "192.168.43.73";
    .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.)?westos.org") {
                set req.http.host="www.westos.org";
                set req.backend_hint = lb.backend();
                return (pass);
        }
        elseif (req.http.host ~ "^bbs.westos.org") {
                set req.backend_hint = web2;
        }
        else {
                return (synth(405));
        }
}




導入重要模塊:
這個模塊一定要導入,不然會報錯!
在vcl 4.1下面一行寫入:
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";

在這裏插入圖片描述
在這裏插入圖片描述
4.測試
在這裏插入圖片描述

可以看到訪問www.westos.org時,一次使用後端服務器server2,一次使用後端服務器server3,這就是輪詢的效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章