1. 程式人生 > >Nginx學習筆記——場景實踐之《快取服務》

Nginx學習筆記——場景實踐之《快取服務》

快取型別

使用快取,就是為了減少後端的壓力。 (1)服務端快取:Memcached、Redis等。 (2)代理快取:Nginx、代理、中介軟體上的快取。 (3)客戶端快取:瀏覽器上面的。

代理快取

在這裡插入圖片描述

proxy_cache配置語法

先定義快取路徑:

syntax:proxy_cache_path path [levels=levels]
[use_temp_path=on|off] keys_zone=name:size [inactive=time]
[max_size=size] [manager_files=number] [manager_sleep=time]
[manager_shreshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time] [purger=on|off]
[purger_files=number] [purger_sleep=time]
[purger_threshold=time];
Default:預設無
Context:http

定義快取開關,其中zone為名字

Syntax:proxy_cache zone|off;
Default:proxy_cache off;
Context:http,server,location

快取過期週期,code表示狀態碼

Syntax:proxy_cache_valid [code ...] time;
Default:預設無
Context:http,server,location

快取的維度,快取的範圍(預設:協議+主機+URL)

Syntax:proxy_cache_key string;
Default:proxy_cache_key $scheme$proxy_host$request_uri;
Context:http,server,location

測試配置

同樣開啟三個埠模擬三臺伺服器,配置一個代理伺服器。

    upstream server_pool{
	server 192.168.174.132:8001;
	server 192.168.174.132:8002;
	server 192.168.174.132:8003;
    }

    proxy_cache_path /opt/app/cache levels=1:2 keys_zone=shen_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    listen       80;
    server_name  localhost;

    location / {
	proxy_cache shen_cache;
	proxy_pass http://server_pool;
	proxy_cache_valid 200 304 12h;
	proxy_cache_valid any 10m;
	proxy_cache_key $host$uri$is_args$args;
	add_header Nginx-Cache "$upstream_cache_status";

	proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
	include proxy_params;
    }

此處配置了服務池,快取路徑,快取配置。 注:proxy_next_upstream,配置了當伺服器出現後面的情況後,跳轉到下一個伺服器訪問。

效果

當我們訪問頁面時,發現會訪問的是同一個伺服器,因為proxy_cache_key是同一個(類似於uri_hash)。 發現/opt/app/cache會有快取檔案。 當我們關閉快取服務後,再次訪問,發現變成輪詢訪問伺服器組。

快取語法補充

定期清理快取

方式一:rm -rf 快取目錄內容,清空所有快取 方式二:第三方擴充套件模組ngx_cache_purge

部分頁面不快取

Syntax:proxy_no_cache string ...;
Default:預設無
Context:http,server,location

如配置:

    if ($request_uri ~ ^/(url3|login|register|password\/reset)) {
        set $cookie_nocache 1;
    }

    location / {
        proxy_cache shen_cache;
        proxy_pass http://server_pool;
        proxy_cache_valid 200 304 12h;
        proxy_cache_valid any 10m;
        proxy_cache_key $host$uri$is_args$args;
        proxy_no_cache $cookie_nocache $arg_nochace $arg_comment;
        proxy_no_cache $http_pragma $http_authorization;

        add_header Nginx-Cache "$upstream_cache_status";

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        include proxy_params;
    }

其中,proxy_no_cache 後面的專案不為0或者空,則它匹配的網址不進行快取。 則http://XXX/url3.html會進行輪詢訪問伺服器。

大檔案分片請求

Syntax:slice size;
Default:slice 0;
Context:http,server,location

把一個大檔案,分割成小的片斷,分別去請求不同的伺服器,形成小的快取檔案。 優勢:每個子請求收到的資料都會形成一個獨立檔案,一個請求斷了,其它請求不受影響。 缺點:當檔案很大或slice很小的時候,可能會導致檔案描述符耗盡等情況。