Nginx代理緩存靜態資源

問題描述

有兩臺服務器,一臺是外網的網關服務器,一臺是內網的資源服務器,但是兩臺服務器距離很遠(跨省),頁面中依賴大量插件資源,加載耗時久,本章重點講解Nginx代理緩存靜態資源。

解決思路

  • CDN
  • 開啟gzip壓縮
  • 圖片格式優化,找到大圖片
  • 外網服務器進行靜態資源緩存

proxy_cache工作原理

Nginx 的 proxy_cache 模塊允許 Nginx 作為反向代理服務器時緩存后端服務器的響應。以下是 proxy_cache 模塊的工作原理:

  1. 請求到達:客戶端向 Nginx 發送請求。
  2. 緩存查找:Nginx 首先檢查請求是否命中緩存。這是通過查找共享內存中的緩存鍵(由 proxy_cache_key 定義)來完成的。
  3. 緩存命中:如果請求命中緩存,Nginx 直接從緩存中讀取響應并返回給客戶端。
  4. 緩存未命中:如果請求未命中緩存,Nginx 將請求轉發到后端服務器。
  5. 后端響應:后端服務器處理請求并返回響應給 Nginx。
  6. 緩存存儲:Nginx 將后端服務器的響應存儲在本地文件系統中,同時在共享內存中更新緩存鍵和元數據。
  7. 返回響應:Nginx 將后端服務器的響應返回給客戶端,并根據 proxy_cache_valid 指令設置的規則決定緩存時間。

配置

# 設置日志格式,$upstream_cache_status代表是否命中緩存
# $upstream_cache_status的返回值有7個:
# HIT表示緩存命中
# MISS表示未命中,請求被傳送到后端
# EXPIRED表示緩存已經過期,請求被傳送到后端
# UPDATING表示正在更新緩存,將使用舊的應答
# STALE表示無法從后端服務器更新緩存時,返回了舊的緩存內容
# BYPASS表示緩存被繞過了
# REVALIDATED表示啟用proxy_cache_revalidate指令后,當緩存內容過期時,Nginx通過一次If-Modified-Since的請求頭去驗證緩存內容是否過期,此時會返回該狀態
log_format  main  '$remote_addr - $remote_user [$request_time] [$time_local] "$request" ''$upstream_cache_status '                      '$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
# 打開日志格式化功能,如果這里不打開的話,上面的格式化不生效
access_log  logs/access.log  main;# 設置緩存區信息
# levels:指定該緩存空間對應的目錄,最多可以設置3層,每層取值為1|2;例如:levels=1:2   緩存空間有兩層目錄,第一次是1個字母,第二次是2個字母
proxy_cache_path /app/nginx/js_cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;# --------------以下為server中的配置---------------
location / {proxy_pass http://ip:端口;
}
# 啟用緩存
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ioc|ico|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|css|js)$ {proxy_pass http://ip:端口;proxy_cache my_cache;# proxy_cache_valid設置不同響應碼的緩存過期時間# HTTP 206 Partial Content(部分內容)狀態碼表示服務器成功處理了客戶端?請求資源部分內容?的GET請求,主要應用于支持范圍請求(Range Request)的場景,比如文件斷點下載proxy_cache_valid 200 304 206 60m; # 緩存200, 304, 206響應3600秒(1小時)proxy_cache_key $uri; # 緩存鍵的生成方式# add_header X-Cache '$upstream_cache_status from $host'; # 在請求的http響應頭中返回,判斷是否命中緩存
}

proxy_cache_path與proxy_cache_valid中超時時間同時設置,生效控制問題

inactive時間到了,數據刪除。proxy_cache_valid時間到了不會被刪除,但是會認為失效,再次請求時會重新下載。有請求,inactive就刷新計時,valid不變。沒請求,inactive和valid都不變。
分析各種情況:

  1. inactive設置1m,valid設置1h
    首先,請求進來,cache出現,兩個時間開始倒計時。
    情況一:不斷請求這個cache,inactive不斷刷新1m倒計時,直到到達1h,valid過期。這時你去請求了一次,nginx重新去讀取服務器數據,刷新valid倒計時。期間數據一直在緩存里。不請求,就再過1m刪掉。
    情況二:兩次請求間隔超過了1min,inactive生效,刪除了這個cache數據,沒了。你再請求,相當于重新去服務器拿了一次數據,inactive和valid倒計時都會重新刷新,不請求,cache里就沒有這份數據了

  2. inactive設置1m,valid設置1m
    首先,請求進來,cache出現,兩個時間開始倒計時。
    情況一:1m內不請求,最后inactive生效刪掉。不請求就沒緩存了,請求了一次,重新從服務器讀取一份,兩個計時刷新。
    情況二:1m內請求了一次,inactive時間刷新,但是valid還在計時,所以1m到了后,緩存過期了。你再請求就重新從服務器讀取一份,刷新計時。不請求,就等待1m,由inactive生效刪除了緩存

  3. inactive設置1h,valid設置了1m
    首先,請求進來,cache出現,兩個時間開始倒計時。
    過了1m,緩存過期,數據在沒刪掉。不請求,直到1h到,inactive刪掉緩存。請求了一次,重新從服務器讀取,刷新兩個計時。

所以,通常inactive應該需要設置的比valid中時間長,inactive和valid是配合使用,不是誰時間短覆蓋誰的關系。

緩存清理

清除緩存,直接刪除緩存文件夾,下次請求的時候會重新生成

外網緩存失敗,內網不允許緩存

在生產環境出現過一個問題,在外網服務器nginx配置了緩存信息,日志配置生效,緩存目錄也生成,但是始終沒有生成緩存文件,最后排查發現,在內網的nginx配置了如下禁止緩存的信息,應該將此段內容從內網服務器移到外網上或者使用proxy_ignore_headers

add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
add_header Pragma no-cache;
add_header Expires 0;

private:專用于個人的緩存,中間代理、CDN 等不能緩存此響應
public:響應可以被中間代理、CDN 等緩存

參考

nginx proxy_cache緩存詳解(強烈推薦)
nginx配置proxy_cache_path之inactive和proxy_cache_valid對比
Nginx 緩存系統 proxy_cache詳解

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

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

相關文章

Blender 轉換為 STP:軟件操作與迪威模型網在線轉換全指南

在三維設計與工程制造領域,不同格式的文件承擔著各自的使命。Blender 作為一款功能強大且開源的三維建模軟件,被眾多設計師、藝術家以及學生廣泛使用,能夠創作出風格多樣、細節豐富的三維模型。而 STP 格式作為制造業通用的數據交換標準&…

WebFuture:PDF頁面去掉下載按鈕

問題描述:客戶要求pdf頁面不顯示下載按鈕 解決辦法:WF15.2版本開始會在內容管理配置增加“允許下載 PDF“開關;之前的版本需要替換文件來處理 1.備份網站下的base文件夾,路徑為/wwwroot/content/_common/base/,然后覆…

【JVM】- 類加載與字節碼結構2

編譯期處理(語法糖) java編譯器把.java源碼編譯成.class字節碼的過程,自動生成和轉換的一些代碼。 默認構造器 public class Candy01 { }編譯成class后的代碼 public class Candy1 {public Candy1(){super();} }自動拆裝箱(jd…

WSL2 中安裝 cuDNN?? 的完整指南

以下是關于 ??cuDNN?? 的詳細介紹及在 ??WSL2 中安裝 cuDNN?? 的完整指南,結合權威資料整理而成: 📚 ??一、cuDNN 深度解析?? ??1. 定義與作用?? ??cuDNN??(CUDA Deep Neural Network Library)是…

Apache Doris FE 問題排查與故障分析全景指南

前言: FE(Frontend)是 Apache Doris 集群架構中的“大腦”,負責元數據管理、查詢解析和調度等關鍵任務。一旦 FE 出現問題,整個集群的穩定性和可用性將受到嚴重影響。因此,掌握 FE 故障定位與排查方法對于保…

RK AndroidFramework 內置應用可,卸載,恢復出廠設置恢復安裝

device/rockchip/rk356x/rk3568_r/preinstall_del/Android.mkdevice/rockchip/rk356x/rk3568_r/preinstall_del/Android.mk include $(call all-subdir-makefiles) 拿內置LoyversePos應用做例子 device/rockchip/rk356x/rk3568_r/preinstall_del/preinstall.mk PRODUCT_PACK…

一文了解Blob文件格式,前端必備技能之一

文章目錄 前言一、什么是Blob?二、Blob的基本特性三、Blob的構造函數四、常見使用場景1. 文件下載2. 圖片預覽3. 大文件分片上傳 四、Blob與其他API的關系1. File API2. FileReader3. URL.createObjectURL()4. Response 五、性能與內存管理六、實際案例:…

LLMs 系列實操科普(4)

六、deep research 這是 chatgpt 推出的功能,但我這里是免費用戶,一個月才有 5 次使用機會,而且使用的是輕量化模型版本,相對體驗上比較雞肋一些。 那這個深度思考研究是個什么東西呢? 根據 openai 對其的解釋是&…

若依框架前端調用后臺服務報跨域錯誤

背景:使用若依框架的前后端分離項目,前后端開發在同一個辦公室情況下前端調用后端服務提示如下報錯:Access to XMLHttpRequest at http://ip1:8089/online/layer/dataType from origin http://ip2:6090 has been blocked by CORS policy: Res…

PHP商城源碼:構建高效電商平臺的利器

一、PHP商城源碼的核心優勢 1. **開源免費,降低成本** PHP作為開源語言,擁有龐大的開發者社區,成熟的商城源碼(如EcShop、OpenCart)可免費獲取,大幅降低企業的技術投入成本。 2. **開發效率高** PHP語法…

【學習筆記】C++代碼規范整理

【學習筆記】C代碼規范整理 一、匿名空間namespace 匿名命名空間(Anonymous Namespace)是一種特殊的命名空間聲明方式,其作用是將聲明的成員限定在當前編譯單元(源文件)內可見,類似于使用 static 關鍵字修…

數學復習筆記 29 不定積分

前言 復習的時候時常復習一下以前復習的高數,溫故而知新,可以為師矣。現實生活中有非常多讓我難受的事情,賢者模式的時候也會對一些自己的行為嗤之以鼻,復習考研對其他三門科目都沒有學出來正反饋,只能從數學這兒找一…

微軟因安全漏洞禁用黑暗環境下的Windows Hello面部識別功能

面部識別技術在各種場景中的應用日益廣泛,但身份欺詐事件仍時有發生,這表明即使面部識別也并非萬無一失。在某些情況下,這些系統可能被攻擊者利用。 漏洞發現與應對措施 近期,微軟在Windows 10和11系統中禁用了黑暗環境下使用Wi…

產品經理課程(十五)實戰點評(3)

(一)復習 需求文檔是產品的說明書 需求文檔包含:修訂記錄、背景、主要流程、詳細功能邏輯、數據上報,發布策略 bug也是需求文檔的一部分 (二)案例講解 案例一: 一個版本里面的4-5個功能點就比…

大模型量化與剪枝

大模型量化,剪枝 量化有助于減少顯存使用并加速推理 GPTQ 等后訓練量化方法(Post Training Quantization)是一種在訓練后對預訓練模型進行量化的方法。 ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3### export export_di…

Oracle 數據庫數據操作:精通 INSERT, UPDATE, DELETE

作者:IvanCodes 日期:2025年6月18日 專欄:Oracle教程 在 Oracle 數據庫中,對表內數據進行增加、修改和刪除操作是通過數據操作語言 (DML - Data Manipulation Language) 來完成的。核心的DML語句包括 INSERT (插入新數據), UPDATE…

推薦使用的Unity插件(InputSystem)

本文將提供更簡潔的步驟和常見問題解決。 一、極簡入門步驟: 安裝:Package Manager中安裝Input System(確保Unity版本在2019.4) 創建Input Actions: 在Project窗口右鍵 -> Create -> Input Actions 雙擊打開…

清理 Docker 容器日志文件方法

操作總結與問題解析 一、操作目的與背景 用戶旨在清理 Docker 容器日志文件以釋放服務器存儲空間,主要通過以下命令組合完成操作: 查看容器日志空間占用清空指定容器的日志文件驗證容器運行狀態與日志清理效果二、關鍵命令與輸出解析 1. 查看 Docker 容器日志空間占用 du…

圖片壓縮工具 | 按指定高度垂直切割圖片

OPEN-IMAGE-TINY,一個基于 Electron VUE3 的圖片壓縮工具,項目開源地址:https://github.com/0604hx/open-image-tiny ?? 需求描述 在上一篇文章一段代碼利用 snapdom 將 CSDN 博文轉化為長圖片(PNG/JPG/PDF)中&…

山東大學軟件學院創新項目實訓開發日志——第十七周(二)

目錄 1.優化前端日歷頁面顯示,增加鼠標懸停顯示當日會議基本信息的效果。 2.優化會議計劃生成與會議PPT生成功能,使得能夠加載多頁docx文件與PDF文件 3.優化了會議PPT生成功能,使得可以上傳多個文件并根據多個文件生成會議PPT 4.修改了識…