服務端緩存:
原文:
https://www.cnblogs.com/wpjamer/articles/7124087.html
客戶端緩存:
原文:
https://blog.csdn.net/zhang_referee/article/details/88532172
nginx 圖片緩存
最近准備用nginx搭建了一個圖片服務器,看中的就是nginx超強的靜態文件處理能力。
由於圖片量比較大,和web服務器(也是nginx)分開運行,雖然web服務器調用圖片沒用問題,但畢竟是遠程調用,肯定沒有本地文件系統那么快,因此仍然有優化的空間。
使用前的nginx配置
location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ {
log_not_found off;
access_log off;
expires 7d;
}
|
|
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ {
log_not_found off;
expires 7d ;
access_log off;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
if ( !-e $request_filename) {
proxy_pass http://img.example.com
}
}
默認的緩存路徑位於 /var/cache/nginx/proxy_temp,里面將會保持圖片服務器的目錄結構
proxy_store 沒有緩存過期,相當於鏡像功能,這既是優點也是缺點,優點是訪問快速,缺點是不知哪一天,硬盤會被撐爆,不過我們可以寫個find腳本,定時清理一下緩存就OK了。
nginx還有一種緩存proxy_cache,它在設計上比proxy_store 更先進,采用內存+硬盤方式緩存,可以設置緩存大小和緩存過期。
http {
,,,,,
proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=imgcache:100m inactive=1d max_size=10g;
server {
........
location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ {
log_not_found off;
access_log off;
expires 7d;
proxy_pass http://img.example.com ;
proxy_cache imgcache;
proxy_cache_valid 200 302 1d;
proxy_cache_valid 404 10m;
proxy_cache_valid any 1h;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
}
}
}
上面的代碼將會使用一塊最大100M的共享內存,用於硬盤上的文件索引,包括文件名和請求次數,每個文件在1天內若不活躍(無請求)則從硬盤上淘汰,硬盤緩存最大10G,滿了則根據LRU算法自動清除緩存。
這種緩存方式為了更快的索引,采用hash分級來存儲圖片,圖片目錄結構和名稱都變得面目全非,因此網頁熱點圖片,必須通過其他途徑統計,比如日志。
后一種方式更像一種正兒八經的緩存系統,應用相對更廣,在性能上也更好。
本文針對nginx expires 設置進行講解。nginx 緩存設置非常簡單,可以設置在location /if 段里。
注:這個緩存是指針對瀏覽器所做的緩存,不是指服務器端的數據緩存.
下面就以具體的示例網站,針對該示例網站做實驗。
一般緩存是針對不常發生變化的內容來做的緩存,在我們的這個示例網站中,可以看到圖片是很多的,如果每次訪問都請求加載很多圖片資源的話,那是相當慢的,也是非常浪費服務器資源的。

ok,我們這邊設置nginx 做下緩存,讓瀏覽器一個星期內不再重復請求圖片內容。
我們先看下,在沒做緩存配置前的一個瀏覽器請求響應頭信息:

注:我這里nginx 有配置過虛擬主機,把虛擬主機的配置單獨抽離出來放在了vhosts 目錄下,因此,下面所做的配置主要是針對該主機,如果配置在nginx.conf 文件中也同樣適用的(前提要配置正確哦)。

配置如下:
-
location ~* \.(jpg|jpeg|gif|png){
-
-
root /data/www/OneGame/public ;
-
expires 7d;
-
-
}
該配置表示:所有在/data/www/OneGame/public 目錄下的以.jpg、.png、.gif、.jpeg為后綴 (不區分大小寫)的文件緩存7天。
以下是我配置文件完整內容:


讓nginx 重新載入配置
nginx -s reload
然后強制刷新訪問示例網站,查看一下圖片的請求響應頭信息。

可以看到響應頭信息多了一個Cache-Control ,而且該值為:604800 ( 3600 * 24 * 7 ) ,該值單位為秒,即緩存7天。
再次刷新(非強制刷新)查看瀏覽器請求響應頭信息

再次刷新后(非強制刷新),可以查看到,狀態碼304的數據瀏覽器已經沒有再請求服務器了

原理是:第一次瀏覽器訪問資源,服務器響應Etag 驗證令牌,Last-Modified 時間,Cache-Control:max-age 緩存時長,第二次瀏覽器發送請求的時候在HTTP If-None-Match 請求標頭中加上ETAG 驗證令牌,服務器根據當前請求資源核對令牌如果它未發生變化,服務器返回"304 Not Modified"響應,告知瀏覽器緩存中響應未發生變化,可以繼續延用Cache-Control響應頭中max-age時長。這次不必再次下載響應,這節約了時間和帶寬。
瀏覽器發出的所有 HTTP 請求會首先路由到瀏覽器緩存,以確認是否緩存了可用於滿足請求的有效響應。 如果有匹配的響應,則從緩存中讀取響應,這樣就避免了網絡延遲和傳送產生的流量費用。

