Linux–varnish(一)

来源:https://www.cnblogs.com/OrochWang/archive/2018/09/07/9607305.html
-Advertisement-
Play Games

簡介Varnish 是一款高性能且開源的反向代理伺服器和 HTTP 加速器,其採用全新的軟體體系機構,和現在的硬體體繫緊密配合,與傳統的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優點; 目前最新版本是4.0.0,而3.x的版本也是可以生產環境下使用的穩定版本,但y... ...


簡介

Varnish 是一款高性能且開源的反向代理伺服器和 HTTP 加速器,其採用全新的軟體體系機構,和現在的硬體體繫緊密配合,與傳統的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優點;
目前最新版本是4.0.0,而3.x的版本也是可以生產環境下使用的穩定版本,但yum源中的2.x版本過於陳舊,不建議使用;

Varnish與Squid的對比

相同點
都是一個反向代理伺服器;
都是開源軟體;

Varnish的優勢

Varnish的穩定性很高,兩者在完成相同負荷的工作時,Squid伺服器發生故障的幾率要高於Varnish,因為使用Squid要經常重啟;
Varnish訪問速度更快,因為採用了“Visual Page Cache”技術,所有緩存數據都直接從記憶體讀取,而squid是從硬碟讀取,因而Varnish在訪問速度方面會更快;
Varnish可以支持更多的併發連接,因為Varnish的TCP連接釋放要比Squid快,因而在高併發連接情況下可以支持更多TCP連接;
Varnish可以通過管理埠,使用正則表達式批量的清除部分緩存,而Squid是做不到的;
squid屬於是單進程使用單核CPU,但Varnish是通過fork形式打開多進程來做處理,所以可以合理的使用所有核來處理相應的請求;

Varnish的劣勢

varnish進程一旦Hang、Crash或者重啟,緩存數據都會從記憶體中完全釋放,此時所有請求都會發送到後端伺服器,在高併發情況下,會給後端伺服器造成很大壓力;
在varnish使用中如果單個url的請求通過HA/F5等負載均衡,則每次請求落在不同的varnish伺服器中,造成請求都會被穿透到後端;而且同樣的請求在多台伺服器上緩存,也會造成varnish的緩存的資源浪費,造成性能下降;
Varnish劣勢的解決方案
針對劣勢一:在訪問量很大的情況下推薦使用varnish的記憶體緩存方式啟動,而且後面需要跟多台squid伺服器。主要為了防止前面的varnish服 務、伺服器被重啟的情況下,大量請求穿透varnish,這樣squid可以就擔當第二層CACHE,而且也彌補了varnish緩存在記憶體中重啟都會釋 放的問題;
針對劣勢二:可以在負載均衡上做url哈希,讓單個url請求固定請求到一臺varnish伺服器上;

架構及文件緩存的工作流程

image

程式架構:

Manager進程 管理進程

Cacher進程,包含多種類型的線程:

accept, worker, expiry, ...

shared memory log:

統計數據:計數器;

日誌區域:日誌記錄;

varnishlog, varnishncsa, varnishstat...

配置介面:VCL

Varnish Configuration Language, DSL(Domain Specific Language) 域專用語言

過程:vcl complier --> c complier --> bin shared object

VCL complier

1 轉成C語言代碼

2 編譯成C語言模塊

3 被varnish cache主進程裝載使用

varnish配置文件

varnish配置由varnishadm工具來管理port:6081:6082(Management)

HTTP請求的方法:

HTTP/1.1協議中共定義了八種方法(有時也叫“動作”),來表明Request-URL指定的資源不同的操作方式

1、OPTIONS

返回伺服器針對特定資源所支持的HTTP請求方法,也可以利用向web伺服器發送‘*’的請求來測試伺服器的功能性

2、HEAD

向伺服器索與GET請求相一致的響應,只不過響應體將不會被返回。這一方法可以再不必傳輸整個響應內容的情況下,就可以獲取包含在響應小消息頭中的元信息。

3、GET

向特定的資源發出請求。它本質就是發送一個請求來取得伺服器上的某一資源。資源通過一組HTTP頭和呈現數據(如HTML文本,或者圖片或者視頻等)返回給客戶端。GET請求中,永遠不會包含呈現數據。

4、POST

向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。 Loadrunner中對應POST請求函數:web_submit_data,web_submit_form

5、PUT

向指定資源位置上傳其最新內容

6、DELETE

請求伺服器刪除Request-URL所標識的資源

7、TRACE

回顯伺服器收到的請求,主要用於測試或診斷

8、CONNECT

HTTP/1.1協議中預留給能夠將連接改為管道方式的代理伺服器。

註意:

1)方法名稱是區分大小寫的,當某個請求所針對的資源不支持對應的請求方法的時候,伺服器應當返回狀態碼405(Mothod Not Allowed);當伺服器不認識或者不支持對應的請求方法時,應返回狀態碼501(Not Implemented)。

2)HTTP伺服器至少應該實現GET和HEAD/POST方法,其他方法都是可選的,此外除上述方法,特定的HTTP伺服器支持擴展自定義的方法。

varnish只緩存get head

image

Varnish 處理 HTTP 請求的過程如下

  1. Receive 狀態(vcl_recv):也就是請求處理的入口狀態,根據 VCL 規則判斷該請求應該 pass(vcl_pass)或是 pipe(vcl_pipe),還是進入 lookup(本地查詢);
  2. Lookup 狀態:進入該狀態後,會在 hash 表中查找數據,若找到,則進入 hit(vcl_hit)狀態,否則進入 miss(vcl_miss)狀態;
  3. Pass(vcl_pass)狀態:在此狀態下,會直接進入後端請求,即進入 fetch(vcl_fetch)狀態;
  4. Fetch(vcl_fetch)狀態:在 fetch 狀態下,對請求進行後端獲取,發送請求,獲得數據,並根據設置進行本地存儲;
  5. Deliver(vcl_deliver)狀態:將獲取到的數據發給客戶端,然後完成本次請求;

註:Varnish4中在vcl_fetch部分略有出入,已獨立為vcl_backend_fetch和vcl_backend_response2個函數;

內置函數(也叫子常式)

  • vcl_recv:用於接收和處理請求;當請求到達併成功接收後被調用,通過判斷請求的數據來決定如何處理請求;
  • vcl_pipe:此函數在進入pipe模式時被調用,用於將請求直接傳遞至後端主機,並將後端響應原樣返回客戶端;
  • vcl_pass:此函數在進入pass模式時被調用,用於將請求直接傳遞至後端主機,但後端主機的響應並不緩存直接返回客戶端;
  • vcl_hit:在執行 lookup 指令後,在緩存中找到請求的內容後將自動調用該函數;
  • vcl_miss:在執行 lookup 指令後,在緩存中沒有找到請求的內容時自動調用該方法,此函數可用於判斷是否需要從後端伺服器獲取內容;
  • vcl_hash:在vcl_recv調用後為請求創建一個hash值時,調用此函數;此hash值將作為varnish中搜索緩存對象的key;
  • vcl_purge:pruge操作執行後調用此函數,可用於構建一個響應;
  • vcl_deliver:將在緩存中找到請求的內容發送給客戶端前調用此方法;
  • vcl_backend_fetch:向後端主機發送請求前,調用此函數,可修改發往後端的請求;
  • vcl_backend_response:獲得後端主機的響應後,可調用此函數;
  • vcl_backend_error:當從後端主機獲取源文件失敗時,調用此函數;
  • vcl_init:VCL載入時調用此函數,經常用於初始化varnish模塊(VMODs)
  • vcl_fini:當所有請求都離開當前VCL,且當前VCL被棄用時,調用此函數,經常用於清理varnish模塊;

varnish程式的運行具有局部性特征:

時間局部性:一個數據被訪問過之後,可能很快會被再次訪問到;

空間局部性:一個數據被訪問時,其周邊的數據也有可能被訪問到

cache:命中

熱區:局部性;

時效性:

緩存空間耗盡:LRU,最近最少使用;

過期:緩存清理

緩存命中率:hit/(hit+miss)

(0,1)

頁面命中率:基於頁面數量進行衡量

位元組命中率:基於頁面的體積進行衡量

緩存與否:

私有數據:private,private cache;

公共數據:public, public or private cache;

Cache-related Headers Fields

The most important caching header fields are:

Expires:過期時間;

Expires:Thu, 22 Oct 2026 06:34:30 GMT

Cache-Control:max-age=

Etag

If-None-Match

Last-Modified

If-Modified-Since

Vary

Age

緩存有效性判斷機制:

過期時間:Expires

HTTP/1.0

Expires:過期

HTTP/1.1

Cache-Control: maxage=

Cache-Control: s-maxage=

條件式請求:

Last-Modified/If-Modified-Since:基於文件的修改時間戳來判別;

Etag/If-None-Match:基於文件的校驗碼來判別;

  1 Expires:Thu, 13 Aug 2026 02:05:12 GMT
  2 
  3 Cache-Control:max-age=315360000
  4 
  5 ETag:"1ec5-502264e2ae4c0"
  6 
  7 Last-Modified:Wed, 03 Sep 2014 10:00:27 GMT
  8 

緩存層級:

私有緩存:用戶代理附帶的本地緩存機制;

公共緩存:反向代理伺服器的緩存功能;

User-Agent <--> private cache <--> public cache <--> public cache 2 <--> Original Server

Cache-Control: key=value, key=value

請求報文用於通知緩存服務如何使用緩存響應請求:

  1 cache-request-directive =
  2 
  3 "no-cache", //不能直接用緩存響應
  4 
  5 | "no-store" //不能直接用緩存響應,要去遠程伺服器去取新的。 
  6 
  7 | "max-age" "=" delta-seconds
  8 
  9 | "max-stale" [ "=" delta-seconds ] //過期的緩存,最大允許過期多長時間的緩存來響應
 10 
 11 | "min-fresh" "=" delta-seconds //指示客戶機可以接收響應時間小於當前時間加上指定時間的min-fresh。
 12 
 13 | "no-transform"
 14 
 15 | "only-if-cached"
 16 
 17 | cache-extension
 18 

響應報文用於通知緩存伺服器如何存儲上級伺服器響應的內容:

  1 cache-response-directive =
  2 
  3 "public"
  4 
  5 | "private" [ "=" <"> 1#field-name <"> ]
  6 
  7 | "no-cache" [ "=" <"> 1#field-name <"> ],//可緩存,但響應給客戶端之前需要revalidation,即必鬚髮出條件式請求進行緩存有效性驗正;
  8 
  9 | "no-store" ,//不允許存儲響應內容於緩存中; 
 10 
 11 | "no-transform"
 12 
 13 | "must-revalidate"
 14 
 15 | "proxy-revalidate"
 16 
 17 | "max-age" "=" delta-seconds //私有緩存能緩存多長時間
 18 
 19 | "s-maxage" "=" delta-seconds //公共緩存能緩存多長時間
 20 
 21 | cache-extension
 22 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 公司電腦禁止,只有一個老的vs2017的安裝目錄(之前通過 --layout 安裝時生成的離線文件)。找了一圈百度,沒能解決問題,最後,問bing,查微軟的官方網站命令,最後得到的結論相當簡單: ...
  • abstract as base bool break byte case catch char checked decimal default delegate continue double do else enum ecent explicit finally fixed float for ...
  • C# 運算符重載 您可以重定義或重載 C# 中內置的運算符。因此,程式員也可以使用用戶自定義類型的運算符。重載運算符是具有特殊名稱的函數,是通過關鍵字 operator後跟運算符的符號來定義的。與其他函數一樣,重載運算符有返回類型和參數列表。 例如,請看下麵的函數: public static Bo ...
  • 低版本IE6/7/8/9瀏覽器沒有定義console對象,所以代碼會中斷執行。自己測試,ie11也沒有(打開控制台的情況下可以用) 可以用如下代碼完美解決。 ...
  • C# 多態性 多態性意味著有多重形式。在面向對象編程範式中,多態性往往表現為"一個介面,多個功能"。 多態性可以是靜態的或動態的。在靜態多態性中,函數的響應是在編譯時發生的。在動態多態性中,函數的響應是在運行時發生的。 多態性意味著有多重形式。在面向對象編程範式中,多態性往往表現為"一個介面,多個功 ...
  • 一、Quartz.Net介紹 Quartz.NET是一個開源的作業調度框架,非常適合在平時的工作中,定時輪詢資料庫同步,定時郵件通知,定時處理數據等。 Quartz.NET允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關係,還能把多個作業與不同的觸發器關聯。整合了 Quar ...
  • 在前段時間,接觸一個很喜歡釘釘並且已在內部場景廣泛使用釘釘進行工廠內部管理的客戶,如釘釘考勤、日常審批、釘釘投影、釘釘門禁等等方面,才體會到原來釘釘已經已經在企業上可以用的很廣泛的,因此回過頭來學習研究下釘釘的一些業務範圍和其SDK的開發工作。釘釘官方的SDK提供了很多方面的封裝,不過相對於Java... ...
  • [TOC]### 操作系統理論####站在馮諾依曼角度,理解操作系統定位管理和控制電腦硬體與軟體資源的電腦程式馮諾伊曼(存儲程式原理)1. 馮諾伊曼體系的存儲器指的是記憶體2. 不考慮緩存的情況,CPU只能對記憶體進行操作,不能訪問外設(輸入或輸出設備)3. 外設(輸入輸出設備)如果想輸入輸出數據也... ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...