Web內容緩存

1    介紹

當緩存被啓用時,Nginx保存響應到磁盤緩存並每次請求相同的內容時不用代理請求使用它們響應客戶端。nginx

2    啓用響應緩存

爲了啓用緩存,在http上下文設置proxy_cache_path指令。第一個強制參數是緩存內容的本地文件系統,強制參數keys_zone定義用於存儲緩存條目的元數據的共享內存區域的名稱和大小:後端

http {緩存

    ...服務器

    proxy_cache_path /data/nginx/cache keys_zone=one:10m;cookie

}curl

 而後在你想要緩存服務器響應的上下文(協議類型、虛擬主機或location)中使用proxy_cache指令,指定proxy_cache_path指令的keys_zone參數定義的區域名稱(在這種狀況下,是one):工具

http {性能

    ...url

    proxy_cache_path /data/nginx/cache keys_zone=one:10m;spa

 

    server {

        proxy_cache one;

        location / {

            proxy_pass http://localhost:8000;

        }

    }

}

 注意,keys_zone參數定義的大小不限制緩存響應數據的總大小。緩存響應自身有一個元數據備份存儲文本系統上的特定文件中。爲了限制緩存響應數據的總大小,使用proxy_cache_path指令的max_size參數。(可是注意,緩存數據的總大小能夠臨時超過這個限制)

3    涉及緩存的Nginx進程

有兩個額外的Nginx進程涉及緩存:

  • 緩存管理器按期被激活檢查緩存的狀態。若是緩存大小超過proxy_cache_path指令的max_size參數設置的限制,緩存管理器刪除數據最近訪問的數據。如前所述,大多數緩存數據能在緩存管理器激活期間臨時超過限制。

  • Nginx啓動以後,緩存加載器只運行一次。它加載元數據瞭解以前緩存的數據到共享內存區間。在第一次啓動後幾分鐘加載整個緩存當即消耗充足的資源下降Nginx性能。爲了不這個問題,在proxy_cache_path指令上配置迭代加載緩存的參數:

    • loader_threshold——迭代週期,以毫秒爲單位(默認是200)

    • loader_files——一次加載的項目的最大數量(默認是100)

    • loader_sleeps——兩次迭代之間的延遲,以毫秒爲單位(默認是50)

在下面例子中,迭代至少300毫秒或指導200個項目被加載:

proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;

4    指定那些請求被緩存

默認,Nginx緩存全部第一次請求的HTTP GET和HEAD方法的響應,響應接收自代理服務器。Nginx使用請求字符串做爲請求的標識符。若是請求有相同的標識符做爲緩存響應,Nginx發送緩存響應到客戶端。你能在http、server或location上下文中包括各類指令控制那些響應被緩存。

爲了改變用於計算請求的特性,使用proxy_cache_key指令:

proxy_cache_key "$host$request_uri$cookie_user";

 爲了定義請求使用相同標識符的最小次數後響應被緩存,使用proxy_cache_min_uses指令:

proxy_cache_min_uses 5;

 爲了緩存GET和HEAD以外的請求的響應,使用proxy_cache_methods指令:

proxy_cache_methods GET HEAD POST;

 5    限制或繞過緩存

默認,響應無限期的保存在響應中。只有當超過最大配置大小時,而後纔會按從它們上次被請求持續時間的順序刪除。你能設置緩存響應多久失效,甚至是否它們徹底使用。

使用proxy_cache_valid指令限制帶有特定狀態碼的響應有效時間:

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404      1m;

 在嗓門的例子中,狀態碼爲200或302的響應有效期是10分鐘,狀態碼爲404的響應有效期是1分鐘。爲了定義全部響應的有效期使用any做爲第一個參數:

proxy_cache_valid any 5m;

 使用proxy_cache_bypass指令定義Nginx不發送響應到客戶端的條件。每一個參數定義一個條件,由大量變量組成。若是至少一個參數不爲空而且不等於「0」,Nginx不在緩存中查找響應,而是當即將請求轉發到後端服務器。

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

 使用proxy_no_cache指令定義Nginx不緩存響應的條件。與proxy_cache_bypass參數相同。

proxy_no_cache $http_pragma $http_authorization;

6    從緩存清除內容

Nginx能夠從緩存刪除過期的緩存文件。刪除過期的緩存內容是有必要的,防止同時服務新老版本的Web頁面。緩存請求接收特定「purge」請求要麼包含一個自定義HTTP頭,要麼是「OURGE」HTTP方法。

6.1    配置緩存清理

讓咱們設置配置使用「PURGE」HTTP方法和檢測匹配URLs標識請求。

  • 在http級別,建立新變量,例如,$purge_method,將依賴於$request_method變量:

http {

    ...

    map $request_method $purge_method {

        PURGE 1;

        default 0;

    }

}

  •  在配置緩存的location中,proxy_cache_purge指定緩存purge請求的條件。在咱們的例子中,它是上一步配置的$purge_method

server {

    listen      80;

    server_name www.example.com;

 

    location / {

        proxy_pass  https://localhost:8002;

        proxy_cache mycache;

 

        proxy_cache_purge $purge_method;

    }

}

 6.2    發送清理命令

當proxy_cache_purge指令被配置時,你將須要發送一個特定的緩存清理請求清理緩存。你會問清理緩存使用一系列工具,例如,curl命令:

$ curl -X PURGE -D – "https://www.example.com/*"

HTTP/1.1 204 No Content

Server: nginx/1.5.7

Date: Sat, 01 Dec 2015 16:33:04 GMT

Connection: keep-alive

 在該例子中,資源有一個公共URL部分(經過星號通配符)將被刪除。然而,整個緩存不會徹底從緩存中刪除:它們將保留在磁盤直到inactivity(proxy_cache_path)或緩存清理進程處理時或客戶端嘗試訪問它們時刪除。

6.3    限制清理命令訪問

推薦配置容許發送緩存清理請求的IP地址限制:

geo $purge_allowed {

   default         0;  # deny from other

   10.0.0.1        1;  # allow from localhost

   192.168.0.0/24  1;  # allow from 10.0.0.0/24

}

 

map $request_method $purge_method {

   PURGE   $purge_allowed;

   default 0;

}

 在該例子中,Nginx檢查該請求是否「PURGE」方法,若是是,分析客戶端的IP地址。若是IP地址是白名單,那麼$purge_method設置爲$purge_allowed:1,容許清理,0,拒絕清理。

6.4    徹底從緩存中刪除文件

徹底刪除匹配星號的緩存文件,你將須要激活特定緩存清理進程將永久遍歷全部緩存條目並刪除匹配通配符鍵的條目。在http級別,添加purger參數給proxy_cache_path指令:

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;

 6.5    緩存清理配置實例

http {

    ...

    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;

 

    map $request_method $purge_method {

        PURGE 1;

        default 0;

    }

 

    server {

        listen      80;

        server_name www.example.com;

 

        location / {

            proxy_pass        https://localhost:8002;

            proxy_cache       mycache;

            proxy_cache_purge $purge_method;

        }

    }

 

    geo $purge_allowed {

       default         0;

       10.0.0.1        1;

       192.168.0.0/24  1;

    }

 

    map $request_method $purge_method {

       PURGE   $purge_allowed;

       default 0;

    }

}

 7    字節範圍緩存

有時,最初的緩存填充操做可能須要一些時間,尤爲是大文件。當第一個請求開始下載一個影音文件的一部分時,下一個請求將要等待整個文件下載並放入緩存。

Nginx能夠緩存這麼一個範圍的請求並使用緩存切片模塊逐漸填充緩存。文件被切分紅更小的「分片」。每一個範圍請求選擇覆蓋請求範圍的特定分片,若是這個範圍沒有緩存,放置它到緩存中。全部到這些分片的其它請求將從緩存中獲取響應。

爲了啓用字節範圍緩存:

  • 確保你的Nginx編譯了slice模塊。

  • 使用slice指令指定分片大小:

location / {

    slice  1m;

}

 分片大小應該調整爲足夠快的下載分片。過小可能致使浪費過多的內存,而且處理請求時要打開大量的文件描述符,而值太大會致使延遲。

  • 包括$slice_range變量到緩存鍵中

proxy_cache_key $uri$is_args$args$slice_range;

  • 啓用狀態碼爲206的響應的緩存: 

 proxy_cache_valid 200 206 1h;

  • 啓用傳入範圍請求到代理服務器經過傳入$slice_range變量到Range頭字段: 

proxy_set_header  Range $slice_range;

 二進制範圍緩存例子:

location / {

    slice             1m;

    proxy_cache       cache;

    proxy_cache_key   $uri$is_args$args$slice_range;

    proxy_set_header  Range $slice_range;

    proxy_cache_valid 200 206 1h;

    proxy_pass        http://localhost:8000;

}

 注意,若是分片緩存打開,最初的文件不該該改變。

7.1    聯合配置示例

http {

    ...

    proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300

                     loader_files=200 max_size=200m;

 

    server {

        listen 8080;

        proxy_cache one;

 

        location / {

            proxy_pass http://backend1;

        }

 

        location /some/path {

            proxy_pass http://backend2;

            proxy_cache_valid any 1m;

            proxy_cache_min_uses 3;

            proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

        }

    }

}

在該例子中,兩個location使用相同的緩存,但方式不一樣。

由於來自backend1服務器的響應不多改變,沒有緩存控制指令。第一次響應緩存的請求,並永久保存。

相比之下,來自backend1服務器的響應改變頻繁,所以它們的有效期只有1分鐘而且直到一樣的請求發生三次纔會緩存。然而,若是proxy_cache_bypass指令指定請求匹配條件,Nginx當即傳遞請求給backend2而不去檢查緩存。

相關文章
相關標籤/搜索