日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx proxy_cache缓存详解

發(fā)布時(shí)間:2025/3/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx proxy_cache缓存详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 1. 關(guān)于緩沖區(qū)指令
    • 1.1 proxy_buffer_size
    • 1.2 proxy_buffering
    • 1.3 proxy_buffers
    • 1.4 proxy_busy_buffers_size
    • 1.5 proxy_max_temp_file_size
    • 1.6 proxy_temp_file_write_size
    • 1.7 緩沖區(qū)配置實(shí)例
  • 2. 常用配置項(xiàng)
    • 2.1 proxy_cache_path
    • 2.2 proxy_temp_path
    • 2.3 proxy_cache
    • 2.4 proxy_cache_key
    • 2.5 proxy_cache_valid
    • 2.6 proxy_ignore_headers
    • 2.7 proxy_hide_header
    • 2.8 proxy_pass_header
    • 2.9 proxy_cache_min_uses
    • 2.10 proxy_cache_use_stale
    • 2.11 proxy_cache_lock
    • 2.12 proxy_cache_bypass
    • 2.13 proxy_no_cache
  • 3. 其他一些配置
    • 3.1 proxy_cache_lock_timeout
    • 3.2 proxy_read_timeout
    • 3.3 proxy_connect_timeout
    • 3.4 proxy_send_timeout
    • 3.5 proxy_http_version
    • 3.6 proxy_ignore_client_abort
    • 3.7 proxy_intercept_errors
    • 3.8 proxy_next_upstream
    • 3.9 proxy_cookie_domain
    • 3.10 proxy_cookie_path
    • 3.11 proxy_pass
    • 3.12 proxy_redirect
    • 3.13 proxy_set_header
    • 3.14 proxy_store
  • 4. 其他一些問題
    • 4.1 緩存動(dòng)態(tài)內(nèi)容
    • 4.2 緩存不生效問題
    • 4.2 緩存過期問題
    • 4.3 緩存清除問題
    • 4.4 緩存命中率
    • 4.5 如何實(shí)現(xiàn)動(dòng)靜分離
  • 參考網(wǎng)址

1. 關(guān)于緩沖區(qū)指令

1.1 proxy_buffer_size

?
  • 語法: proxy_buffer_size size;

  • 默認(rèn)值: proxy_buffer_size 4k|8k;

  • 上下文: http, server, location

  • 該緩沖用于來自上游服務(wù)器響應(yīng)的開始部分,在該部分通常包含一個(gè)小小的響應(yīng)頭
  • 該緩沖區(qū)大小默認(rèn)等于proxy_buffers指令設(shè)置的一塊緩沖區(qū)的大小,沒有必要也跟著設(shè)置太大。 proxy_buffer_size最好單獨(dú)設(shè)置,一般設(shè)置個(gè)4k就夠了,但它也可以被設(shè)置得更小。
  • 一塊緩沖區(qū)的大小通常等于一個(gè)內(nèi)存頁的大小(4K或者8K),獲取Linux 內(nèi)存頁(基頁)大小的命令:getconf PAGE_SIZE,一般的輸出是4096,即 4KB。
  • 1.2 proxy_buffering

    ?
  • 語法: proxy_buffering on | off;

  • 默認(rèn)值: proxy_buffering on;

  • 上下文: http, server, location

  • 該指令控制緩沖是否啟用。默認(rèn)情況下,它的值是“on”。如果這個(gè)設(shè)置為off,那么proxy_buffers和proxy_busy_buffers_size這兩個(gè)指令將會(huì)失效。 但是無論proxy_buffering是否開啟,對(duì)proxy_buffer_size配置都會(huì)起作用。
  • 當(dāng)開啟緩沖時(shí),nginx盡可能快地從被代理的服務(wù)器接收響應(yīng),再將它存入proxy_buffer_size和proxy_buffers指令設(shè)置的緩沖區(qū)中。如果響應(yīng)無法整個(gè)納入內(nèi)存,那么其中一部分將存入磁盤上的臨時(shí)文件,某些請(qǐng)求的響應(yīng)過大,則超過_buffers的部分將被緩沖到硬盤, 當(dāng)然這將會(huì)使讀取響應(yīng)的速度減慢, 影響用戶體驗(yàn)。通過proxy_max_temp_file_size和proxy_temp_file_write_size指令可以控制臨時(shí)文件的寫入。
  • 當(dāng)關(guān)閉緩沖時(shí),收到響應(yīng)后,nginx立即將其同步傳給客戶端。nginx不會(huì)嘗試從被代理的服務(wù)器讀取整個(gè)請(qǐng)求,而是將proxy_buffer_size指令設(shè)定的大小作為一次讀取的最大長度(所以無論是否開啟,proxy_buffer_size都起作用)。每次傳輸內(nèi)容小了,效率肯定會(huì)有影響。
  • 響應(yīng)頭“X-Accel-Buffering”傳遞“yes”或“no”可以動(dòng)態(tài)地開啟或關(guān)閉代理的緩沖功能。 這個(gè)能力可以通過proxy_ignore_headers指令關(guān)閉。
  • proxy_buffering啟用時(shí),要提防使用的代理緩沖區(qū)太大。這可能會(huì)吃掉你的內(nèi)存,限制代理能夠支持的最大并發(fā)連接數(shù)。

    1.3 proxy_buffers

    ?
  • 語法: proxy_buffers number size;

  • 默認(rèn)值: proxy_buffers 8 4k|8k;

  • 上下文: http, server, location

  • 為每個(gè)連接設(shè)置緩沖區(qū)的數(shù)量為number,每塊緩沖區(qū)的大小為size。這些緩沖區(qū)用于保存從被代理的服務(wù)器讀取的響應(yīng)。
  • proxy_buffers的緩沖區(qū)大小一般會(huì)設(shè)置的比較大,以應(yīng)付大網(wǎng)頁。proxy_buffers當(dāng)中單個(gè)緩沖區(qū)的大小是由系統(tǒng)的內(nèi)存頁面大小決定的,Linux系統(tǒng)中一般為4k。 proxy_buffers由緩沖區(qū)數(shù)量和緩沖區(qū)大小組成的。總的大小為number*size。
  • 1.4 proxy_busy_buffers_size

    ?
  • 語法: proxy_busy_buffers_size size;

  • 默認(rèn)值: proxy_busy_buffers_size 8k|16k;

  • 上下文: http, server, location

  • 當(dāng)開啟緩沖響應(yīng)的功能以后,在沒有讀到全部響應(yīng)的情況下,寫緩沖到達(dá)一定大小時(shí),nginx一定會(huì)向客戶端發(fā)送響應(yīng),直到緩沖小于此值。這條指令用來設(shè)置此值。
  • 同時(shí),剩余的緩沖區(qū)可以用于接收響應(yīng),如果需要,一部分內(nèi)容將緩沖到臨時(shí)文件。該大小默認(rèn)是proxy_buffer_size和proxy_buffers指令設(shè)置單塊緩沖大小的兩倍。
  • 1.5 proxy_max_temp_file_size

    ?
  • 語法: proxy_max_temp_file_size size;

  • 默認(rèn)值: proxy_max_temp_file_size 1024m;

  • 上下文: http, server, location

  • 打開響應(yīng)緩沖以后,如果整個(gè)響應(yīng)不能存放在proxy_buffer_size和proxy_buffers指令設(shè)置的緩沖區(qū)內(nèi),部分響應(yīng)可以存放在臨時(shí)文件中。 這條指令可以設(shè)置臨時(shí)文件的最大容量。而每次寫入臨時(shí)文件的數(shù)據(jù)量則由proxy_temp_file_write_size指令定義。
  • 寫入硬盤的臨時(shí)文件的大小,如果超過了這個(gè)值, Nginx將與Proxy服務(wù)器同步的傳遞內(nèi)容, 而不再緩沖到硬盤. 設(shè)置為0時(shí),將禁止響應(yīng)寫入臨時(shí)文件,也就相當(dāng)于直接關(guān)閉硬盤緩沖。
  • 1.6 proxy_temp_file_write_size

    ?
  • 語法: proxy_temp_file_write_size size;

  • 默認(rèn)值: proxy_temp_file_write_size 8k|16k;

  • 上下文: http, server, location

  • 在開啟緩沖后端服務(wù)器響應(yīng)到臨時(shí)文件的功能后,設(shè)置nginx每次寫數(shù)據(jù)到臨時(shí)文件的size(大小)限制。 size的默認(rèn)值是proxy_buffer_size指令和proxy_buffers指令定義的每塊緩沖區(qū)大小的兩倍, 而臨時(shí)文件最大容量由proxy_max_temp_file_size指令設(shè)置。

    1.7 緩沖區(qū)配置實(shí)例

    通用網(wǎng)站的配置

    ?
  • proxy_buffer_size 4k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小

  • proxy_buffers 4 32k; #proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的設(shè)置

  • proxy_busy_buffers_size 64k; #高負(fù)荷下緩沖大小(proxy_buffers*2)

  • proxy_temp_file_write_size 64k;

  • #設(shè)定緩存文件夾大小,大于這個(gè)值,將從upstream服務(wù)器傳

  • docker registry的配置 這個(gè)每次傳輸至少都是9M以上的內(nèi)容,緩沖區(qū)配置大;

    ?
  • proxy_buffering on;

  • proxy_buffer_size 4k;

  • proxy_buffers 8 1M;

  • proxy_busy_buffers_size 2M;

  • proxy_max_temp_file_size 0;

  • 關(guān)于緩沖區(qū)大小的配置,還是需要實(shí)地的分析,一般來說通用配置可以應(yīng)付了。

    2. 常用配置項(xiàng)

    2.1 proxy_cache_path

    ?
  • 語法: proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time];

  • 默認(rèn)值: —

  • 上下文: http

    • path 指定緩存文件目錄,和 proxy_temp_path 最好設(shè)置在同一文件分區(qū)下,緩存內(nèi)容是先寫在 temp_path,臨時(shí)文件和緩存可以放在不同的文件系統(tǒng),將導(dǎo)致文件在這兩個(gè)文件系統(tǒng)中進(jìn)行拷貝,而不是廉價(jià)的重命名操作。因此,針對(duì)任何路徑,都建議將緩存和proxy_temp_path指令設(shè)置的臨時(shí)文件目錄放在同一文件系統(tǒng)。
    • level 定義了緩存的層次結(jié)構(gòu),每層可以用1(最多16中選擇,0-f)或2(最多256種選擇,00-ff)表示,中間用 [冒號(hào)] 分隔。“l(fā)evels=1:2”表示開啟1、2層級(jí)(第2層級(jí)理論有16*256個(gè)目錄)。
    ?
  • proxy_cache_path /data/nginx/cache; # 所有緩存只有一個(gè)目錄

  • /data/nginx/cache/d7b6e5978e3f042f52e875005925e51b

  • ?
  • proxy_cache_path /data/nginx/cache levels=1:2; # 第二層級(jí)有16*256=4096個(gè)目錄

  • /data/nginx/cache/b/51/d7b6e5978e3f042f52e875005925e51b

  • ?
  • proxy_cache_path /data/nginx/cache levels=1:1:1; #第三層級(jí)有16*16*16個(gè)目錄

  • /data/nginx/cache/b/1/5/d7b6e5978e3f042f52e87500592

  • ?
  • proxy_cache_path /data/nginx/cache levels=2; # 第一層級(jí)有256個(gè)目錄

  • /data/nginx/cache/1b/d7b6e5978e3f042f52e875005925e51b

    • keys_zone 指定一個(gè)共享內(nèi)存空間zone,所有活動(dòng)的鍵和緩存數(shù)據(jù)相關(guān)的信息都被存放在共享內(nèi)存中,這樣nginx可以快速判斷一個(gè)request是否命中或者未命中緩存,1m可以存儲(chǔ)8000個(gè)key,10m可以存儲(chǔ)80000個(gè)key;
    • inactive inactive=30m 表示 30 分鐘沒有被訪問的文件會(huì)被 cache manager 刪除,inactive的默認(rèn)值是10分鐘。 需要注意的是,inactive和expired配置項(xiàng)的含義是不同的,expired只是緩存過期,但不會(huì)被刪除,inactive是刪除指定時(shí)間內(nèi)未被訪問的緩存文件
    • max_size cache存儲(chǔ)的最大尺寸,如果不指定,會(huì)用掉所有磁盤空間,當(dāng)尺寸超過,將會(huì)基于LRU算法移除數(shù)據(jù),以減少占用大小。nginx啟動(dòng)時(shí),會(huì)創(chuàng)建一個(gè)“Cache manager”進(jìn)程,通過“purge”方式移除數(shù)據(jù)。
    • loader_files “cache loader”進(jìn)程遍歷文件時(shí),每次加載的文件個(gè)數(shù)。默認(rèn)為100.
    • loader_threshold 每次遍歷消耗時(shí)間上限。默認(rèn)為200毫秒。
    • loader_sleep 一次遍歷之后,停頓的時(shí)間間隔,默認(rèn)為50毫秒。

    需要注意的是:

    特殊進(jìn)程“cache manager”監(jiān)控緩存的條目數(shù)量,如果超過max_size參數(shù)設(shè)置的最大值,使用LRU算法移除緩存數(shù)據(jù)。nginx新啟動(dòng)后不就,特殊進(jìn)程“cache loader”就被啟動(dòng)。該進(jìn)程將文件系統(tǒng)上保存的過去緩存的數(shù)據(jù)的相關(guān)信息重新加載到共享內(nèi)存。加載過程分多次迭代完成,每次迭代,進(jìn)程只加載不多于loader_files參數(shù)指定的文件數(shù)量(默認(rèn)值為100)。此外,每次迭代過程的持續(xù)時(shí)間不能超過loader_threshold參數(shù)的值(默認(rèn)200毫秒)。每次迭代之間,nginx的暫停時(shí)間由loader_sleep參數(shù)指定(默認(rèn)50毫秒)。緩存文件并不是越多越好,所以 cache_key 的設(shè)計(jì)非常關(guān)鍵。代理或 URL 跳轉(zhuǎn)常常會(huì)添加的無用請(qǐng)求參數(shù),這就會(huì)出現(xiàn)不同的 cache_key 保存了多份相同的緩存內(nèi)容,這對(duì)緩存效果影響很大。

    2.2 proxy_temp_path

    ?
  • 語法: proxy_temp_path path [level1 [level2 [level3]]];

  • 默認(rèn)值:

  • proxy_temp_path proxy_temp;

  • 上下文: http, server, location

  • 定義從后端服務(wù)器接收的臨時(shí)文件的存放路徑,可以為臨時(shí)文件路徑定義至多三層子目錄的目錄樹。 比如,下面配置

    proxy_temp_path /spool/nginx/proxy_temp 1 2;

    那么臨時(shí)文件的路徑看起來會(huì)是這樣:

    /spool/nginx/proxy_temp/7/45/00000123457

    2.3 proxy_cache

    ?
  • 語法: proxy_cache zone | off;

  • 默認(rèn)值: proxy_cache off;

  • 上下文: http, server, location

  • 指定用于頁面緩存的共享內(nèi)存。同一塊共享內(nèi)存可以在多個(gè)地方使用。off參數(shù)可以屏蔽從上層配置繼承的緩存功能。zone名稱由“proxy_cache_path”指令定義。

    2.4 proxy_cache_key

    ?
  • 語法: proxy_cache_key string;

  • 默認(rèn)值:

  • proxy_cache_key $scheme$proxy_host$request_uri;

  • 上下文: http, server, location

  • 定義如何生成緩存的鍵,比如

    proxy_cache_key "$host$request_uri $cookie_user";

    這條指令的默認(rèn)值類似于下面字符串

    proxy_cache_key $scheme$proxy_host$uri$is_args$args;

    緩存文件并不是越多越好,所以 cache_key 的設(shè)計(jì)非常關(guān)鍵。代理或 URL 跳轉(zhuǎn)常常會(huì)添加的無用請(qǐng)求參數(shù),這就會(huì)出現(xiàn)不同的 cache_key 保存了多份相同的緩存內(nèi)容,這對(duì)緩存效果影響很大。通過 ngx_lua 可以對(duì) URL 參數(shù)進(jìn)行過濾,保證 cache_key 唯一。

    2.5 proxy_cache_valid

    ?
  • 語法: proxy_cache_valid [code ...] time;

  • 默認(rèn)值: —

  • 上下文: http, server, location

  • 為不同的響應(yīng)狀態(tài)碼設(shè)置不同的緩存時(shí)間。比如,下面指令

    ?
  • proxy_cache_valid 200 302 10m;

  • proxy_cache_valid 404 1m;

  • 設(shè)置狀態(tài)碼為200和302的響應(yīng)的緩存時(shí)間為10分鐘,狀態(tài)碼為404的響應(yīng)的緩存時(shí)間為1分鐘。

    如果僅僅指定了time,

    proxy_cache_valid 5m;

    那么只有狀態(tài)碼為200、300和302的響應(yīng)會(huì)被緩存。

    如果使用了any參數(shù),那么就可以緩存任何響應(yīng):

    ?
  • proxy_cache_valid 200 302 10m;

  • proxy_cache_valid 301 1h;

  • proxy_cache_valid any 1m;

  • 緩存參數(shù)也可以直接在響應(yīng)頭中設(shè)定。這種方式的優(yōu)先級(jí)高于使用這條指令設(shè)置緩存時(shí)間。

    ?
  • “X-Accel-Expires”響應(yīng)頭可以以秒為單位設(shè)置響應(yīng)的緩存時(shí)間,如果值為0,表示禁止緩存響應(yīng),如果值以@開始,表示自1970年1月1日以來的秒數(shù),響應(yīng)一直會(huì)被緩存到這個(gè)絕對(duì)時(shí)間點(diǎn)。

  • 如果不含“X-Accel-Expires”響應(yīng)頭,緩存參數(shù)仍可能被“Expires”或者“Cache-Control”響應(yīng)頭設(shè)置。

  • 如果響應(yīng)頭含有“Set-Cookie”,響應(yīng)將不能被緩存。 這些頭的處理過程可以使用指令proxy_ignore_headers忽略。

  • 2.6 proxy_ignore_headers

    ?
  • 語法: proxy_ignore_headers field ...;

  • 默認(rèn)值: —

  • 上下文: http, server, location

  • 指定來自后端server的響應(yīng)中的某些header不會(huì)被處理,如下幾個(gè)fields可以被ignore:“X-Accel-Redirect”、“X-Accel-Expires”、“X-Accel-Limit-Rate”、“X-Accel-Buffering”、“X-Accel-Charset”、“Expires”、“Cache-Control”、“Set-Cookie”、“Vary”。“不被處理”就是nginx不會(huì)嘗試解析這些header并應(yīng)用它們,比如nginx處理來自后端server的“Expires”,將會(huì)影響它本地的文件cache的機(jī)制

    如果不被取消,這些頭部的處理可能產(chǎn)生下面結(jié)果:

    ?
  • “X-Accel-Expires”,“Expires”,“Cache-Control”,和“Set-Cookie” 設(shè)置響應(yīng)緩存的參數(shù);

  • “X-Accel-Redirect”執(zhí)行到指定URI的內(nèi)部跳轉(zhuǎn);

  • “X-Accel-Limit-Rate”設(shè)置響應(yīng)到客戶端的傳輸速率限制;

  • “X-Accel-Buffering”啟動(dòng)或者關(guān)閉響應(yīng)緩沖;

  • “X-Accel-Charset”設(shè)置響應(yīng)所需的字符集。

  • 2.7 proxy_hide_header

    ?
  • 語法: proxy_hide_header field;

  • 默認(rèn)值: —

  • 上下文: http, server, location

  • nginx默認(rèn)不會(huì)將“Date”、“Server”、“X-Pad”,和“X-Accel-...”響應(yīng)頭發(fā)送給客戶端。proxy_hide_header指令則可以設(shè)置額外的響應(yīng)頭,這些響應(yīng)頭也不會(huì)發(fā)送給客戶端。相反的,如果希望允許傳遞某些響應(yīng)頭給客戶端,可以使用proxy_pass_header指令。

    2.8 proxy_pass_header

    ?
  • 語法: proxy_pass_header field;

  • 默認(rèn)值: —

  • 上下文: http, server, location

  • 允許傳送被屏蔽的后端服務(wù)器響應(yīng)頭到客戶端。

    2.9 proxy_cache_min_uses

    ?
  • 語法: proxy_cache_min_uses number;

  • 默認(rèn)值: proxy_cache_min_uses 1;

  • 上下文: http, server, location

  • 設(shè)置響應(yīng)被緩存的最小請(qǐng)求次數(shù)。默認(rèn)為1,當(dāng)客戶端發(fā)送相同請(qǐng)求達(dá)到規(guī)定次數(shù)后,nginx才對(duì)響應(yīng)數(shù)據(jù)進(jìn)行緩存;指定請(qǐng)求至少被發(fā)送了多少次以上時(shí)才緩存,可以防止低頻請(qǐng)求被緩存

    2.10 proxy_cache_use_stale

    ?
  • 語法: proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off ...;

  • 默認(rèn)值: proxy_cache_use_stale off;

  • 上下文: http, server, location

  • 如果后端服務(wù)器出現(xiàn)狀況,nginx是可以使用過期的響應(yīng)緩存的。這條指令就是定義何種條件下允許開啟此機(jī)制。這條指令的參數(shù)與proxy_next_upstream指令的參數(shù)相同。

    此外,updating參數(shù)允許nginx在正在更新緩存的情況下使用過期的緩存作為響應(yīng)。這樣做可以使更新緩存數(shù)據(jù)時(shí),訪問源服務(wù)器的次數(shù)最少。

    在植入新的緩存條目時(shí),如果想使訪問源服務(wù)器的次數(shù)最少,可以使用proxy_cache_lock指令。

    2.11 proxy_cache_lock

    ?
  • 語法: proxy_cache_lock on | off;

  • 默認(rèn)值: proxy_cache_lock off;

  • 上下文: http, server, location

  • 這個(gè)指令出現(xiàn)在版本 1.1.12.

  • 開啟此功能時(shí),對(duì)于相同的請(qǐng)求,同時(shí)只允許一個(gè)請(qǐng)求發(fā)往后端,并根據(jù)proxy_cache_key指令的設(shè)置在緩存中植入一個(gè)新條目。 其他請(qǐng)求相同條目的請(qǐng)求將一直等待,直到緩存中出現(xiàn)相應(yīng)的內(nèi)容,或者鎖在proxy_cache_lock_timeout指令設(shè)置的超時(shí)后被釋放。如果不啟用proxy_cache_lock,則所有在緩存中找不到文件的請(qǐng)求都會(huì)直接與服務(wù)器通信。

    2.12 proxy_cache_bypass

    ?
  • 語法: proxy_cache_bypass string ...;

  • 默認(rèn)值: —

  • 上下文: http, server, location

  • 定義nginx不從緩存取響應(yīng)的條件。如果至少一個(gè)字符串條件非空而且非“0”,nginx就不會(huì)從緩存中去取響應(yīng):

    ?
  • proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

  • proxy_cache_bypass $http_pragma $http_authorization;

  • 本指令可和與proxy_no_cache一起使用。

    2.13 proxy_no_cache

    ?
  • 語法: proxy_no_cache string ...;

  • 默認(rèn)值: —

  • 上下文: http, server, location

  • 定義nginx不將響應(yīng)寫入緩存的條件。如果至少一個(gè)字符串條件非空而且非“0”,nginx就不將響應(yīng)存入緩存:

    ?
  • proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;

  • proxy_no_cache $http_pragma $http_authorization;

  • 這條指令可以和proxy_cache_bypass指令一起使用。

    3. 其他一些配置

    3.1 proxy_cache_lock_timeout

    ?
  • 語法: proxy_cache_lock_timeout time;

  • 默認(rèn)值: proxy_cache_lock_timeout 5s;

  • 上下文: http, server, location

  • 這個(gè)指令出現(xiàn)在版本 1.1.12.

    為proxy_cache_lock指令設(shè)置鎖的超時(shí)。

    3.2 proxy_read_timeout

    ?
  • 語法: proxy_read_timeout time;

  • 默認(rèn)值: proxy_read_timeout 60s;

  • 上下文: http, server, location

  • 定義從后端服務(wù)器讀取響應(yīng)的超時(shí)。此超時(shí)是指相鄰兩次讀操作之間的最長時(shí)間間隔,而不是整個(gè)響應(yīng)傳輸完成的最長時(shí)間。如果后端服務(wù)器在超時(shí)時(shí)間段內(nèi)沒有傳輸任何數(shù)據(jù),連接將被關(guān)閉。

    3.3 proxy_connect_timeout

    ?
  • 語法: proxy_connect_timeout time;默認(rèn)值:

  • proxy_connect_timeout 60s;

  • 上下文: http, server, location

  • 設(shè)置與后端服務(wù)器建立連接的超時(shí)時(shí)間。應(yīng)該注意這個(gè)超時(shí)一般不可能大于75秒。

    3.4 proxy_send_timeout

    ?
  • 語法: proxy_send_timeout time;

  • 默認(rèn)值: proxy_send_timeout 60s;

  • 上下文: http, server, location

  • 定義向后端服務(wù)器傳輸請(qǐng)求的超時(shí)。此超時(shí)是指相鄰兩次寫操作之間的最長時(shí)間間隔,而不是整個(gè)請(qǐng)求傳輸完成的最長時(shí)間。如果后端服務(wù)器在超時(shí)時(shí)間段內(nèi)沒有接收到任何數(shù)據(jù),連接將被關(guān)閉。

    3.5 proxy_http_version

    ?
  • 語法: proxy_http_version 1.0 | 1.1;

  • 默認(rèn)值: proxy_http_version 1.0;

  • 上下文: http, server, location

  • 這個(gè)指令出現(xiàn)在版本 1.1.4.

    設(shè)置代理使用的HTTP協(xié)議版本。默認(rèn)使用的版本是1.0,而1.1版本則推薦在使用keepalive連接時(shí)一起使用。

    3.6 proxy_ignore_client_abort

    ?
  • 語法: proxy_ignore_client_abort on | off;

  • 默認(rèn)值: proxy_ignore_client_abort off;

  • 上下文: http, server, location

  • 決定當(dāng)客戶端在響應(yīng)傳輸完成前就關(guān)閉連接時(shí),nginx是否應(yīng)關(guān)閉后端連接。

    3.7 proxy_intercept_errors

    ?
  • 語法: proxy_intercept_errors on | off;

  • 默認(rèn)值: proxy_intercept_errors off;

  • 上下文: http, server, location

  • 當(dāng)后端服務(wù)器的響應(yīng)狀態(tài)碼大于等于400時(shí),決定是否直接將響應(yīng)發(fā)送給客戶端,亦或?qū)㈨憫?yīng)轉(zhuǎn)發(fā)給nginx由error_page指令來處理。

    3.8 proxy_next_upstream

    ?
  • 語法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off ...;

  • 默認(rèn)值: proxy_next_upstream error timeout;

  • 上下文: http, server, location

  • 指定在何種情況下一個(gè)失敗的請(qǐng)求應(yīng)該被發(fā)送到下一臺(tái)后端服務(wù)器:

    ?
  • error

  • 和后端服務(wù)器建立連接時(shí),或者向后端服務(wù)器發(fā)送請(qǐng)求時(shí),或者從后端服務(wù)器接收響應(yīng)頭時(shí),出現(xiàn)錯(cuò)誤;

  • timeout

  • 和后端服務(wù)器建立連接時(shí),或者向后端服務(wù)器發(fā)送請(qǐng)求時(shí),或者從后端服務(wù)器接收響應(yīng)頭時(shí),出現(xiàn)超時(shí);

  • invalid_header

  • 后端服務(wù)器返回空響應(yīng)或者非法響應(yīng)頭;

  • http_500

  • 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為500;

  • http_502

  • 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為502;

  • http_503

  • 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為503;

  • http_504

  • 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為504;

  • http_404

  • 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為404;

  • off

  • 停止將請(qǐng)求發(fā)送給下一臺(tái)后端服務(wù)器。

  • 需要理解一點(diǎn)的是,只有在沒有向客戶端發(fā)送任何數(shù)據(jù)以前,將請(qǐng)求轉(zhuǎn)給下一臺(tái)后端服務(wù)器才是可行的。也就是說,如果在傳輸響應(yīng)到客戶端時(shí)出現(xiàn)錯(cuò)誤或者超時(shí),這類錯(cuò)誤是不可能恢復(fù)的。

    ?
  • 語法: proxy_cookie_domain off;

  • proxy_cookie_domain domain replacement;

  • 默認(rèn)值: proxy_cookie_domain off;

  • 上下文: http, server, location

  • 這個(gè)指令出現(xiàn)在版本 1.1.15.

    設(shè)置“Set-Cookie”響應(yīng)頭中的domain屬性的替換文本。 假設(shè)后端服務(wù)器返回的“Set-Cookie”響應(yīng)頭含有屬性“domain=localhost”,那么指令

    proxy_cookie_domain localhost example.org;
    將這個(gè)屬性改寫為“domain=example.org”。

    domain和replacement配置字符串,以及domain屬性中起始的點(diǎn)將被忽略。 匹配過程大小寫不敏感。

    domain和replacement配置字符串中可以包含變量:

    proxy_cookie_domain www.$host $host;
    這條指令同樣可以使用正則表達(dá)式。這時(shí),domain應(yīng)以“~”標(biāo)志開始,且可以使用命名匹配組和位置匹配組,而replacement可以引用這些匹配組:

    proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;

    可以同時(shí)定義多條proxy_cookie_domain指令:

    ?
  • proxy_cookie_domain localhost example.org;

  • proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;

  • off參數(shù)可以取消當(dāng)前配置級(jí)別的所有proxy_cookie_domain指令:

    ?
  • proxy_cookie_domain off;

  • proxy_cookie_domain localhost example.org;

  • proxy_cookie_domain www.example.org example.org;

  • ?
  • 語法: proxy_cookie_path off;

  • proxy_cookie_path path replacement;

  • 默認(rèn)值: proxy_cookie_path off;

  • 上下文: http, server, location

  • 這個(gè)指令出現(xiàn)在版本 1.1.15.

    設(shè)置“Set-Cookie”響應(yīng)頭中的path屬性的替換文本。 假設(shè)后端服務(wù)器返回的“Set-Cookie”響應(yīng)頭含有屬性“path=/two/some/uri/”,那么指令

    proxy_cookie_path /two/ /;

    將這個(gè)屬性改寫為“path=/some/uri/”。

    path和replacement配置字符串可以包含變量:

    proxy_cookie_path $uri /some$uri;

    這條指令同樣可以使用正則表達(dá)式。如果使用大小寫敏感的匹配,path應(yīng)以“~”標(biāo)志開始,如果使用大小寫不敏感的匹配,path應(yīng)以“~*”標(biāo)志開始。path可以使用命名匹配組和位置匹配組,replacement可以引用這些匹配組:

    proxy_cookie_path ~*^/user/([^/]+) /u/$1;

    可以同時(shí)定義多條proxy_cookie_path指令:

    ?
  • proxy_cookie_path /one/ /;

  • proxy_cookie_path / /two/;

  • off參數(shù)可以取消當(dāng)前配置級(jí)別的所有proxy_cookie_path指令:

    ?
  • proxy_cookie_path off;

  • proxy_cookie_path /two/ /;

  • proxy_cookie_path ~*^/user/([^/]+) /u/$1;

  • 3.11 proxy_pass

    ?
  • 語法: proxy_pass URL;

  • 默認(rèn)值: —

  • 上下文: location, if in location, limit_except

  • 設(shè)置后端服務(wù)器的協(xié)議和地址,還可以設(shè)置可選的URI以定義本地路徑和后端服務(wù)器的映射關(guān)系。 這條指令可以設(shè)置的協(xié)議是“http”或者“https”,而地址既可以使用域名或者IP地址加端口(可選)的形式來定義:

    proxy_pass http://localhost:8000/uri/;

    又可以使用UNIX域套接字路徑來定義。該路徑接在“unix”字符串后面,兩端由冒號(hào)所包圍,比如:

    proxy_pass http://unix:/tmp/backend.socket:/uri/;

    如果解析一個(gè)域名得到多個(gè)地址,所有的地址都會(huì)以輪轉(zhuǎn)的方式被使用。當(dāng)然,也可以使用服務(wù)器組來定義地址。

    請(qǐng)求URI按下面規(guī)則傳送給后端服務(wù)器:

    如果proxy_pass使用了URI,當(dāng)傳送請(qǐng)求到后端服務(wù)器時(shí),規(guī)范化以后的請(qǐng)求路徑與配置中的路徑的匹配部分將被替換為指令中定義的URI:

    ?
  • location /name/ {

  • proxy_pass http://127.0.0.1/remote/;

  • }

  • 如果proxy_pass沒有使用URI,傳送到后端服務(wù)器的請(qǐng)求URI一般客戶端發(fā)起的原始URI,如果nginx改變了請(qǐng)求URI,則傳送的URI是nginx改變以后完整的規(guī)范化URI:

    ?
  • location /some/path/ {

  • proxy_pass http://127.0.0.1;

  • }

  • 在1.1.12版以前,如果proxy_pass沒有使用URI,某些情況下,nginx改變URI以后,會(huì)錯(cuò)誤地將原始URI而不是改變以后的URI發(fā)送到后端服務(wù)器。
    某些情況下,無法確定請(qǐng)求URI中應(yīng)該被替換的部分:

    使用正則表達(dá)式定義路徑。
    這種情況下,指令不應(yīng)該使用URI。

    在需要代理的路徑中,使用rewrite指令改變了URI,但仍使用相同配置處理請(qǐng)求(break):

    ?
  • location /name/ {

  • rewrite /name/([^/]+) /users?name=$1 break;

  • proxy_pass http://127.0.0.1;

  • }

  • 這種情況下,本指令設(shè)置的URI會(huì)被忽略,改變后的URI將被發(fā)送給后端服務(wù)器。

    后端服務(wù)器的地址,端口和URI中都可以使用變量:

    proxy_pass http://$host$uri;

    甚至像這樣:

    proxy_pass $request;

    這種情況下,后端服務(wù)器的地址將會(huì)在定義的服務(wù)器組中查找。如果查找不到,nginx使用resolver來查找該地址。

    3.12 proxy_redirect

    ?
  • 語法: proxy_redirect default;

  • proxy_redirect off;

  • proxy_redirect redirect replacement;

  • 默認(rèn)值: proxy_redirect default;

  • 上下文: http, server, location

  • 設(shè)置后端服務(wù)器“Location”響應(yīng)頭和“Refresh”響應(yīng)頭的替換文本。 假設(shè)后端服務(wù)器返回的響應(yīng)頭是 “Location: http://localhost:8000/two/some/uri/”,那么指令

    proxy_redirect http://localhost:8000/two/ http://frontend/one/;

    將把字符串改寫為 “Location: http://frontend/one/some/uri/”。

    replacement字符串可以省略服務(wù)器名:

    proxy_redirect http://localhost:8000/two/ /;

    此時(shí)將使用代理服務(wù)器的主域名和端口號(hào)來替換。如果端口是80,可以不加。

    用default參數(shù)指定的默認(rèn)替換使用了location和proxy_pass指令的參數(shù)。因此,下面兩例配置等價(jià):

    ?
  • location /one/ {

  • proxy_pass http://upstream:port/two/;

  • proxy_redirect default;

  • location /one/ {

  • proxy_pass http://upstream:port/two/;

  • proxy_redirect http://upstream:port/two/ /one/;

  • 而且因?yàn)橥瑯拥脑?#xff0c;proxy_pass指令使用變量時(shí),不允許本指令使用default參數(shù)。

    replacement字符串可以包含變量:

    proxy_redirect http://localhost:8000/ http://$host:$server_port/;

    而redirect字符串從1.1.11版本開始也可以包含變量:

    proxy_redirect http://$proxy_host:8000/ /;

    同時(shí),從1.1.11版本開始,指令支持正則表達(dá)式。使用正則表達(dá)式的話,如果是大小寫敏感的匹配,redirect以“~”作為開始,如果是大小寫不敏感的匹配,redirect以“~*”作為開始。而且redirect的正則表達(dá)式中可以包含命名匹配組和位置匹配組,而在replacement中可以引用這些匹配組的值:

    ?
  • proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;

  • proxy_redirect ~*/user/([^/]+)/(.+)$ http://$1.example.com/$2;

  • 除此以外,可以同時(shí)定義多個(gè)proxy_redirect指令:

    ?
  • proxy_redirect default;

  • proxy_redirect http://localhost:8000/ /;

  • proxy_redirect http://www.example.com/ /;

  • 另外,off參數(shù)可以使所有相同配置級(jí)別的proxy_redirect指令無效:

    ?
  • proxy_redirect off;

  • proxy_redirect default;

  • proxy_redirect http://localhost:8000/ /;

  • proxy_redirect http://www.example.com/ /;

  • 最后,使用這條指令也可以為地址為相對(duì)地址的重定向添加域名:

    proxy_redirect / /;

    3.13 proxy_set_header

    ?
  • 語法: proxy_set_header field value;

  • 默認(rèn)值:

  • proxy_set_header Host $proxy_host;

  • proxy_set_header Connection close;

  • 上下文: http, server, location

  • 允許重新定義或者添加發(fā)往后端服務(wù)器的請(qǐng)求頭。value可以包含文本、變量或者它們的組合。 當(dāng)且僅當(dāng)當(dāng)前配置級(jí)別中沒有定義proxy_set_header指令時(shí),會(huì)從上面的級(jí)別繼承配置。 默認(rèn)情況下,只有兩個(gè)請(qǐng)求頭會(huì)被重新定義:

    ?
  • proxy_set_header Host $proxy_host;

  • proxy_set_header Connection close;

  • 如果不想改變請(qǐng)求頭“Host”的值,可以這樣來設(shè)置:

    proxy_set_header Host $http_host;

    但是,如果客戶端請(qǐng)求頭中沒有攜帶這個(gè)頭部,那么傳遞到后端服務(wù)器的請(qǐng)求也不含這個(gè)頭部。 這種情況下,更好的方式是使用$host變量——它的值在請(qǐng)求包含“Host”請(qǐng)求頭時(shí)為“Host”字段的值,在請(qǐng)求未攜帶“Host”請(qǐng)求頭時(shí)為虛擬主機(jī)的主域名:

    proxy_set_header Host $host;

    此外,服務(wù)器名可以和后端服務(wù)器的端口一起傳送:

    proxy_set_header Host $host:$proxy_port;

    如果某個(gè)請(qǐng)求頭的值為空,那么這個(gè)請(qǐng)求頭將不會(huì)傳送給后端服務(wù)器:

    ?
  • proxy_set_header Accept-Encoding "";

  • 語法: proxy_ssl_session_reuse on | off;

  • 默認(rèn)值: proxy_ssl_session_reuse on;

  • 上下文: http, server, location

  • 決定是否重用與后端服務(wù)器的SSL會(huì)話。如果日志中出現(xiàn)“SSL3_GET_FINISHED:digest check failed”錯(cuò)誤,請(qǐng)嘗試關(guān)閉會(huì)話重用。

    3.14 proxy_store

    ?
  • 語法: proxy_store on | off | string;

  • 默認(rèn)值: proxy_store off;

  • 上下文: http, server, location

  • 開啟將文件保存到磁盤上的功能。如果設(shè)置為on,nginx將文件保存在alias指令或root指令設(shè)置的路徑中。如果設(shè)置為off,nginx將關(guān)閉文件保存的功能。此外,保存的文件名也可以使用含變量的string參數(shù)來指定:

    proxy_store /data/www$original_uri;

    保存文件的修改時(shí)間根據(jù)接收到的“Last-Modified”響應(yīng)頭來設(shè)置。響應(yīng)都是先寫到臨時(shí)文件,然后進(jìn)行重命名來生成的。從0.8.9版本開始,臨時(shí)文件和持久化存儲(chǔ)可以放在不同的文件系統(tǒng),但是需要注意這時(shí)文件執(zhí)行的是在兩個(gè)文件系統(tǒng)間拷貝操作,而不是廉價(jià)的重命名操作。因此建議保存文件的路徑和proxy_temp_path指令設(shè)置的臨時(shí)文件的路徑在同一個(gè)文件系統(tǒng)中。

    這條指令可以用于創(chuàng)建靜態(tài)無更改文件的本地拷貝,比如:

    ?
  • location /images/ {

  • root /data/www;

  • open_file_cache_errors off;

  • error_page 404 = /fetch$uri;

  • }

  • ?
  • location /fetch/ {

  • internal;

  • ?
  • proxy_pass http://backend/;

  • proxy_store on;

  • proxy_store_access user:rw group:rw all:r;

  • proxy_temp_path /data/temp;

  • ?
  • alias /data/www/;

  • }

  • 或者像這樣:

    ?
  • location /images/ {

  • root /data/www;

  • error_page 404 = @fetch;

  • }

  • ?
  • location @fetch {

  • internal;

  • ?
  • proxy_pass http://backend;

  • proxy_store on;

  • proxy_store_access user:rw group:rw all:r;

  • proxy_temp_path /data/temp;

  • ?
  • root /data/www;

  • }

  • ?
  • 語法: proxy_store_access users:permissions ...;

  • 默認(rèn)值: proxy_store_access user:rw;

  • 上下文: http, server, location

  • 設(shè)置新創(chuàng)建的文件和目錄的訪問權(quán)限,比如:

    proxy_store_access user:rw group:rw all:r;

    如果指定了任何group或者all的訪問權(quán)限,那么可以略去user的訪問權(quán)限:

    proxy_store_access group:rw all:r;

    4. 其他一些問題

    4.1 緩存動(dòng)態(tài)內(nèi)容

    NGINX可以緩存動(dòng)態(tài)內(nèi)容,但是這不應(yīng)該亂用,有些情況需要考慮

    首先,任何用戶相關(guān)的數(shù)據(jù)不應(yīng)被高速緩存。這可能導(dǎo)致一個(gè)用戶的數(shù)據(jù)被呈現(xiàn)給其他用戶。如果你的網(wǎng)站是完全靜態(tài)的,這可能不是一個(gè)問題。

    如果你的網(wǎng)站有一些動(dòng)態(tài)元素,你將不得不考慮到這一點(diǎn)。你如何處理要看是什么應(yīng)用程序或服務(wù)器處理的后端處理。對(duì)于私人的內(nèi)容,你應(yīng)該設(shè)置Cache-Control頭為“no-cache”,“no-sotre”,或者“private”依賴于數(shù)據(jù)的性質(zhì):

    4.2 緩存不生效問題

    nginx是否緩存是由nginx緩存服務(wù)器與源服務(wù)器共同決定的, 緩存服務(wù)器需要嚴(yán)格遵守源服務(wù)器響應(yīng)的header來決定是否緩存以及緩存的時(shí)長。

    默認(rèn)情況下,NGINX需要考慮從原始服務(wù)器得到的Cache-Control標(biāo)頭。當(dāng)在響應(yīng)頭部中Cache-Control被配置為Private,No-Cache,No-Store或者Set-Cookie,NGINX不進(jìn)行緩存。NGINX僅僅緩存GET和HEAD客戶端請(qǐng)求。

    可以嘗試通過更改頭信息改讓反代服務(wù)器緩存

    1、嘗試修改源服務(wù)器代碼,改變程序響應(yīng)的頭信息

    2、nginx反代配置提供了proxy_ignore_headers配置來忽略某些頭信息,我們可以忽略引起反代不緩存的頭信息

    proxy_ignore_headers?X-Accel-Expires?Expires?Cache-Control?Set-Cookie;

    4.2 緩存過期問題

    引起緩存過期的因素

    • inactive:在proxy_cache_path配置項(xiàng)中進(jìn)行配置,說明某個(gè)緩存在inactive指定的時(shí)間內(nèi)如果不訪問,將會(huì)從緩存中刪除。
    • 源服務(wù)器php頁面中生成的響應(yīng)頭中的Expires,生成語句為:
      header("Expires: Fri, 07 Sep 2013 08:05:18 GMT");
    • 源服務(wù)器php頁面生成的max-age,生成語句為:
      header("Cache-Control: max-age=60");
    • nginx的配置項(xiàng) proxy_cache_valid:配置nginx cache中的緩存文件的緩存時(shí)間,如果配置項(xiàng)為:proxy_cache_valid 200 304 2m;說明對(duì)于狀態(tài)為200和304的緩存文件的緩存時(shí)間是2分鐘,兩分鐘之后再訪問該緩存文件時(shí),文件會(huì)過期,從而去源服務(wù)器重新取數(shù)據(jù)。

    優(yōu)先級(jí)

    • 在同時(shí)設(shè)置了源服務(wù)器端Expires、源服務(wù)器端max-age和nginx cahe端的proxy_cache_valid的情況下,以源服務(wù)器端設(shè)置的Expires的值為標(biāo)準(zhǔn)進(jìn)行緩存的過期處理
    • 若在nginx中配置了相關(guān)配置項(xiàng)(proxy_ignore_headers,proxy_hide_header),取消原服務(wù)器端Expires對(duì)緩存的影響,在同時(shí)設(shè)置了源服務(wù)器端Expires、源服務(wù)器端max-age和nginx cahe端的proxy_cache_valid的情況下,以源服務(wù)器端max-age的值為標(biāo)準(zhǔn)進(jìn)行緩存的過期處理
    • 若同時(shí)取消源服務(wù)器端Expires和源服務(wù)器端max-age對(duì)緩存的影響,則以proxy_cache_valid設(shè)置的值為標(biāo)準(zhǔn)進(jìn)行緩存的過期處理
    • Inactive的值不受上述三個(gè)因素的影響,即第一次請(qǐng)求頁面之后,每經(jīng)過inactvie指定的時(shí)間,都要強(qiáng)制進(jìn)行相應(yīng)的緩存清理。因此inactive的優(yōu)先級(jí)最高。

    詳細(xì)的測(cè)試可以參照http://www.ttlsa.com/nginx/nginx-cache-priority/

    4.3 緩存清除問題

    nginx沒有提供直接緩存清除的方法,但是我們可以使用以下方法清除

    1、但是可以通過使用第三方的模塊ngx_cache_purge清除指定的URL
    需要加入一個(gè)新的location配置

    ?
  • location ~ /purge(/.*) {

  • proxy_cache_purge cache_one $host$1$is_args$args;

  • }

  • 原網(wǎng)址和清除緩存的url對(duì)應(yīng)關(guān)系

    www.firefoxbug.net/index.html ==>> www.firefoxbug.net/purge/index.html就能清除.

    2、直接刪除指定的緩存文件

    直接想辦法刪除proxy_cache_path配置的目錄下的所有文件,如果你可以直接操作linux那么可以直接rm -rf xxx了,如果不方便可以考慮寫個(gè)腳本去刪除相應(yīng)的文件目錄。

    4.4 緩存命中率

    nginx 提供了變量$upstream-cache-status 來顯示緩存的命中狀態(tài),我們可以再nginx.conf配置中添加一個(gè)http響應(yīng)頭來顯示這一狀態(tài)

    反代配置中加入

    ?
  • location / {

  • proxy_pass http://zhengde.xxx.cn;

  • proxy_set_header Host zhengde.xxx.cn;

  • add_header X-Cache-Status $upstream_cache_status;

  • ... 其他配置

  • }

  • 在對(duì)客戶端的響應(yīng)中添加了一個(gè)X-Cache-StatusHTTP響應(yīng)頭,這樣可以在響應(yīng)信息中查看X-Cache-Status狀態(tài)來判定是否命中

    如果想要統(tǒng)計(jì)命中率,那么在訪問日志的格式中加入$upstream_cache_status記錄即可

    ?
  • log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘

  • ‘$status $body_bytes_sent “$http_referer” ‘

  • ’”$http_user_agent” “$http_x_forwarded_for”‘

  • ’”$upstream_cache_status”‘;

  • 然后可以使用awk命令進(jìn)行統(tǒng)計(jì)

    ?
  • 命令:awk '{if($NF=="\"HIT\"") hit++} END {printf "%.2f%",hit/NR}' access.log

  • 結(jié)果: 32.15%

  • 下面是$upstream_cache_status的可能值:

    ?
  • 1.MISS——響應(yīng)在緩存中找不到,所以需要在服務(wù)器中取得。這個(gè)響應(yīng)之后可能會(huì)被緩存起來。

  • 2.BYPASS——響應(yīng)來自原始服務(wù)器而不是緩存,因?yàn)檎?qǐng)求匹配了一個(gè)proxy_cache_bypass(見下面我可以在緩存中打個(gè)洞嗎?)。這個(gè)響應(yīng)之后可能會(huì)被緩存起來。

  • 3.EXPIRED——緩存中的某一項(xiàng)過期了,來自原始服務(wù)器的響應(yīng)包含最新的內(nèi)容。

  • 4.STALE——內(nèi)容陳舊是因?yàn)樵挤?wù)器不能正確響應(yīng)。需要配置proxy_cache_use_stale。

  • 5.UPDATING——內(nèi)容過期了,因?yàn)橄鄬?duì)于之前的請(qǐng)求,響應(yīng)的入口(entry)已經(jīng)更新,并且proxy_cache_use_stale的updating已被設(shè)置。

  • 6.REVALIDATED——proxy_cache_revalidate命令被啟用,NGINX檢測(cè)得知當(dāng)前的緩存內(nèi)容依然有效(If-Modified-Since或者If-None-Match)。

  • 7.HIT——響應(yīng)包含來自緩存的最新有效的內(nèi)容。

  • 4.5 如何實(shí)現(xiàn)動(dòng)靜分離

    ?
  • server

  • {

  • listen 10000;

  • server_name localhost;

  • ?
  • #靜態(tài)處理交給nginx

  • location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|ico|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|css|js)$ {

  • proxy_cache cache_one;

  • proxy_cache_valid 200 304 302 2d;

  • proxy_cache_valid any 1d;

  • proxy_cache_key $host$uri$is_args$args;

  • add_header X-Cache '$upstream_cache_status from $host';

  • ?
  • proxy_pass http://127.0.0.1:8088;

  • expires 30d;

  • }

  • ?
  • #動(dòng)態(tài)文件不處理

  • location / {

  • proxy_pass http://127.0.0.1:8080;

  • }

  • ?
  • 總結(jié)

    以上是生活随笔為你收集整理的nginx proxy_cache缓存详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。