Nginx服務(wù)器作反向代理時(shí)的緩存配置要點(diǎn)解析
這里給出示例,并詳解。
http {
[...]
[...]
proxy_cache_path /data/nginx/cache/one levels=1:2 keys_zone=one:10m max_size=10g;
proxy_cache_key "$host$request_uri";
server {
server_name chabaoo.cn jb51.net;
root /home/chabaoo.cn/web;
index index.php index.html index.htm;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host "chabaoo.cn";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#開(kāi)啟反向代理緩存,并使用zone name為one的緩存。
proxy_cache one;
#設(shè)置狀態(tài)碼為200 302過(guò)期時(shí)間為10分鐘
proxy_cache_valid 200 302 10m;
#設(shè)置狀態(tài)碼404的過(guò)期時(shí)間為1分鐘
proxy_cache_valid 404 1m;
}
#清除緩存
location ~ /purge(/.*) {
#允許的IP
allow 127.0.0.1;
deny all;
proxy_cache_purge one $host$1$is_args$args;
}
}
}
反向代理的緩存主要涉及以下幾個(gè)命令:
proxy_cache_path proxy_cache_key proxy_cache proxy_cache_valid。
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 ]
可放置的上下文:
http
參數(shù)解釋:
[ levels = levels ]:
設(shè)置緩存目錄層數(shù),如levels=1:2,表示創(chuàng)建兩層目錄緩存,最多創(chuàng)建三層。第一層目錄名取proxy_cache_key md5的最后一個(gè)字符,第二層目錄名取倒數(shù)2-3字符,如:
proxy_cache_key md5為b7f54b2df7773722d382f4809d65029c,則:
levels=1:2為/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
levels=1:2:3為/data/nginx/cache/c/29/650/b7f54b2df7773722d382f4809d65029c
2.keys_zone = name : size:
定義緩存區(qū)域名稱及大小,緩存名稱用于proxy_cache指令設(shè)置緩存放置在哪,如proxy_cache one,則把緩存放在zone名稱為one的緩存區(qū),即proxy_cache_path指定的具體位置。
3.proxy_cache_key
這個(gè)指令是設(shè)置以什么參數(shù)md5得到緩存的文件名,默認(rèn)為$scheme$proxy_host$request_uri,即以協(xié)議、主機(jī)名、請(qǐng)求uri(包含參數(shù))作md5得出緩存的文件名。
proxy_cache_key與下面的清緩存功能(purge cache)有很大關(guān)系。
可放置在上下文,http server location
4.proxy_cache
反向代理緩存設(shè)置指令,語(yǔ)法proxy_cache zone | off,默認(rèn)為off。上下文:http server location。
可以放到指定location,這樣匹配此location的url才被緩存。
5.proxy_cache_valid
設(shè)置指定狀態(tài)碼的緩存時(shí)間,語(yǔ)法proxy_cache_valid [ code …] time。
另外,清緩存需要安裝插件ngx_cache_purge,安裝方法如下:
cd /tmp wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz tar xzf ngx_cache_purge-2.1.tar.gz cd /tmp wget http://nginx.org/download/nginx-1.4.2.tar.gz tar xzf nginx-1.4.2.tar.gz cd nginx-1.4.2 ./configure --prefix=/usr/local/nginx --add-module=/tmp/ngx_cache_purge-2.1 make && make install
緩存過(guò)期時(shí)間
在配置的時(shí)候,有如下三個(gè)地方可以設(shè)置緩存過(guò)期時(shí)間:
1.inactive=1d
2.proxy_cache_valid 200 304 1h
3.expires 10m
其實(shí)解釋起來(lái)很簡(jiǎn)單:
inactive=1d 是指多久未訪問(wèn)以后清除緩存
proxy_cache_valid 200 304 1h 是指距離緩存產(chǎn)生時(shí)間多久以后清除緩存
expires 10m 這個(gè)不是控制服務(wù)器端的,而是指在Http Response header里指定的過(guò)期時(shí)間,是給客戶端看的。
temp的問(wèn)題
Nginx進(jìn)行反代的時(shí)候,遇到超出文件大小 proxy_buffer_size 的時(shí)候,是一次性把文件都加載到Temp目錄,然后再發(fā)送給用戶。
如果設(shè)置了 proxy_buffering off 則不會(huì)加載到Temp目錄,而是同步的從上游進(jìn)行加載。
可以通過(guò)設(shè)置 proxy_max_temp_file_size 參數(shù)來(lái)設(shè)置最大可以緩存的文件大小。
206 和 Byte Range 的問(wèn)題
Byte Range允許客戶端向服務(wù)器請(qǐng)求一部分文件,而不是整個(gè)文件。大部分支持多線程下載和斷點(diǎn)下載的軟件都是用的這個(gè)功能。這個(gè)時(shí)候服務(wù)器返回的Http Code是206 Partial Requests.
但是Nginx做反代的時(shí)候,如果沒(méi)有好好的設(shè)置,這個(gè)功能可能會(huì)引來(lái)Dos攻擊。
因?yàn)槟J(rèn)做反代的時(shí)候,Nginx向后端服務(wù)器請(qǐng)求的時(shí)候是不會(huì)把 Range 參數(shù)加上的,而是會(huì)去請(qǐng)求整個(gè)文件,比方說(shuō)有一個(gè)1G的文件,每次請(qǐng)求1M,Nginx會(huì)在每次請(qǐng)求的時(shí)候去后端請(qǐng)求一個(gè)完整的1G文件,然后取出其中的1M發(fā)給客戶端,這個(gè)時(shí)候中間的流量會(huì)暴增,導(dǎo)致整個(gè)服務(wù)器宕機(jī)。今天因?yàn)檫@個(gè)問(wèn)題導(dǎo)致我檢查了很久。
解決方案也很簡(jiǎn)單,把 Range 加到Header里就行了。
proxy_set_header Range $http_range; proxy_set_header If-Range $http_if_range; proxy_no_cache $http_range $http_if_range;
相關(guān)文章
Nginx + lua 實(shí)現(xiàn)WAF的詳細(xì)過(guò)程
這篇文章主要介紹了Nginx + lua 實(shí)現(xiàn)WAF的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07
使用?nginx?搭建代理服務(wù)器(正向代理?https?網(wǎng)站)的詳細(xì)步驟
這篇文章主要介紹了使用?nginx?搭建代理服務(wù)器(正向代理?https?網(wǎng)站)指南的相關(guān)操作,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08
nginx開(kāi)啟https配置之后網(wǎng)頁(yè)無(wú)法訪問(wèn)的問(wèn)題處理解決
最近新購(gòu)服務(wù)器部署nginx之后按照之前的方式部署前端項(xiàng)目并配置https之后訪問(wèn)頁(yè)面無(wú)法顯示,本文主要介紹了nginx開(kāi)啟https配置之后網(wǎng)頁(yè)無(wú)法訪問(wèn)的問(wèn)題處理解決,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11
Nginx 502 Bad Gateway錯(cuò)誤原因及解決方案
這篇文章主要介紹了Nginx 502 Bad Gateway錯(cuò)誤原因及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Nginx七層負(fù)載均衡之動(dòng)靜分離思路詳解
Nginx動(dòng)靜分離簡(jiǎn)單來(lái)說(shuō)就是把動(dòng)態(tài)跟靜態(tài)請(qǐng)求分開(kāi),不能理解成只是單純的把動(dòng)態(tài)頁(yè)面和靜態(tài)頁(yè)面屋里分離,這篇文章主要介紹了Nginx七層負(fù)載均衡之動(dòng)靜分離思路詳解,需要的朋友可以參考下2024-02-02

