緩存是提升瀏覽器訪問效率最有效的方法
不僅要考慮nginx要作爲緩存服務時的使用方法,還需要考慮瀏覽器中緩存生效的場景(因爲瀏覽器中緩存是否生效,可以通過nginx指令控制,而瀏覽器的緩存對用戶的體驗提升也是最大的)
瀏覽器緩存:
優點:
(1)使用有效緩存時,沒有網絡消耗,速度最快
(2)即使有網絡消耗,但對失效緩存使用304響應做到網絡流量消耗最小化
缺點:
僅提升一個用戶的體驗
nginx緩存
優點:
(1)提升所有用戶的體驗
(2)相比瀏覽器緩存,有效降低上游服務的負載
(3)通過304響應減少nginx與上游服務間的流量消耗
缺點:
用戶仍然保持網絡消耗
同時使用瀏覽器緩存與nginx緩存.
1.etag指令
語法:etag on | off;
默認:etag on;
放置位置:http,server,location
2.expires指令
語法:expires [ modified ] time;expires epoch | max | off ;
默認:expires off;
放置位置:http,server,location,if in location
off : 不添加或者修改Expires和Cache-Control字段
epoch: Expires : 1970 00:00:01GMT Cache-Control:no-cache
time:一天內的具體時刻可以加@。正數:設定Cache-Control時間,計算出expires。負數:Cache-Control:no-cache,計算出expires
not_modified過濾模塊
功能:客戶端擁有緩存,但不確定緩存是否過期,於是在請求中傳入If-Modified-Since或者If-None-Match頭部,該模塊通過將其值與響應中的Last-Modified值相比較,決定是通過200返回全部內容,還是僅返回304 Not Modified頭部,表示瀏覽器仍使用之前的緩存
使用前提:原返回響應碼爲200
1.if_modified_since指令
語法:if_modified_since off | exact | before;
默認:if_modified_since exact;
放置位置:http,server,location
off : 忽略請求中的if_modified_since頭部
exact:精確匹配if_modified_since頭部與last_modified的值
before:若if_modified_since大於等於last_modified的值,則返回304
nginx緩存:定義存放緩存的載體
1.proxy_cache 指令
語法:proxy_cache zone | off
默認:proxy_cache off;
放置位置:http,server,location
2.proxy_cache_path指令(存放緩存文件路徑)
語法:proxy_cache_path path;
默認:空
放置位置:http
3.proxy_cache_valid指令(緩存什麼樣的響應)
語法:proxy_cache_valid [ code ] time;
默認:空
放置位置:http,server,location
4.proxy_cache_method指令(對哪個method方法使用緩存返回響應)
語法:proxy_cache_method GET | HEAD | POST;
默認:proxy_cache_method GET HEAD;
放置位置:http,server,location
如何減輕緩存失效時上游服務器的壓力
合併回源請求---減輕峯值流量下的壓力
1.proxy_cache_lock指令(打開on時,同一時間僅第一個請求發向上游,其他請求等待第一個響應返回或者超時後,使用緩存響應客戶端)
語法:proxy_cache_lock on | off
默認:proxy_cache_lock off;
放置位置:http,server,location
2.proxy_cache_lock_timeout 指令(等待第一個請求返回響應的最大時間,到達後直接向上遊發送請求,但不緩存響應)
語法:proxy_cache_lock_timeout time;
默認:proxy_cache_lock_timeout 5s;
放置位置:http,server,location
3.proxy_cache_lock_age 指令(上一個請求返回響應的超時時間,到達後再放行一個請求發向上游)
語法:proxy_cache_lock_age time;
默認:proxy_cache_lock_age 5s;
放置位置:http,server,location
減少回源請求---使用stale陳舊的緩存
1.proxy_cache_use_stale 指令(返回舊緩存,提升體驗)
語法:proxy_cache_use_stale error | timeout | invalid_head | updating;
默認:proxy_cache_lock_age off;
放置位置:http,server,location
2.proxy_cache_background_update 指令(當使用proxy_cache_use_stale允許使用過期緩存時,將同步生成一個子請求,通過訪問上游服務更新過期的緩存)
語法:proxy_cache_background_update on | off;
默認:proxy_cache_background_update off;
放置位置:http,server,location
緩存有問題的響應
1.proxy_cache_revalidate 指令(更新緩存時,使用If-Modified-Since和If-None-Match作爲請求頭部,預期內容未發生變更時通過304來減少傳輸的內容)
語法:proxy_cache_revalidate on | off;
默認:proxy_cache_revalidate off;
放置位置:http,server,location