一、Nginx expires 基本介紹
在Web開發中,為了提高Web頁面的訪問速度,緩存是非常常用的技術之一。針對靜態文件的緩存,可以採用HTTP協議定義的”Expires”和”Cache-Control”響應頭字段。Nginx也支持這兩個字段,可以很好地進行緩存優化。
location / {
expires 24h;
}這是一個基本的配置:指定了”/”的response header中expires為24小時後。這裡默認採用HTTP協議0.9(也就是不填)。
二、Nginx expires 的使用場景
1. 靜態資源緩存
對於靜態資源文件(例如js、css、圖片等),應該經常被訪問,所以使用Nginx expires可以改善訪問速度,減輕後台服務器負擔。
location ~ .*\.html$ {
expires 1m;
}
location ~ .*\.css$ {
expires 1d;
}
location ~ .*\.js$ {
expires 1d;
}
location ~ .*\.png {
expires 1d;
}
location ~ .*\.jpg {
expires 1d;
}這個例子中,html緩存時間為1分鐘,css/js/png/jpg緩存時間為1天。
2. 多級緩存
對於服務器資源非常緊缺的情況(例如CDN多機房、大型活動),可以嘗試使用Nginx-expires進行雙層甚至多層緩存。
location ~ /(.*)/(.*) {
proxy_pass http://$1;
expires 10m;
}
location / {
proxy_pass http://upstream_server;
}這裡配置了兩個location。第一個location是針對http代理的,如果某個請求能夠被代理服務器”完美命中”,也即代理後面的”/(.*)/(.*)”正則表達式能夠完全和URL吻合,那麼就緩存它。
緩存時間為10分鐘,這有利於直接從Nginx緩存中讀取資源,或者從代理服務器讀取資源。
當代理未命中的時候,會走第二個location,即從後台upstream服務器中獲取,這種情況下,緩存失效,不使用Nginx緩存。這個例子是一個多級緩存的例子,效果顯著。
3. 避免CDN不必要的回源
對於一些穩定不變的文件,例如logo、共用的js庫等,經常使用CDN來提供加速服務,但是CDN中可能還沒有這個文件,需要先從源站獲取一次,這可以用Nginx expires來避免不必要的回源。
location /logo.png {
expires 30d;
}
location /common.js {
expires 30d;
}這裡配置了兩個location,分別是logo和共用的js文件,expires設置為30天。這樣在30天內,CDN就不會回源了,而且cpu以及網絡都能夠節省不少。
三、Nginx expires 的注意事項
1. expires 與 Cache-Control的互斥
在HTTP協議中存在兩個關於緩存的響應頭:「Expires」和「Cache-Control」。其中的Cache-Control常用的值有:public, private, no-cache, max-age, s-maxage等。
在nginx expires配置時同時存在Cache-Control配置時,Cache-Control的優先級最高。當Cache-Control的max-age剛好等於Nginx expires的時間時,會優先採用Cache-Control的值來進行緩存而不是Nginx expires的值。
2. expires 改變了「Last-Modified」響應頭的值
當expires的時間比當前的時間早,而緩存還沒有被刪除時,expires會從「Last-Modified」響應頭中刪除。
3. expires 只對文靜態件有效
僅對靜態資源文件有效,對於動態頁面這些經API計算出的內容不會有影響。
4. expires 的時間點是客戶端時間點,而不是Nginx服務器時間點
expires中的時間點是客戶端時間點,而不是Nginx服務器時間點。所以,如果客戶端時間設置不正常的話,就會出現緩存時間過長或者過短的問題。
5. 針對某些特殊場景需要計算expires
有些特殊場景需要根據變量動態計算expires的值。例如:
location ~ /api/user_info {
if ($http_cookie ~* "sid=([^;]+)"){
add_header Set-Cookie "sid=$1; HttpOnly";
expires 30d;
break;
}
return 401;
}在這個例子中,針對請求「/api/user_info」,基於變量$http_cookie的值設定Set-Cookie和expires,可以讓對這個API的訪問在30天之內是有效的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/156817.html
微信掃一掃
支付寶掃一掃