天天看點

使用Nginx實作頁面緩存

1、緩存指令

Nginx的緩存配置比較直覺簡單,具體有下面幾個指令需要知道:

A、proxy_cache_path

格式:proxy_cache_path path [levels=numbers] keys_zone=zone_name:zone_size[inactive=time] [max_size=size]

說明:

path -緩存檔案存放的位置

levels -緩存目錄結構,可以是1、2、3位數字作為目錄,最多是3位數字如:1,1:2

keys_zone -指定緩存池名字及大小,每個定義緩存路徑必須不同

inactive -設定每個緩存區緩存檔案的有效時長,超過該時長沒被通路的緩存被删除

max_size -設定不活動的緩存大小,不活動的緩存超過該大小後被删除

B、proxy_cache

格式:

proxy_cache cache_name

說明:

指定緩存區域的名字,一個相同的區域可以在不同的地方使用。

C、proxy_cache_valid

格式:

proxy_cache_valid reply_code [reply code…|any] time;

說明:

reply_code -不同的應答代碼

time -為不同應答設定不同緩存時長 預設為分鐘m

any - 代表任何代碼

2、頁面緩存設定

A、建立緩存頁面

$ mkdir –pv /nginx/cache/webpages

B、配置nginx.conf

proxy_cache_path /nginx/cache/webpages levels=1:2 keys_zone=webpages:30mmax_size=2g;

    server {

        listen       80;

        server_name  localhost;

        charset utf-8;

        location / {

            proxy_passhttp://webservers;

            proxy_set_header X-Real-IP$remote_addr;

            proxy_cache webpages;

            proxy_cache_valid 20010m;

        }

    }

最後,測試下配置是否正确:

$sudo nginx –t

使用Nginx實作頁面緩存

然後,重載下nginx服務:

$sudo nginx –s reload

C、測試結果

浏覽器輸入:​​http://127.0.0.1​​ 然後檢視緩存路徑下是否生成緩存檔案,以及緩存檔案格式是否正确,緩存的結果:

/nginx/cache/webpages/f/63/681ad4c77694b65d61c9985553a2763f

上面的路徑規則已經按照我們預期設定生成,緩存檔案格式是url的hash格式,下面可以檢視下這個檔案是否是我們使用的頁面,預設生成的緩存目錄f 級别是不允許進入通路的,為了示範我已經給予其777權限了。

$cat 681ad4c77694b65d61c9985553a2763f

使用Nginx實作頁面緩存

D、如何知道是否通路緩存?

答案很簡單,我們使用谷歌浏覽器浏覽網頁,然後打開開發者面闆,檢視裡面的Response Headers響應頭中的資訊:

使用Nginx實作頁面緩存

但從上面是看不出是否調用了緩存檔案,因為需要額外配置下。首先,要了解下兩個緩存變量:

$server_addr - 顯示的伺服器位址

$upstream_cache_status - 緩存的狀态 可能的值為:MISS(未命中)、Hint(命中)、Expired(請求傳遞到背景)、Stale(後端得到過期的應答)、Updating(正更新,使用舊的應答)等。

那麼,在這裡如果緩存的狀态為HINT,就說明命中了緩存,也就是調用了緩存檔案。接下來,配置下nginx.conf檔案,然後重新加載,重新整理頁面即刻,具體如下:

A、配置檔案nginx.conf

proxy_cache_path /nginx/cache/webpages levels=1:2 keys_zone=webpages:30mmax_size=2g;

    server {

        listen       80;

        server_name  localhost;

        charset utf-8;

        #add headers

        add_header X-Via$server_addr;

        add_header X-Cache$upstream_cache_status;

        location / {

            proxy_passhttp://webservers;

            proxy_set_headerX-Real-IP $remote_addr;

            proxy_cache webpages;

            proxy_cache_valid 20010m;

        }

    }