nginx代理緩存與壓縮

nginx代理緩存

nginx的ngx_http_proxy_module自帶了緩存功能,下面介紹幾個常用的指令以及如何配置。

proxy_cache_path

nginx緩存的內容是放在磁盤中的,所以我們需要定義存放緩存的載體,proxy_cache_path設置緩存的路徑和其他參數。緩存中的文件名爲proxy_cache_key定義的字符串的hash結果

proxy_cache_path語法

語法 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_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on丨off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
默認 -
應用位置 http

參數解釋:

  • path:定義緩存文件的路徑,目錄不存在會自動創建
  • levels:定義緩存目錄的級別,最多爲3級,每級目錄名長度字符只能爲1或者2個字節。
  • use_temp_path:當參數爲on時,會使用proxy_temp_path定義的目錄,否則臨時文件將直接放在緩存目錄裏
  • keys_zone:定義共享內存名字和共享內存大小,name表示共享內存名稱,size表示共享內存大小
  • inactive:在inactive參數指定的時間內未被訪問的緩存數據 將從緩存中刪除,默認爲十分鐘
  • max_size:定義緩存文件最大空間,超過將會被cache manager進程刪除掉最近最少使用的緩存
  • manager_files:定義cache manager進程執行一次所要刪除的文件數,默認爲100
  • manager_sleep:執行一次cache manager進程後的休眠時間,默認爲50毫秒
  • manager_threshold:執行一次cache manager刪除循環的最大耗時,默認爲200毫秒。
  • loader_files:cache loader進程用於將磁盤中原有的緩存數據加載到共享內存中,也是通過循環來完成的,用於定義每次載入的最大文件數,默認爲100
  • loader_sleep:執行一次載入緩存進程的休眠時間,默認爲50毫秒
  • loader_threshold:執行一次載入緩存進程所需的時間,默認爲50毫秒

proxy_cache

用來指定使用哪個共享內存,使用proxy_cache_path中的name來引用

proxy_cache語法

語法 proxy_cache zone 丨 off;
默認 proxy_cache off;
應用位置 http,server,location

proxy_cache_key

定義緩存的key,將以key的hash值作爲緩存文件名

proxy_cache_key語法

語法 proxy_cache_key string;
默認 proxy_cache_key $ scheme $ proxy_host $ request_uri;
應用位置 http,server,location

proxy_cache_valid

用於設置不同響應代碼的緩存時間

proxy_cache_valid語法

語法 proxy_cache_valid [code ...] time;
默認 -
應用位置 http,server,location
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid 5m;
proxy_cache_valid any 1m;

以上代碼表示狀態碼爲200和302的緩存有效期爲10分鐘,狀態碼爲404的緩存有效期爲1分鐘,如果不指定狀態碼,那麼只有緩存狀態碼200,301和302各五分鐘,any表示緩存任何響應

在響應頭中設置緩存時長

  • 當X-Accel-Expires爲0時,禁止緩存內容,使用@可以設置一天中的某一時刻
  • 當請求頭中包含“Set-Cookie”字段時,則不會緩存此類響應
  • 當"Vary”字段的值爲"*"時,則不會緩存此類響應

proxy_no_cache

定義不將響應保存到緩存的條件。當字符串參數爲真時,則響應不會保存到緩存

proxy_no_cache語法

語法 proxy_no_cache string ...;
默認 -
應用位置 http,server,location

proxy_cache_bypass

定義不從緩存中獲取響應的條件,當字符串參數爲真時,則不會從緩存中獲取響應

proxy_cache_bypass語法

語法 proxy_cache_bypass string ...;
默認 -
應用位置 http,server,location

$upstream_cache_status變量

$upstream_cache_status是一個位於ngx_http_upstream_module模塊來顯示緩存狀態的變量,可以在配置中添加一個http頭來顯示此變量的值

變量的值

  • MISS:未命中的緩存
  • HIT:命中緩存
  • EXPIRED:緩存已經過期,請求將被傳遞到後端
  • STALE:後端將得到過期的應答
  • UPDATING: 正在更新緩存,將使用舊的應答
  • REVALIDATED:nginx驗證了舊的緩存依然有效
  • BYPASS:緩存被繞過了,應答是從原始服務器獲得的

代理緩存配置示例

爲驗證緩存,這裏我將緩存超時時間設爲1分鐘

proxy_cache_path /data/cache levels=1:2 keys_zone=cache:10m max_size=100m inactive=1m use_temp_path=off;
    server {
        listen       80;
        server_name  wanger.com;
        include /etc/nginx/default.d/*.conf;
        location /wanger {
            proxy_pass http://192.168.0.52;
            proxy_cache cache;
            proxy_cache_valid 200 301 1m;
            add_header X-Cache $upstream_cache_status;
            proxy_cache_key $host$uri;
        }
   }     

可以看到第一次訪問並沒有命中緩存,而第二次訪問的時候已經建立好緩存了
nginx代理緩存與壓縮

查看緩存目錄,可以看到緩存文件已經存在,並且前兩級的目錄名是緩存文件名的後三個字符
nginx代理緩存與壓縮

進入後端服務器,添加響應頭字段X-Accel-Expires,並將值設置爲3

server {
        listen       80;
        server_name  localhost;
        add_header X-Accel-Expires 3;
location / {
                root    html;
                index   index.html;
        }
    }

再次進行測試,可以看到第一次請求顯示緩存已經過期
nginx代理緩存與壓縮

再次進入後端服務器,添加響應頭字段Vary,並將其值設置爲"*",並進行測試

server {
        listen       80;
        server_name  localhost;
        add_header X-Accel-Expires 3;
        add_header Vary *;
location / {
                root    html;
                index   index.html;
        }
    }

可以看到index.htm文件一直沒有被緩存
nginx代理緩存與壓縮

代理緩存清理

nginx提供了一個第三方模塊ngx_cache_purge,GitHub地址:https://github.com/FRiCKLE/ngx_cache_purge
安裝ngx_cache_purge模塊需要重新編譯nginx,並使用--add-module=模塊位置參數添加模塊到nginx裏

proxy_cache_purge語法

這裏需要用到proxy_cache_purge指令

語法 proxy_cache_purge zone_name key
默認 -
應用位置 location

配置示例

location ~ /purge(/.*) {
proxy_cache_purge cache $host$1;
}
location /wanger {
proxy_pass http://192.168.0.52;
proxy_cache cache;
proxy_cache_valid 200 301 1m;
add_header X-Cache $upstream_cache_status;
proxy_cache_key $host$uri;

代理緩存清理測試

由於我緩存過期時間設置的是1分鐘,當我命中緩存之後,就開始進行緩存清理測試,之後在一分鐘內再次訪問同一個URL,就發現緩存命中失敗了
nginx代理緩存與壓縮

gzip壓縮

gzip壓縮模塊提供了壓縮文件內容的功能,通過壓縮可以使服務器與瀏覽器之間傳輸的數據量更小,提高了客戶端的響應速度,但壓縮也會消耗nginx性能

指令解釋

  • gzip on|off:是否開啓gzip,默認爲off
  • gzip_buffers number size: number指服務器向系統申請緩存空間的個數,size指每個緩存空間的大小
  • gzip_comp_level [1-9]: 設置壓縮級別,默認爲1(級別越高,壓的越小,越浪費CPU計算資源)
  • gzip_disable regex:使用正則匹配某種瀏覽器類型不進行壓縮
  • gzip_min_length length:設置將被壓縮的響應的最小長度,默認爲20
  • gzip_types text/plain application/xml:對哪些類型的文件啓用壓縮,文件類型可以在nginx/mime.types文件裏查看
  • gzip_vary on|off:啓用或禁用插入“Vary:Accept-Encoding”響應頭字段

配置示例

server {
        listen       80;
        server_name  192.168.0.168;  
        gzip        on;
        gzip_types  image/jpeg;
        gzip_buffers 32 4K;
        gzip_min_length 100;
        gzip_comp_level 6;
        gzip_vary on;
}

測試壓縮配置

瀏覽器要禁用瀏覽器緩存,可以看到壓縮之後圖片大小是75.9KB,響應頭中也會多一個字段Content-Encoding: gzip
nginx代理緩存與壓縮

將gzip參數修改爲off,重載nginx,再來看圖片大小爲76.4KB
nginx代理緩存與壓縮


歡迎各位關注我的個人公衆號“沒有故事的陳師傅”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章