Nginx 緩存配置


# Buffer和Cache
# Buffer(緩沖):
# 客戶端訪問服務器某個資源文件的時候,因為服務器的性能遠遠比客戶端機子的性能好,所以服務器要返回客戶端所訪問的資源的時候,服務器發送的速度遠比客戶端讀取的速度要快,所以服務器先把資源放到緩沖中,讓客戶端慢慢讀取。
# Cache(緩存):
# 客戶端頻繁訪問服務器某個資源的時候,服務器上的資源沒有改動,每次客戶端訪問的時候都需要從硬盤中讀取到內存,然后返回到客戶端。Cache緩存就減少了讀取硬盤的頻率,它是把頻繁訪問的文件一直放到緩存中,當客戶端訪問的時候直接從緩存中返回。

# nginx緩存流程
# 1.生成一個資源對應的唯一值key:URL + .[其他標識] = key
# 2.然后根據key進行MD5運算生成一個密文:key + MD5 = 字符串(密文)
# 3.緩存目錄:/usr/local/proxy_cache
# 4.因為如果將所有緩存的資源都存放在同一個目錄的話,緩存文件一多的話將會影響緩存檢索速度。所以解決方案是:
# 根據字符串密文來創建目錄進行存放:/usr/local/proxy_cache/a/d5/...
# 5.判斷緩存目錄有沒有所訪問的數據,有的話就從緩存中返回
# Nginx緩存的時候會將404、301、302也進行緩存
# 那么問題來了,緩存資源和服務器資源不一致怎么辦?
# Nginx可以設置緩存資源的有效期來控制。

# Nginx緩存設置的相關指令
# Nginx的web緩存服務主要是使用ngx_http_proxy_module模塊相關指令集來完成
# proxy_cache_path指令:用於設置緩存文件的存放路勁
# 語法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size]
# 默認值:無
# 位置:http
# path:緩存路勁地址,如:/usr/local/proxy_cache
# levels:指定該緩存控件對應的目錄層次,最多可以設置3層,每層取值為1|2。具體這個目錄名怎么來的,上面講了nginx緩存流程,該目錄名是根據第2步中key + MD5 = 字符串(密文)的字符串密文來創建的;假設有一個密文為:e10adc3949ba59abbe56e057f20f883e。
# 如果設置:level=1:2,那么該密文資源緩存存放在/usr/local/proxy_cache/e/83目錄下。
# 如果設置:level=2:1:2,那么該密文資源緩存存放在/usr/local/proxy_cache/3e/8/f8目錄下。
# 注意最多只能設置3層
# keys_zone:用來為這個緩存區設置名稱和指定大小,這里設置的大小指的是存放keys的大小,如:keys_zone=itcast:200m   緩存區的名稱是itcast,大小為200M,1M大概能存儲8000個keys。
# inactive:指定緩存的數據多久時間未被訪問就會被刪除,如:inactive=1d   緩存數據在1天內沒有被訪問就會被刪除
# max_size:設置最大緩存空間,如果緩存空間存滿,默認覆蓋緩存時間最長的資源,如:max_size=20g
# 實例配置
http {
  proxy_cache_path /usr/local/proxy_cache keys_znoe=itcast:200m levels=1:2:2 inactive=1d max_size=20g;
}

# proxy_cache:該指令用來開啟或關閉代理緩存,如果開啟則自定使用哪個緩存區來進行緩存
# 語法:proxy_cache zone_name|off;    # zone_name就是上面proxy_cache_path配置的keys_zone中的name
# 默認:off
# 位置:http、server、location

# proxy_cache_key:該指令用來設置web緩存的key值,Nginx會根據key值MD5哈希存緩存,也就是“nginx緩存流程”中的第1步,key生成的參數配置
# 語法:proxy_cache_key key;
# 默認:proxy_cache_key $scheme$proxy_host$request_uri;
# 位置:http、server、location

# proxy_cache_valid:該指令用來對不同返回響應狀態碼的URL設置不同的緩存時間
# 語法:proxy_cache_valid [code ...] time
# 默認值:無
# 位置:http、server、location
# 如:為200和302的響應URL設置10分鍾緩存,為404的響應URL設置1分鍾緩存
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1m;  # 對所有響應狀態碼的URL都設置1分鍾緩存。這里具體哪個生效:從上往下找到,滿足就不往下找了。


# proxy_cache_min_uses:該指令用來設置資源被訪問多少次后被緩存
# 語法:proxy_cache_min_uses number;
# 默認值:1;  
# 位置:http、server、location

# proxy_cache_methods:該指令用戶設置緩存哪些HTTP方法
# 語法:proxy_cache_methods GET | HEAD | POST;
# 默認值:GET HEAD;
# 位置:http、server、location

# 例子:
http {
  proxy_cache_path /usr/local/proxy_cache levels=2:2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
  upstream backend {
    server 192.168.100.1:8080;
  }
  server {
    listen 8080;
    server_name: localhost;
    location / {
      proxy_cache itcast;
      #proxy_cache_key itheima;  # 這里設置的固定值,當前目錄有多個文件的話,緩存就會出問題
      proxy_cache_key $scheme$proxy_host$request_uri;  # 協議+主機名+資源uri,這樣每個資源都能有自己的key
      proxy_cache_min_uses 5;
      proxy_cache_valid 200 5d;
      proxy_cache_valid 404 30s;
      proxy_cache_valid any 1m;
      add_header ngin-cache "$upstream_cache_status";
      proxy_pass http://backend/js/;
    }
  }
}

# 刪除相關緩存
# 方式一:直接刪除目錄
# 方式二:使用第三方擴展模塊 ngx_cache_purge
# 安裝方式之前也有安裝過
# 七層負載均衡 安裝過fair:https://www.cnblogs.com/watermeloncode/p/15497613.html
# 下載:ngx_cache_purge-2.3.tar.gz然后壓縮配置configure……
http {
  proxy_cache_path /usr/local/proxy_cache levels=2:2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
  upstream backend {
    server 192.168.100.1:8080;
  }
  server {
    listen 8080;
    server_name: localhost;
    location / {
      proxy_cache itcast;
      proxy_cache_key itheima;  
      proxy_cache_min_uses 5;
      proxy_cache_valid 200 5d;
      proxy_cache_valid 404 30s;
      proxy_cache_valid any 1m;
      add_header ngin-cache "$upstream_cache_status";
      proxy_pass http://backend/js/;
    }
    location ~ /purge(/.*) {
      proxy_cache_purge itcast itherma;  # 刪除緩存
    }
  }
}

# proxy_no_cache:該指令定義不將數據進行緩存的條件
# 語法:proxy_no_cache string ...;
# 默認值:無
# 位置:http、server、location
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;  # 這里每一個變量都是條件,當變量的值為0或者空,則代表不成立,否則就是成立。這里只有當$cookie_nocache $arg_nocache $arg_comment只要其中有一個條件成立就不會緩存

# proxy_cache_bypass:該指令是用來設置不從緩存中獲取數據的條件
# 語法:proxy_cache_bypass string ...;
# 默認值:無
# 位置:http、server、location
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

http {
  proxy_cache_path /usr/local/proxy_cache levels=2:2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
  upstream backend {
    server 192.168.100.1:8080;
  }
  server {
    listen 8080;
    server_name: localhost;
    location / {
      if ($request_uri ~ /.*\.js$){
        set $mychoise 1;
      }
      proxy_cache itcast;
      proxy_cache_key itheima;  
      proxy_cache_min_uses 5;
      proxy_cache_valid 200 5d;
      proxy_cache_valid 404 30s;
      proxy_cache_valid any 1m;
      proxy_no_cache $cookie_nocache $arg_nocache $arg_comment $mychoise;
      proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment $mychoise;
      add_header ngin-cache "$upstream_cache_status";
      proxy_pass http://backend/js/;
    }
    location ~ /purge(/.*) {
      proxy_cache_purge itcast itherma;  # 刪除緩存
    }
  }
}

# $cookie_nocache:代表當前請求cookie中鍵的名稱為nocache對應的值
# $arg_nocache:指的是當前請求參數中美味nocache的值
# $arg_comment:指的是當前請求參數中美味comment的值
# 你可以這樣去獲取他們的值

log_format params $cookie_nocache | $arg_nocache | $arg_comment
server {
  listen 8081;
  server_name localhost;
  location / {
    access_log logs/access_params.log params;
    root html;
    index index.html;
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM