NginxExpires

一、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-hant/n/156817.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 01:58
下一篇 2024-11-18 01:58

發表回復

登錄後才能評論