欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nginx proxy_cache 緩存配置詳解

 更新時(shí)間:2020年11月10日 15:36:20   作者:dengjiexian  
這篇文章主要介紹了nginx proxy_cache 緩存配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言:

由于本人工作原因,涉及到網(wǎng)絡(luò)直播領(lǐng)域,其中視頻的回放下載,涉及到了一些視頻下載方面的技術(shù)。針對(duì)于一個(gè)完整視頻的下載,目前市面上的主流做法是,先將整個(gè)視頻流切片,存儲(chǔ)到文件服務(wù)器中,在用戶需要觀看回放視頻時(shí)。通過一個(gè)視頻回源服務(wù)器,去文件服務(wù)器中逐個(gè)請(qǐng)求切片,返回給用戶播放。

今天著重探討的是關(guān)于回源服務(wù)器緩存的配置以及合理的緩存策略。

通過給回源服務(wù)器配置緩存的案例,詳細(xì)講解一整套緩存配置機(jī)制,并且可沿用到其他任何緩存配置場(chǎng)景中。

今天的講解分為四點(diǎn):

  • 回源服務(wù)器的工作是啥為啥
  • 需要給回源服務(wù)器加緩存
  • 如何配置緩存
  • 如何針對(duì)業(yè)務(wù)場(chǎng)景配置完備的緩存機(jī)制

回源服務(wù)器的工作:

回源服務(wù)器在下面敘述中簡(jiǎn)稱:源站 如圖所示,在文件下載的過程中,橫跨在cdn與文件服務(wù)器之間,作為下載樞紐。

源站架構(gòu):源站是nginx+php的webserver架構(gòu),如圖所示:


但如果源站只是簡(jiǎn)單的收到請(qǐng)求,然后下載資源,再返回,勢(shì)必會(huì)存在以下幾點(diǎn)不夠優(yōu)化的問題:

1、cdn可能存在多次回源現(xiàn)象

2、源站對(duì)同一資源的多次下載,存在網(wǎng)絡(luò)流量帶寬浪費(fèi),以及不必要的耗時(shí)。

所以為了優(yōu)化這些問題,需要給源站做一層緩存。緩存策略采用nginx自帶的proxy_cache模塊。

proxy_cache原理:

proxy_cache模塊的工作原理如圖所示:

 

如何配置proxy_cache模塊

在nginx.conf文件中添加如下代碼:

http{
  ......
  proxy_cache_path/data/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=1000g;
}

代碼說明:

proxy_cache_path 緩存文件路徑

levels 設(shè)置緩存文件目錄層次;levels=1:2 表示兩級(jí)目錄

keys_zone 設(shè)置緩存名字和共享內(nèi)存大小

inactive 在指定時(shí)間內(nèi)沒人訪問則被刪除

m ax_size 最大緩存空間,如果緩存空間滿,默認(rèn)覆蓋掉緩存時(shí)間最長的資源。

當(dāng)配置好之后,重啟nginx,如果不報(bào)錯(cuò),則配置的proxy_cache會(huì)生效

查看   proxy_cache_path / data/ nginx / 目錄, 會(huì)發(fā)現(xiàn)生成了 tmp -test 文件夾。

如何使用proxy_cache

在你對(duì)應(yīng)的nginx vhost server配置文件中添加如下代碼:

location /tmp-test/ {
 proxy_cache tmp-test;
 proxy_cache_valid 200 206 304 301 302 10d;
 proxy_cache_key $uri;
 proxy_set_header Host $host:$server_port;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_passhttp://127.0.0.1:8081/media_store.php/tmp-test/;
}

配置項(xiàng)介紹: Proxy_cache tmp -test 使用名為 tmp -test 的對(duì)應(yīng)緩存配置

proxy_cache_valid  200 206 304 301 302 10d; 對(duì)httpcode為200…的緩存10天

proxy_cache_key $uri  定義緩存唯一key,通過唯一key來進(jìn)行hash存取

proxy_set_header  自定義http header頭,用于發(fā)送給后端真實(shí)服務(wù)器。

proxy_pass   指代理后轉(zhuǎn)發(fā)的路徑,注意是否 需要 最后的 /

到這里,最基本的 proxy_cache 功能就配置成功了。當(dāng)uri成功匹配到該location,則proxy_cache就會(huì)生效。

添加proxy_cache之后,請(qǐng)求過程的變化:

1、第一次訪問:

 

第一次訪問,proxy_cache并沒有找到對(duì)應(yīng)的緩存文件(未命中緩存MISS),所以當(dāng)?shù)谝淮握?qǐng)求完成的同時(shí),proxy_cache會(huì)保持緩存:

2、保存緩存,如圖所示:

 

3、同一個(gè)url第二次訪問,當(dāng)同一個(gè)文件再次到達(dá)源站,proxy_cache就會(huì)找到其對(duì)應(yīng)的緩存文件(命中緩存HIT)直接返回給請(qǐng)求端,無需再執(zhí)行php程序,如圖所示:

 

提出疑問:

到此,就完成了最基本的proxy_cache配置和訪問過程介紹,但是最基本的配置,往往無法滿足我們的業(yè)務(wù)需求,我們往往會(huì)提出以下幾點(diǎn)疑問和需求:

  1. 需要主動(dòng)清理緩存文件
  2. 寫入路徑為一塊磁盤,如果磁盤打滿該怎么解決?
  3. 如何讓源站支持?jǐn)帱c(diǎn)續(xù)傳,以及斷點(diǎn)續(xù)傳的緩存策略
  4. 如果請(qǐng)求端 range 請(qǐng)求(分片下載)一個(gè)大資源,同樣的uri,如何區(qū)別請(qǐng)求?
  5. 還需要告訴請(qǐng)求端,資源的過期時(shí)間
  6. 日志統(tǒng)計(jì),如何配置命中與不命中字段,如何做統(tǒng)計(jì)?

面對(duì)以上疑問,我們一個(gè)一個(gè)解決。

問題一:主動(dòng)清理緩存

采用:nginx  proxy_cache_purge 模塊 ,該模塊與proxy_cache成對(duì)出現(xiàn),功能正好相反。 設(shè)計(jì)方法:在nginx中,另啟一個(gè)server,當(dāng)需要清理響應(yīng)資源的緩存時(shí),在本機(jī)訪問這個(gè)server。 例如: 訪問 127.0.0.1:8083/tmp-test/TL39ef7ea6d8e8d48e87a30c43b8f75e30.txt 即可清理該資源的緩存文件。 配置方法:

location /tmp-test/ {
        allow 127.0.0.1; //只允許本機(jī)訪問
        deny all; //禁止其他所有ip
        proxy_cache_purge tmp-test $uri; //清理緩存
    }

proxy_cache_purge:緩存清理模塊 tmp-test:指定的key_zone $uri:指定的生成key的參數(shù) proxy_cache_purge緩存清理過程,如圖所示:

 

問題二:緩存文件強(qiáng)磁盤打滿該怎么辦?

由于寫入路徑為一個(gè)單一目錄,只能寫入一塊磁盤。一塊磁盤很快就會(huì)被打滿,解決該問題有如下兩種方法:

1、將多塊磁盤做磁盤陣列? 缺點(diǎn)是:減小了實(shí)際的存儲(chǔ)空間。

2、巧妙得運(yùn)用proxy_cache_path的目錄結(jié)構(gòu),由于levels=1:2,這導(dǎo)致緩存文件的目錄結(jié)構(gòu)為兩層,每層目錄名,都是由hash函數(shù)生成。如圖所示:

 

總共含有16*16*16=4096個(gè)文件目錄。對(duì)該一級(jí)目錄進(jìn)行軟連接,分別將0-f軟連接到你所需要的指定磁盤目錄上,如圖所示:

 

通過軟鏈的方法,實(shí)現(xiàn):將不同盤下的目錄作為真正存放數(shù)據(jù)的路徑,解決了多盤利用,單盤被打滿的問題。

問題三:支持range(斷點(diǎn)續(xù)傳)

添加上緩存代理之后,客戶端發(fā)起的range請(qǐng)求將會(huì)失效,如下圖所示:

 

導(dǎo)致range參數(shù)無法傳遞到下一級(jí)的原因如下:

當(dāng)緩存代理轉(zhuǎn)發(fā)http請(qǐng)求到后端服務(wù)器時(shí),http header會(huì)改變,header中的部分參數(shù),會(huì)被取消掉。其中range參數(shù)被取消,導(dǎo)致,后端nginx服務(wù)器沒有收到range參數(shù),最終導(dǎo)致這個(gè)分片下載不成功。所以需要對(duì)代理轉(zhuǎn)發(fā)的header進(jìn)行配置。 例如:

location /tmp-test/ {
        proxy_cache tmp-test;
        proxy_cache_valid 200 206 304 301 302 10d;
        proxy_cache_key $uri;
        proxy_set_header Range $http_range;
        proxy_pass http://127.0.0.1:8081/media_store.php/tmp-test/;
}

紅色部分的含義:將http請(qǐng)求中的range值($http_range)放到代理轉(zhuǎn)發(fā)的http請(qǐng)求頭中作為參數(shù)range的值。

問題四,當(dāng)支持range加載后,proxy_cache_key,則需要重新配置:

如果請(qǐng)求端 Range請(qǐng)求(分片下載)一個(gè)大資源,同樣的uri,proxy cache如何識(shí)別資源對(duì)應(yīng)的key。 由于nginx配置為:proxy_cache_key $uri,用uri作為key 所以當(dāng)請(qǐng)求為普通請(qǐng)求和range請(qǐng)求時(shí),都是同樣的uri作為key。proxy_cache將有可能導(dǎo)致錯(cuò)誤返回。如下圖所示:

 

解決方法如下: 修改proxy_cache_key ,配置proxy_cache_key $http_range$uri; 這樣就能解決:key唯一性??梢员苊獠还苁钦U?qǐng)求還是不同的range請(qǐng)求,第一次獲取的內(nèi)容和之后獲取的緩存內(nèi)容都不會(huì)出現(xiàn)異常。

問題五:如何配置-返回過期時(shí)間

需要通過返回過期時(shí)間來指定請(qǐng)求端,哪些資源需要緩存,哪些資源不緩存,

參數(shù) 正常請(qǐng)求 range請(qǐng)求
返回過期時(shí)間 返回 不返回

為了防止請(qǐng)求端將分片資源當(dāng)做完整資源緩存起來,我們需要對(duì)正常請(qǐng)求,返回過期時(shí)間;對(duì)range請(qǐng)求, 不返回過期時(shí)間。 解決該問題,通過對(duì)nginx配置即可解決:

location /media_store.php {
   fastcgi_pass  127.0.0.1:9000;
   fastcgi_index media_store.php;
   fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
   include    fastcgi_params;
   if ( $http_range = ''){
     expires 2592000s;
   }
}

在proxy_pass代理之后的location中加入對(duì)$http_range的判斷,expires 表示過期時(shí)間。 2592000s指緩存過期時(shí)間。

問題七:緩存命中情況如何在http頭中體現(xiàn),以及在nginx日志中查看

解決方法:

 利用nginx $upstream_cache_status變量:該變量代表緩存命中的狀態(tài),

如果命中,為HIT;如果未命中,為MISS

在返回nginx server配置中添加:

add_header Nginx-Cache "$upstream_cache_status";

在nginxlog中添加:

log_format combinedio …$upstream_cache_status;

http返回head截圖:

 

nginx log日志截圖:

 

總結(jié):

整個(gè)一套完備的緩存策略就介紹到此,這套方案中不僅實(shí)現(xiàn)了基本的緩存配置,還解決了實(shí)際場(chǎng)景應(yīng)用中會(huì)遇到的,磁盤擴(kuò)展,緩存清理,斷點(diǎn)續(xù)傳,緩存過期時(shí)間,緩存命中提示等問題,只要將這套方案靈活運(yùn)用,不管是再復(fù)雜的場(chǎng)景,基本都能滿足需求。以上都是我在工作中爬過的坑,不斷完善總結(jié)出的結(jié)果,希望對(duì)讀者能有幫助。

到此這篇關(guān)于nginx proxy_cache 緩存配置詳解的文章就介紹到這了,更多相關(guān)nginx proxy_cache 緩存 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nginx中狀態(tài)統(tǒng)計(jì)的實(shí)現(xiàn)

    nginx中狀態(tài)統(tǒng)計(jì)的實(shí)現(xiàn)

    本文主要介紹了nginx中狀態(tài)統(tǒng)計(jì)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • windows查看nginx是否啟動(dòng)的四種方法

    windows查看nginx是否啟動(dòng)的四種方法

    本文主要介紹了windows查看nginx是否啟動(dòng)的兩種方法,文中通過圖文代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Nginx中實(shí)現(xiàn)訪問HTTP請(qǐng)求時(shí)自動(dòng)跳轉(zhuǎn)到HTTPS請(qǐng)求

    Nginx中實(shí)現(xiàn)訪問HTTP請(qǐng)求時(shí)自動(dòng)跳轉(zhuǎn)到HTTPS請(qǐng)求

    本文主要介紹了Nginx中實(shí)現(xiàn)訪問HTTP請(qǐng)求時(shí)自動(dòng)跳轉(zhuǎn)到HTTPS請(qǐng)求,下面介紹了兩種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 詳解通過Nginx部署Django(基于ubuntu)

    詳解通過Nginx部署Django(基于ubuntu)

    這篇文章主要介紹了詳解通過Nginx部署Django(基于ubuntu),Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比較常見的一種方式,有興趣的可以了解一下。
    2017-01-01
  • nginx的location的優(yōu)先級(jí)和匹配方式

    nginx的location的優(yōu)先級(jí)和匹配方式

    location是Nginx中的塊級(jí)指令,本文主要介紹了nginx的location的優(yōu)先級(jí)和匹配方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Nginx流量拷貝ngx_http_mirror_module模塊使用方法詳解

    Nginx流量拷貝ngx_http_mirror_module模塊使用方法詳解

    這篇文章主要介紹了Nginx流量拷貝,Nginx專門提供了ngx_http_mirror_module模塊,用來實(shí)現(xiàn)流量拷貝。將生產(chǎn)環(huán)境的流量拷貝到預(yù)上線環(huán)境或測(cè)試環(huán)境
    2022-04-04
  • Nginx 配置TCP代理轉(zhuǎn)發(fā)的實(shí)現(xiàn)

    Nginx 配置TCP代理轉(zhuǎn)發(fā)的實(shí)現(xiàn)

    本文主要介紹了使用Nginx新版的stream方式,實(shí)現(xiàn)TCP/UDP代理轉(zhuǎn)發(fā),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 使用Nginx創(chuàng)建臨時(shí)和永久重定向的具體示例

    使用Nginx創(chuàng)建臨時(shí)和永久重定向的具體示例

    HTTP 重定向 是將一個(gè)域名或地址指向另一個(gè)的方法,有幾種不同類型的重定向,每種對(duì)客戶端瀏覽器意味著不同的事情,最常見的兩種類型是臨時(shí)重定向和永久重定向,本文給大家介紹了使用Nginx創(chuàng)建臨時(shí)和永久重定向的具體示例,需要的朋友可以參考下
    2024-07-07
  • Mac上搭建nginx+rtmp直播服務(wù)器的步驟詳解

    Mac上搭建nginx+rtmp直播服務(wù)器的步驟詳解

    最近的直播很火,所以這篇文章跟大家分享了在Mac上搭建nginx+rtmp直播服務(wù)器的步驟,文章通過一步步圖文介紹的很詳細(xì),有需要的朋友們可以參考借鑒。
    2016-09-09
  • nginx basic認(rèn)證的實(shí)現(xiàn)示例

    nginx basic認(rèn)證的實(shí)現(xiàn)示例

    auth_basic作為一個(gè)認(rèn)證模塊,在apache和nginx中都很常用,本文主要介紹了nginx basic認(rèn)證的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08

最新評(píng)論