# 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; } }