【Varnish】:解決 Varnish 7.6 CDN 靜態資源緩存失效問題

項目場景:

在一個使用Varnish作為反向代理的Web應用中,我們依賴CDN(內容分發網絡)來緩存靜態資源(如圖片、CSS、JavaScript文件等),以提高全球用戶的訪問速度并減輕源站服務器的負載。然而,在實際運行中,我們遇到了一個問題:CDN緩存的靜態資源全部一直回源,導致源站服務器負載過高,響應時間延長,用戶體驗下降。

問題描述:

癥狀表現

  • 高源站流量: 監控數據顯示源站接收到大量本應由CDN處理的請求。
  • 低緩存命中率: CDN平臺中顯示靜態資源的緩存命中率遠低于預期。
  • 響應時間延長: 用戶體驗到比預期更長的頁面加載時間。
  • Via 頭部異常: 在響應頭中發現了額外的 Via 信息,例如 1.1 yjcm-varnish-0 (Varnish/7.6), cache14.l2et135-6[2,0],這可能是導致CDN失效的原因之一。

產生影響

這些癥狀直接影響了用戶體驗和網站性能,增加了服務器負載,當時LB帶寬幾乎要達到上限。隨著系統響應時間逐漸變慢,用戶體驗急劇下降。因此,解決這個問題對于提升網站的整體性能至關重要。

原因分析:

經過詳細的日志分析和技術排查,我們確定以下因素可能導致了上述問題:

1. Via 頭部的影響:

  • 標準的 Via 響應頭用于標識請求經過的代理服務器鏈。如果Varnish保留或添加了這個頭部,某些CDN可能會誤判請求路徑,進而影響緩存決策。
  • 特別是當 Via 頭部包含多個代理服務器的信息時,可能會使CDN認為每個請求都是唯一的,從而阻止了緩存的有效利用。

2. 自定義VCL邏輯:

  • 如果Varnish配置中有特定的邏輯來決定何時緩存內容或如何處理請求,這些邏輯可能會與CDN的預期行為相沖突,導致緩存策略不再適用。

3. Cookie處理:

  • 默認情況下,如果請求包含 Cookie 頭部,Varnish通常不會緩存該請求。這可能導致靜態資源因為會話信息而被視為獨特的,從而繞過了緩存。

4. 緩存控制頭部不一致:

  • Varnish可能修改了來自后端服務器或CDN的關鍵HTTP頭部信息(如 Cache-Control, Expires),導致CDN認為這些資源不應該被緩存。

解決方案:

為了解決這些問題,我們采取了一系列措施,確保Varnish與CDN之間順暢協作,最大化緩存效率并提升整體網站性能。同時,我們也針對系統性能進行了優化,以改善響應時間。

1. 修改 vcl_deliver 子程序

通過調整 vcl_deliver 子程序,可以實現更清晰的緩存狀態指示,并避免不必要的頭部沖突:

# 交付子程序 (vcl_deliver)
sub vcl_deliver {# 顯示緩存命中/未命中信息# 這個邏輯用于在響應頭中添加一個自定義的頭部 X-Varnish-Cache,# 以便后續可以通過這個頭部判斷請求是否被緩存命中。if (obj.hits > 0) {set resp.http.X-Varnish-Cache = "hit";  # 如果緩存命中(即該對象已被緩存并再次訪問),則設置 X-Varnish-Cache 為 hit} else {set resp.http.X-Varnish-Cache = "miss";  # 如果緩存未命中(即該對象是第一次訪問或緩存已過期),則設置 X-Varnish-Cache 為 miss}# 將 Via 頭的內容復制到 X-Varnish-Via 頭# Via 是一個標準的HTTP頭部,用來標識請求經過的代理服務器鏈。# 為了避免影響CDN對緩存決策的理解,我們將原始的 Via 頭內容復制到一個新的頭部 X-Varnish-Via,# 并刪除原來的 Via 頭,確保CDN不會因為額外的代理信息而誤判請求路徑。if (resp.http.Via) {set resp.http.X-Varnish-Via = resp.http.Via;  # 將原始 Via 頭內容復制到新的 X-Varnish-Via 頭unset resp.http.Via;  # 刪除原來的 Via 頭,避免干擾CDN的緩存決策}
}

解釋:

  • 顯示緩存狀態: 通過添加 X-Varnish-Cache 響應頭,提供了關于緩存命中的明確指示,這對于調試和理解緩存行為非常有用。
  • 清理 Via 頭: Via 頭通常用于標識請求經過的代理服務器鏈。將其內容復制到 X-Varnish-Via 并刪除原始 Via 頭,可以幫助減少混淆,并確保CDN能夠正確解析響應。

2. 同步緩存控制頭部

確保Varnish不會覆蓋或修改來自后端服務器或CDN的關鍵緩存控制頭部,如 Cache-Control 和 Expires。可以通過以下方式同步這些頭部:

sub vcl_backend_response {# 同步 Cache-Control 和 Expires 頭部if (beresp.http.Cache-Control && beresp.http.Expires) {set beresp.http.Cache-Control = beresp.http.Cache-Control;set beresp.http.Expires = beresp.http.Expires;}
}

3. 確保緩存一致性

確保Varnish和CDN之間的緩存策略一致,特別是對于靜態資源的緩存控制頭部:

  • 標準化響應頭部: 保持所有響應頭部的一致性,有助于維持整個系統的穩定性和性能。
  • 檢查緩存標簽: 確認Varnish和CDN都支持并正確處理緩存標簽(如 ETag, Last-Modified)。

4. 測試與驗證

  • 測試清除效果: 在非生產環境中進行更改前,先在一個小范圍內測試,確保不會對用戶體驗產生負面影響。
  • 監控性能變化: 使用性能監控工具來跟蹤實施更改后的性能指標,確保問題得到解決且沒有引入新的問題。

結論

通過精心調整Varnish配置并遵循最佳實踐,我們可以確保Varnish與CDN之間順暢協作,最大化緩存效率并提升整體網站性能。希望這篇文章能為你和其他開發者提供有價值的參考,幫助解決類似的緩存失效問題。如果有更多復雜的需求或疑問,建議參考官方文檔或尋求專業支持。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66025.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66025.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

理解機器學習中的參數和超參數

在機器學習中,參數和超參數是兩個重要但不同的概念,它們共同影響模型的性能和表現。以下是它們的定義和區別,以及如何通俗地理解它們: 1. 參數 定義 參數是模型在訓練過程中自動學習到的變量,它們直接決定了模型如何…

Win11右鍵菜單實現

主要參考Win11 Context Menu Demo 此工程是vs2022編譯,vs2019先修改下 base.h 方可編譯過 編譯好dll以后 拷貝至SparsePackage目錄下 生成稀疏包msix 就拿他工程里面的改,編輯AppxManifest.xml,配置都要對,一個不對可能都失敗&a…

R.swift庫的詳細用法

R.swift 是一個 Swift 工具庫,它提供了一個自動生成的類 R,使得你可以通過類型安全的方式訪問項目中的資源,例如圖片、字體、顏色、XIB 文件等。通過 R.swift,你可以避免字符串類型的錯誤,提升代碼的可維護性。 以下是 R.swift 庫的詳細用法: 1. 安裝 R.swift 使用 Sw…

像JSONDecodeError: Extra data: line 2 column 1 (char 134)這樣的問題怎么解決

問題介紹 今天處理返回的 JSON 的時候,出現了下面這樣的問題: 處理這種問題的時候,首先你要看一下當前的字符串格式是啥樣的,比如我查看后發現是下面這樣的: 會發現這個字符串中間沒有逗號,也就是此時的J…

what?ngify 比 axios 更好用,更強大?

文章目錄 前言一、什么是ngify?二、npm安裝三、發起請求3.1 獲取 JSON 數據3.2 獲取其他類型的數據3.3 改變服務器狀態3.4 設置 URL 參數3.5 設置請求標頭3.6 與服務器響應事件交互3.7 接收原始進度事件3.8 處理請求失敗3.9 Http Observables 四、更換 HTTP 請求實現…

Linux Kernel 之十 詳解 PREEMPT_RT、Xenomai 的架構、源碼、構建及使用

概述 現在的 RTOS 基本可以分為 Linux 陣營和非 Linux 陣營這兩大陣營。非 Linux 陣營的各大 RTOS 都是獨立發展,使用上也相對獨立;而 Linux 陣營則有多種不同的實現方法來改造 Linux 以實現實時性要求。本文我們重點關注 Linux 陣營的實時內核實現方法! 本文我們重點關注 …

【拒絕算法PUA】3065. 超過閾值的最少操作數 I

系列文章目錄 【拒絕算法PUA】0x00-位運算 【拒絕算法PUA】0x01- 區間比較技巧 【拒絕算法PUA】0x02- 區間合并技巧 【拒絕算法PUA】0x03 - LeetCode 排序類型刷題 【拒絕算法PUA】LeetCode每日一題系列刷題匯總-2025年持續刷新中 C刷題技巧總結: [溫習C/C]0x04 刷…

ClickHouse-CPU、內存參數設置

常見配置 1. CPU資源 1、clickhouse服務端的配置在config.xml文件中 config.xml文件是服務端的配置,在config.xml文件中指向users.xml文件,相關的配置信息實際是在users.xml文件中的。大部分的配置信息在users.xml文件中,如果在users.xml文…

《自動駕駛與機器人中的SLAM技術》ch9:自動駕駛車輛的離線地圖構建

目錄 1 點云建圖的流程 2 前端實現 2.1 前端流程 2.2 前端結果 3 后端位姿圖優化與異常值剔除 3.1 兩階段優化流程 3.2 優化結果 ① 第一階段優化結果 ② 第二階段優化結果 4 回環檢測 4.1 回環檢測流程 ① 遍歷第一階段優化軌跡中的關鍵幀。 ② 并發計算候選回環對…

type 屬性的用途和實現方式(圖標,表單,數據可視化,自定義組件)

1.圖標類型 <uni-icon>組件中&#xff0c;type可以用來指定圖標的不同樣式。 <uni-icons type"circle" size"30" color"#007aff"></uni-icons> //表示圓形 <uni-icons type"square" size"30" co…

網絡基礎知識指南|1-20個

1. IP地址: 即互聯網協議地址&#xff0c;是用于標識互聯網上的每一個設備或節點的唯一地址。IP地址的作用主要是進行網絡設備的定位和路由&#xff0c;確保數據包可以從源設備準確地傳送到目標設備。2. 子網掩碼: 是用于將一個IP地址劃分為網絡地址和主機地址的工具。它通常與…

GPT 系列論文精讀:從 GPT-1 到 GPT-4

學習 & 參考資料 前置文章 Transformer 論文精讀 機器學習 —— 李宏毅老師的 B 站搬運視頻 自監督式學習(四) - GPT的野望[DLHLP 2020] 來自獵人暗黑大陸的模型 GPT-3 論文逐段精讀 —— 沐神的論文精讀合集 GPT&#xff0c;GPT-2&#xff0c;GPT-3 論文精讀【論文精讀】…

lombok在高版本idea中注解不生效的解決

環境&#xff1a; IntelliJ IDEA 2024.3.1.1 Spring Boot Maven 問題描述 使用AllArgsConstructor注解一個用戶類&#xff0c;然后調用全參構造方法創建對象&#xff0c;出現錯誤&#xff1a; java: 無法將類 com.itheima.pojo.User中的構造器 User應用到給定類型; 需要:…

145.《redis原生超詳細使用》

文章目錄 什么是redisredis 安裝啟動redis數據類型redis key操作key 的增key 的查key 的改key 的刪key 是否存在key 查看所有key 「設置」過期時間key 「查看」過期時間key 「移除」過期時間key 「查看」數據類型key 「匹配」符合條件的keykey 「移動」到其他數據庫 redis數據類…

大數據技術Kafka詳解 ⑤ | Kafka中的CAP機制

目錄 1、分布式系統當中的CAP理論 1.1、CAP理論 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP機制 C軟件異常排查從入門到精通系列教程&#xff08;核心精品專欄&#xff0c;訂閱量已達600多個&#xff0c;歡迎訂閱&#xff0c;持續更新…

riscv架構下linux4.15實現early打印

在高版本linux6.12.7源碼中&#xff0c;early console介紹&#xff0c;可參考《riscv架構下linux6.12.7實現early打印》文章。 1 什么是early打印 適配內核到新的平臺&#xff0c;基本環境搭建好之后&#xff0c;首要的就是要調通串口&#xff0c;方便后面的信息打印。 正常流…

improve-gantt-elastic(vue2中甘特圖實現與引入)

1.前言 項目開發中需要使用甘特圖展示項目實施進度&#xff0c;左側為表格計劃&#xff0c;右側為圖表進度展示。wl-gantt-mater&#xff0c;dhtmlx嘗試使用過可拓展性受到限制。gantt-elastic相對簡單&#xff0c;可操作性強&#xff0c;基礎版本免費。 甘特圖&#xff08;Gan…

力扣 全排列

回溯經典例題。 題目 通過回溯生成所有可能的排列。每次遞歸時&#xff0c;選擇一個數字&#xff0c;直到選滿所有數字&#xff0c;然后記錄當前排列&#xff0c;回到上層時移除最后選的數字并繼續選擇其他未選的數字。每次遞歸時&#xff0c;在 path 中添加一個新的數字&…

1/13+2

運算符重載 myString.h #ifndef MYSTRING_H #define MYSTRING_H #include <cstring> #include <iostream> using namespace std; class myString {private:char *str; //記錄c風格的字符串int size; //記錄字符串的實際長度int capacity; …

04.計算機體系三層結構與優化(操作系統、計算機網絡、)

3.計算機體系三層結構與優化&#xff08;day04&#xff09; 3.1 操作系統 內容概要&#xff1a; 操作系統的發展史&#xff1a;批處理系統》分時操作系統》unix>linux多道技術》&#xff08;進程、線程&#xff09;并發進程與線程相關概念任務運行的三種狀態&#xff1a;…