nginx proxy_cache缓存详解
目錄
- 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
?語(yǔ)法: proxy_buffer_size size;
默認(rèn)值: proxy_buffer_size 4k|8k;
上下文: http, server, location
1.2 proxy_buffering
?語(yǔ)法: proxy_buffering on | off;
默認(rèn)值: proxy_buffering on;
上下文: http, server, location
proxy_buffering啟用時(shí),要提防使用的代理緩沖區(qū)太大。這可能會(huì)吃掉你的內(nèi)存,限制代理能夠支持的最大并發(fā)連接數(shù)。
1.3 proxy_buffers
?語(yǔ)法: proxy_buffers number size;
默認(rèn)值: proxy_buffers 8 4k|8k;
上下文: http, server, location
1.4 proxy_busy_buffers_size
?語(yǔ)法: proxy_busy_buffers_size size;
默認(rèn)值: proxy_busy_buffers_size 8k|16k;
上下文: http, server, location
1.5 proxy_max_temp_file_size
?語(yǔ)法: proxy_max_temp_file_size size;
默認(rèn)值: proxy_max_temp_file_size 1024m;
上下文: http, server, location
1.6 proxy_temp_file_write_size
?語(yǔ)法: 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)頁(yè)平均在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í)地的分析,一般來(lái)說通用配置可以應(yīng)付了。
2. 常用配置項(xiàng)
2.1 proxy_cache_path
?語(yǔ)法: 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ì)添加的無(wú)用請(qǐng)求參數(shù),這就會(huì)出現(xiàn)不同的 cache_key 保存了多份相同的緩存內(nèi)容,這對(duì)緩存效果影響很大。
2.2 proxy_temp_path
?語(yǔ)法: 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í)文件的路徑看起來(lái)會(huì)是這樣:
/spool/nginx/proxy_temp/7/45/000001234572.3 proxy_cache
?語(yǔ)法: proxy_cache zone | off;
默認(rèn)值: proxy_cache off;
上下文: http, server, location
指定用于頁(yè)面緩存的共享內(nèi)存。同一塊共享內(nèi)存可以在多個(gè)地方使用。off參數(shù)可以屏蔽從上層配置繼承的緩存功能。zone名稱由“proxy_cache_path”指令定義。
2.4 proxy_cache_key
?語(yǔ)法: 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ì)添加的無(wú)用請(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
?語(yǔ)法: 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日以來(lái)的秒數(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
?語(yǔ)法: proxy_ignore_headers field ...;
默認(rèn)值: —
上下文: http, server, location
指定來(lái)自后端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處理來(lái)自后端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
?語(yǔ)法: 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
?語(yǔ)法: proxy_pass_header field;
默認(rèn)值: —
上下文: http, server, location
允許傳送被屏蔽的后端服務(wù)器響應(yīng)頭到客戶端。
2.9 proxy_cache_min_uses
?語(yǔ)法: 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
?語(yǔ)法: 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
?語(yǔ)法: 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
?語(yǔ)法: 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
?語(yǔ)法: 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
?語(yǔ)法: 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
?語(yǔ)法: proxy_read_timeout time;
默認(rèn)值: proxy_read_timeout 60s;
上下文: http, server, location
定義從后端服務(wù)器讀取響應(yīng)的超時(shí)。此超時(shí)是指相鄰兩次讀操作之間的最長(zhǎng)時(shí)間間隔,而不是整個(gè)響應(yīng)傳輸完成的最長(zhǎng)時(shí)間。如果后端服務(wù)器在超時(shí)時(shí)間段內(nèi)沒有傳輸任何數(shù)據(jù),連接將被關(guān)閉。
3.3 proxy_connect_timeout
?語(yǔ)法: 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
?語(yǔ)法: proxy_send_timeout time;
默認(rèn)值: proxy_send_timeout 60s;
上下文: http, server, location
定義向后端服務(wù)器傳輸請(qǐng)求的超時(shí)。此超時(shí)是指相鄰兩次寫操作之間的最長(zhǎng)時(shí)間間隔,而不是整個(gè)請(qǐng)求傳輸完成的最長(zhǎng)時(shí)間。如果后端服務(wù)器在超時(shí)時(shí)間段內(nèi)沒有接收到任何數(shù)據(jù),連接將被關(guān)閉。
3.5 proxy_http_version
?語(yǔ)法: 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
?語(yǔ)法: 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
?語(yǔ)法: 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指令來(lái)處理。
3.8 proxy_next_upstream
?語(yǔ)法: 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ù)的。
3.9 proxy_cookie_domain
?語(yǔ)法: 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可以引用這些匹配組:
可以同時(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;
3.10 proxy_cookie_path
?語(yǔ)法: 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
?語(yǔ)法: proxy_pass URL;
默認(rèn)值: —
上下文: location, if in location, limit_except
設(shè)置后端服務(wù)器的協(xié)議和地址,還可以設(shè)置可選的URI以定義本地路徑和后端服務(wù)器的映射關(guān)系。 這條指令可以設(shè)置的協(xié)議是“http”或者“https”,而地址既可以使用域名或者IP地址加端口(可選)的形式來(lái)定義:
proxy_pass http://localhost:8000/uri/;又可以使用UNIX域套接字路徑來(lái)定義。該路徑接在“unix”字符串后面,兩端由冒號(hào)所包圍,比如:
proxy_pass http://unix:/tmp/backend.socket:/uri/;如果解析一個(gè)域名得到多個(gè)地址,所有的地址都會(huì)以輪轉(zhuǎn)的方式被使用。當(dāng)然,也可以使用服務(wù)器組來(lái)定義地址。
請(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ù)器。
某些情況下,無(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來(lái)查找該地址。
3.12 proxy_redirect
?語(yǔ)法: 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)來(lái)替換。如果端口是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指令無(wú)效:
?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
?語(yǔ)法: 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”的值,可以這樣來(lái)設(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 "";
語(yǔ)法: 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
?語(yǔ)法: 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ù)來(lái)指定:
proxy_store /data/www$original_uri;保存文件的修改時(shí)間根據(jù)接收到的“Last-Modified”響應(yīng)頭來(lái)設(shè)置。響應(yīng)都是先寫到臨時(shí)文件,然后進(jìn)行重命名來(lái)生成的。從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)無(wú)更改文件的本地拷貝,比如:
?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;
}
語(yǔ)法: 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來(lái)決定是否緩存以及緩存的時(shí)長(zhǎng)。
默認(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配置來(lái)忽略某些頭信息,我們可以忽略引起反代不緩存的頭信息
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è)面中生成的響應(yīng)頭中的Expires,生成語(yǔ)句為:
header("Expires: Fri, 07 Sep 2013 08:05:18 GMT"); - 源服務(wù)器php頁(yè)面生成的max-age,生成語(yǔ)句為:
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)求頁(yè)面之后,每經(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 來(lái)顯示緩存的命中狀態(tài),我們可以再nginx.conf配置中添加一個(gè)http響應(yīng)頭來(lái)顯示這一狀態(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)來(lá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ì)被緩存起來(lái)。
2.BYPASS——響應(yīng)來(lái)自原始服務(wù)器而不是緩存,因?yàn)檎?qǐng)求匹配了一個(gè)proxy_cache_bypass(見下面我可以在緩存中打個(gè)洞嗎?)。這個(gè)響應(yīng)之后可能會(huì)被緩存起來(lái)。
3.EXPIRED——緩存中的某一項(xiàng)過期了,來(lái)自原始服務(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)包含來(lái)自緩存的最新有效的內(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缓存详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为了让你的网页能在更多的服务器上正常地显
- 下一篇: Linux系统的基本安装