




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、簡介Varnish 是一款高性能且開源的反向代理服務器和 HTTP 加速器,其采用全新的軟件體系機構,和現在的硬件體系緊密配合,與傳統的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優點;目前最新版本是4.0.0,而3.x的版本也是可以生產環境下使用的穩定版本,但yum源中的2.x版本過于陳舊,不建議使用;Varnish與Squid的對比相同點· 都是一個反向代理服務器;· 都是開源軟件;Varnish的優勢· Varnish的穩定性很高,兩者在完成相同負荷的工作時,Squid服務器發生故障的幾率要高于Varnish,因為使用Squ
2、id要經常重啟;· Varnish訪問速度更快,因為采用了“Visual Page Cache”技術,所有緩存數據都直接從內存讀取,而squid是從硬盤讀取,因而Varnish在訪問速度方面會更快;· Varnish可以支持更多的并發連接,因為Varnish的TCP連接釋放要比Squid快,因而在高并發連接情況下可以支持更多TCP連接;· Varnish可以通過管理端口,使用正則表達式批量的清除部分緩存,而Squid是做不到的;· squid屬于是單進程使用單核CPU,但Varnish是通過fork形式打開多進程來做處理,所以可以合理的使用所有核來處理相
3、應的請求;Varnish的劣勢· varnish進程一旦Hang、Crash或者重啟,緩存數據都會從內存中完全釋放,此時所有請求都會發送到后端服務器,在高并發情況下,會給后端服務器造成很大壓力;· 在varnish使用中如果單個url的請求通過HA/F5等負載均衡,則每次請求落在不同的varnish服務器中,造成請求都會被穿透到后端;而且同樣的請求在多臺服務器上緩存,也會造成varnish的緩存的資源浪費,造成性能下降;Varnish劣勢的解決方案· 針 對劣勢一:在訪問量很大的情況下推薦使用varnish的內存緩存方式啟動,而且后面需要跟多臺squid服務器。主
4、要為了防止前面的varnish服 務、服務器被重啟的情況下,大量請求穿透varnish,這樣squid可以就擔當第二層CACHE,而且也彌補了varnish緩存在內存中重啟都會釋 放的問題;· 針對劣勢二:可以在負載均衡上做url哈希,讓單個url請求固定請求到一臺varnish服務器上;對比Varnish 3.x的主要改進· 完全支持流對象;· 可后臺獲取失效的對象,即Client/backend分離;· 新的vanishlog查詢語言,允許對請求進行自動分組;· 復雜的請求時間戳和字節計數;· 安全方面的提升;涉及VCL語法的改變
5、點· vcl配置文件需明確指定版本:即在vcl文件的第一行寫上 vcl 4.0;· vcl_fetch函數被vcl_backend_response代替,且req.*不再適用vcl_backend_response;· 后端源服務器組director成為varnish模塊,需import directors后再在vcl_init子例程中定義;· 自定義的子例程(即一個sub)不能以vcl_開頭,調用使用call sub_name;· error()函數被synth()替代;· return(lookup)被return(hash)替代
6、;· 使用beresp.uncacheable創建hit_for_pss對象;· 變量req.backend.healty被std.healthy(req.backend)替代;· 變量req.backend被req.backend_hint替代;· 關鍵字remove被unset替代;詳見: /docs/4.0/whats-new/index.html#whats-new-index架構及文件緩存的工作流程· Varnish 分為 master 進程和 child 進程;
7、83; Master 進程讀入存儲配置文件,調用合適的存儲類型,然后創建 / 讀入相應大小的緩存文件,接著 master 初始化管理該存儲空間的結構體,然后 fork 并監控 child 進程;· Child 進程在主線程的初始化的過程中,將前面打開的存儲文件整個 mmap 到內存中,此時創建并初始化空閑結構體,掛到存儲管理結構體,以待分配;· 對外管理接口分為3種,分別是命令行接口、Telnet接口和Web接口;· 同時在運行過程中修改的配置,可以由VCL編譯器編譯成C語言,并組織成共享對象(Shared Object)交由Child進程加載使用;Child 進
8、程分配若干線程進行工作,主要包括一些管理線程和很多 worker 線程,可分為:· Accept線程:接受請求,將請求掛在overflow隊列上;· Work線程:有多個,負責從overflow隊列上摘除請求,對請求進行處理,直到完成,然后處理下一個請求;· Epoll線程:一個請求處理稱為一個session,在session周期內,處理完請求后,會交給Epoll處理,監聽是否還有事件發生;· Expire線程:對于緩存的object,根據過期時間,組織成二叉堆,該線程周期檢查該堆的根,處理過期的文件,對過期的數據進行刪除或重取操作;HTTP請求基本處理
9、流程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 狀態
10、下,對請求進行后端獲取,發送請求,獲得數據,并根據設置進行本地存儲;5. Deliver(vcl_deliver)狀態:將獲取到的數據發給客戶端,然后完成本次請求;注:Varnish4中在vcl_fetch部分略有出入,已獨立為vcl_backend_fetch和vcl_backend_response2個函數;內置函數(也叫子例程)· vcl_recv:用于接收和處理請求;當請求到達并成功接收后被調用,通過判斷請求的數據來決定如何處理請求;· vcl_pipe:此函數在進入pipe模式時被調用,用于將請求直接傳遞至后端主機,并將后端響應原樣返回客戶端;· vcl
11、_pass:此函數在進入pass模式時被調用,用于將請求直接傳遞至后端主機,但后端主機的響應并不緩存直接返回客戶端;· vcl_hit:在執行 lookup 指令后,在緩存中找到請求的內容后將自動調用該函數;· vcl_miss:在執行 lookup 指令后,在緩存中沒有找到請求的內容時自動調用該方法,此函數可用于判斷是否需要從后端服務器獲取內容;· vcl_hash:在vcl_recv調用后為請求創建一個hash值時,調用此函數;此hash值將作為varnish中搜索緩存對象的key;· vcl_purge:pruge操作執行后調用此函數,可用于構建一
12、個響應;· vcl_deliver:將在緩存中找到請求的內容發送給客戶端前調用此方法;· vcl_backend_fetch:向后端主機發送請求前,調用此函數,可修改發往后端的請求;· vcl_backend_response:獲得后端主機的響應后,可調用此函數;· vcl_backend_error:當從后端主機獲取源文件失敗時,調用此函數;· vcl_init:VCL加載時調用此函數,經常用于初始化varnish模塊(VMODs)· vcl_fini:當所有請求都離開當前VCL,且當前VCL被棄用時,調用此函數,經常用于清理var
13、nish模塊;VCL中內置公共變量變量(也叫object)適用范圍注:某些地方略有出入,詳細可參考官方文檔;變量類型詳解· req:The request object,請求到達時可用的變量· bereq:The backend request object,向后端主機請求時可用的變量· beresp:The backend response object,從后端主機獲取內容時可用的變量· resp:The HTTP response object,對客戶端響應時可用的變量· obj:存儲在內存中時對象屬性相關的可用的變量具體變量詳見:
14、0;/docs/4.0/reference/vcl.html#reference-vcl優雅模式(Garce mode)Varnish中的請求合并當幾個客戶端請求同一個頁面的時候,varnish只發送一個請求到后端服務器,然后讓其他幾個請求掛起并等待返回結果;獲得結果后,其它請求再復制后端的結果發送給客戶端;但如果同時有數以千計的請求,那么這個等待隊列將變得龐大,這將導致2類潛在問題:· 驚群問題(thundering herd problem),即突然釋放大量的線程去復制后端返回的結果,將導致負載急速上升;· 沒有用
15、戶喜歡等待;故為了解決這類問題,可以配置varnish在緩存對象因超時失效后再保留一段時間,以給那些等待的請求返回過去的文件內容(stale content),配置案例如下:sub vcl_recv if (! req.backend.healthy) set req.grace = 5m; else set req.grace = 15s;sub vcl_fetch set beresp.grace = 30m;# 以上配置表示varnish將會將失效的緩存對象再多保留30分鐘,此值等于最大的req.grace值即可;# 而根據后端主機的健康狀況,varnish可向前端請求分別提供5分鐘內或
16、15秒內的過期內容安裝配置# 安裝包下載地址:/redhat/varnish-4.0/el6/yum localinstall -nogpgcheck varnish-4.0.0-1.el6.x86_64.rpm varnish-libs-4.0.0-1.el6.x86_64.rpm varnish-docs-4.0.0-1.el6.x86_64.rpmvi /etc/sysconfig/varnish # 編輯配置文件,修改如下項VARNISH_STORAGE_SIZE=100M # 此值根據自身情況調整,測試環境可調低此值VARNIS
17、H_STORAGE="malloc,$VARNISH_STORAGE_SIZE" # Varnish 4中默認使用malloc(即內存)作為緩存對象存儲方式;service varnish start # 啟動varnish,默認外部請求的監聽端口6081,管理端口6082,后端主機:80=varnishadm -S /etc/varnish/secret -T :6082 # 登錄管理命令行varnish> vcl.list # 列出所有的配置varnish> vcl.load test1 test.vcl # 加載編譯新配
18、置,test1是配置名,test.vcl是配置文件varnish> vcl.use test1 # 使用配置,需指定配置名,當前使用的配置以最后一次vcl.use為準varnish> vcl.show test1 # 顯示配置內容,需指定配置名實例解析# This is an example VCL file for Varnish.# It does not do anything by default, delegating control to the# builtin VCL. The builtin VCL is called when there is no expli
19、cit# return statement.# See the VCL chapters in the Users Guide at /docs/# and /trac/wiki/VCLExamples for more examples.# Marker to tell the VCL compiler that this VCL has been adapted to the# new 4.0 format.vcl 4.0;import directors;probe backend_he
20、althcheck # 創建健康監測 .url = /health.html; .window = 5; .threshold = 2; .interval = 3s;backend web1 # 創建后端主機 .host = "" .port = "80" .probe = backend_healthcheck;backend web2 .host = "" .port = "80" .probe = backend_healthcheck;backend img1 .host = "" .
21、port = "80" .probe = backend_healthcheck;backend img2 .host = "" .port = "80" .probe = backend_healthcheck;vcl_init # 創建后端主機組,即directors new web_cluster = directors.random(); web_cluster.add_backend(web1); web_cluster.add_backend(web2); new img_cluster = directors.rando
22、m(); img_cluster.add_backend(img1); img_cluster.add_backend(img2);acl purgers # 定義可訪問來源IP "" ""/24;sub vcl_recv if (req.request = "GET" && req.http.cookie) # 帶cookie首部的GET請求也緩存 return(hash); if (req.url "test.html") # test.html文件禁止緩
23、存 return(pass); if (req.request = "PURGE") # PURGE請求的處理 if (!client.ip purgers) return(synth(405,"Method not allowed"); return(hash); if (req.http.X-Forward-For) # 為發往后端主機的請求添加X-Forward-For首部 set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip; else set req.http.X-Forward-For = client.ip; if (req.http.host "(?i)(www.)?$") # 根據不同的訪問域名,分發至不同的后端主機組 set req.http.host = "" set req.backend_hint = web_cluster.backend(); elsif (req.http.host "(?i)$") set req.backend_hint = img_cluster
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度跨境材料運輸合同模板參考
- 二零二五年度廠房租賃合同拆遷補償及環境保護責任范本
- 二零二五年度智慧停車場建設包清工承包合同范本
- 二零二五年賓館客房窗簾軌維修裝修合同書
- 二零二五年度水管安裝工程材料采購合同示范
- 農產品采購制度及流程
- 農業遙感技術應用授權合同
- 湖南長沙廣益中學2024年物理八年級第一學期期末學業質量監測試題含解析
- 甘肅省武威五中學2024年化學九年級第一學期期末聯考模擬試題含解析
- 海洋生物養殖合同書
- 全新退換貨協議模板
- 危重患者的早期識別與處理
- (正式版)JBT 14449-2024 起重機械焊接工藝評定
- 商務禮儀之座次及用餐
- SEO谷歌推廣方案
- 注塑標準成型條件表電子表格模板
- 企業數字化管理
- 道閘系統施工方案
- DB41-T 2563-2023 新生兒臍靜脈導管維護技術操作規范
- 配置管理與漏洞修復
- 新版中國復發難治性急性髓系白血病診療指南
評論
0/150
提交評論