亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

【nginx】關于fastcgi_cache

2024-06-28 14:33:11
字體:
來源:轉載
供稿:網友

一、簡介

Nginx版本從0.7.48開始,支持了類似Squid的緩存功能。這個緩存是把URL及相關組合當做Key,用md5算法對Key進行哈希,得到硬盤上對應的哈希目錄路徑,從而將緩存內容保存在該目錄內。

Nginx Web 緩存服務只能為指定URL或狀態碼設置過期時間,不支持類似Squid的PURGE指令手動清除緩存;但是我們可以通過Nginx的模塊ngx_cache_purge清除指定URL的緩存。

  • PRoxy_cache:緩存后端服務器的內容,可能是任何內容,包括靜態的和動態,減少了nginx與后端通信的次數,節省了傳輸時間和后端寬帶
  • fastcgi_cache:緩存fastcgi生成的內容,很多情況是php生成的動態的內容,少了nginx與php的通信的次數,更減輕了php和數據庫(MySQL)的壓力,這比用memcached之類的緩存要輕松得多


圖片來自網絡

二、配置

nginx.conf

fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WordPRESS:100m inactive=60m;fastcgi_cache_key "$scheme$request_method$host$request_uri";fastcgi_cache_use_stale error timeout invalid_header http_500;fastcgi_ignore_headers Cache-Control Expires Set-Cookie;fastcgi_temp_path  /tmp/nginx/fcgi/temp;

vhost配置

server {	server_name example.com www.example.com;	access_log   /var/log/nginx/example.com.access.log;	error_log    /var/log/nginx/example.com.error.log;	root /var/www/example.com/htdocs;	index index.php;	set $skip_cache 0;	# POST requests and urls with a query string should always go to PHP	if ($request_method = POST) {		set $skip_cache 1;	}   	if ($query_string != "") {		set $skip_cache 1;	}   	# Don't cache uris containing the following segments	if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {		set $skip_cache 1;	}   	# Don't use the cache for logged in users or recent commenters	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {		set $skip_cache 1;	}	location / {		try_files $uri $uri/ /index.php?$args;	}    	location ~ /.php($|/) {		try_files $uri =404; 		include fastcgi_params;		fastcgi_split_path_info         ^(.+/.php)(/.+)$;		fastcgi_param PATH_INFO         $fastcgi_path_info;		fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;		fastcgi_pass unix:/dev/shm/php-socket;		fastcgi_cache_bypass $skip_cache;		fastcgi_no_cache $skip_cache;		fastcgi_cache WORDPRESS;		include fcgi_cache_params;	}	location ~ /purge(/.*) {	    fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";	}		location ~* ^.+/.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|PPT|tar|mid|midi|wav|bmp|rtf)$ {		access_log off;	log_not_found off; expires max;	}	location = /robots.txt { access_log off; log_not_found off; }	location ~ //. { deny  all; access_log off; log_not_found off; }}

fcgi_cache_params配置

#include fcgi_cache_params;#fastcgi_cache_valid 200 302 1s;### fcgi-cachefastcgi_cache fcgi;fastcgi_cache_valid 200 302 1s;fastcgi_cache_valid 404 500 502 503 504 0s;fastcgi_cache_valid any 1m;fastcgi_cache_min_uses 1;fastcgi_cache_use_stale error timeout invalid_header http_500 http_503 updating;fastcgi_ignore_headers Cache-Control Expires Set-Cookie;#add_header X-Cache "$upstream_cache_status - $upstream_response_time";fastcgi_cache_key "$scheme$request_method$host$request_uri"

大概解釋下各個參數的含義:

fastcgi_cache  該指令用于設置哪個緩存區將被使用,zone_name的值為fastcgi_cache_path指令創建的緩存名稱

fastcgi_cache_path 作用域:http

fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

該指令用于設置緩存文件的存放路徑,示例如下:fastcgi_cache_path /data/nginx/cache levels=1:2  keys_zone=cache_one:100M  inactive=1d  max_size=10g; 

a、levels:指定了該緩存空間有兩層hash目錄,設置緩存目錄層數,levels=1:2,表示創建兩層目錄緩存,最多創建三層。第一層目錄名取fastcgi_cache_key md5的最后一個字符,第二層目錄名取倒數2-3字符,如:fastcgi_cache_key md5為b7f54b2df7773722d382f4809d65029c,則:

levels=1:2為/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029clevels=1:2:3為/data/nginx/cache/c/29/650/b7f54b2df7773722d382f4809d65029c

b、keys_zone為這個緩存區起名為zone_name,500m指代緩存空間為500MB; 

c、inactive=1d 代表如果緩存文件一天內沒有被訪問,則刪除; 

d、max_size=30g代表硬盤緩存最大為30G;

設置緩存多個磁盤

fastcgi_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g  inactive=60m use_temp_path=off;fastcgi_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g  inactive=60m use_temp_path=off;split_clients $request_uri $my_cache {              50%          "my_cache_hdd1";              50%          "my_cache_hdd2";}server {    ...    location / {       fastcgi_cache $my_cache;           }}

將緩存文件放入內存中

編輯/etc/fstab  或者 放入 /dev/shm

tmpfs /etc/nginx/cache tmpfs defaults,size=100M 0 0mount -adf -ah | grep tmpfs 

需要注意的是fastcgi_cache緩存是先寫在fastcgi_temp_path再移到fastcgi_cache_path,所以這兩個目錄最好在同一個分區,從0.8.9之后可以在不同的分區,不過還是建議放同一分區

 

fastcgi_cache_methods 該指令用于設置緩存哪些HTTP方法,默認緩存HTTP GET/HEAD方法。 

fastcgi_cache_min_uses  URL經過多少次請求將被緩存

fastcgi_cache_valid  reply_code [reply_code ... ] time

該指令用于對不同返回狀態碼的URL設置不同的緩存時間,例如: 

fastcgi_cache_valid 200 302 10m;fastcgi_cache_valid 404      1m;

設置202 302狀態URL緩存10分鐘,404狀態的URL緩存1分鐘。

注意:如果不指定狀態碼,直接指定緩存時間,則只有200,301,302狀態碼會進行緩存。

fastcgi_cache_valid 5m;

any 可以指定緩存任何響應碼    

fastcgi_cache_valid 200 302 10m;fastcgi_cache_valid 301      1h;fastcgi_cache_valid any      1m;

緩存的參數也可以在響應頭直接設置。這些的優先級高于緩存時間設定使用該指令

  • The “X-Accel-Expires” header field sets caching time of a response in seconds. The zero value disables caching for a response. If the value starts with the @ prefix, it sets an absolute time in seconds since Epoch, up to which the response may be cached.
  • If the header does not include the “X-Accel-Expires” field, parameters of caching may be set in the header fields “Expires” or “Cache-Control”.
  • If the header includes the “Set-Cookie” field, such a response will not be cached.
  • If the header includes the “Vary” field with the special value “*”, such a response will not be cached (1.7.7). If the header includes the “Vary” field with another value, such a response will be cached taking into account the corresponding request header fields (1.7.7).

fastcgi_cache_key

該指令用來設置Web緩存的Key值,Nginx根據Key值MD5緩存。一般根據$host(域名),$request_uri(請求的路徑)等變量組合成fastcgi_cache_key。

例如:fastcgi_cache_key "$scheme$request_method$host$request_uri";

定義fastcgi_cache的key,示例中就以請求的URI作為緩存的key,Nginx會取這個key的md5作為緩存文件,如果設置了緩存哈希目錄,Nginx會從后往前取相應的位數做為目錄。

注意一定要加上$request_method作為cache key,否則如果HEAD類型的先請求會導致后面的GET請求返回為空

fastcgi_temp_path  path [level1 [level2 [level3]]];  默認為 fastcgi_temp;

該指令用來設置fastcgi_cache臨時文件目錄

fastcgi_temp_path /spool/nginx/fastcgi_temp 1 2;

a temporary file might look like this:

/spool/nginx/fastcgi_temp/7/45/00000123457

fastcgi_cache_use_stale : fastcgi_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_503 | http_403 | http_404 | off ...;

定義哪些情況下用過期緩存

x-cache頭,用于調試

$upstream_response_time為過期時間

$upstream_cache_status 變量表示此請求響應來自cache的狀態,幾種狀態分別為:

  • MISS – The response was not found in the cache and so was fetched from an origin server. The response might then have been cached.
  • BYPASS – The response was fetched from the origin server instead of served from the cache because the request matched a proxy_cache_bypass directive (see Can I Punch a Hole Through My Cache? below.) The response might then have been cached.
  • EXPIRED – The entry in the cache has expired. The response contains fresh content from the origin server.
  • STALE – The content is stale because the origin server is not responding correctly, and proxy_cache_use_stale was configured.
  • UPDATING – The content is stale because the entry is currently being updated in response to a previous request, and proxy_cache_use_stale updating is configured.
  • REVALIDATED – The proxy_cache_revalidate directive was enabled and NGINX verified that the current cached content was still valid (If-Modified-Since or If-None-Match).
  • HIT – The response contains valid, fresh content direct from the cache.

有一些情況會影響到cache的命中 這里需要特別注意

  • Nginx fastcgi_cache在緩存后端fastcgi響應時,當響應里包含“set-cookie”時,不緩存;
  • 當響應頭包含Expires時,如果過期時間大于當前服務器時間,則nginx_cache會緩存該響應,否則,則不緩存;
  • 當響應頭包含Cache-Control時,如果Cache-Control參數值為no-cache、no-store、private中任意一個時,則不緩存,如果Cache-Control參數值為max-age時,會被緩存,且nginx設置的cache的過期時間,就是系統當前時間 + mag-age的值。
header("Expires: ".gmdate("D, d M Y H:i:s", time()+10000).' GMT');header("Expires: ".gmdate("D, d M Y H:i:s", time()-99999).' GMT');header("X-Accel-Expires:5"); // 5sheader("Cache-Control: no-cache"); //no cacheheader("Cache-Control: no-store"); //no cacheheader("Cache-Control: private"); //no cacheheader("Cache-Control: max-age=10"); //cache 10ssetcookie('hello',"testaaaa"); //no cache

注意session使用的時候有坑,可以用下面來設置

session_cache_limiter("none");session_start();echo date("Y-m-d H:i:s",time());

可以看一下PHP源代碼中的頭信息 Expires等

//ext/session/session.c  line:1190 左右// ...CACHE_LIMITER_FUNC(private) /* {{{ */{    ADD_HEADER("Expires: Thu, 19 Nov 1981 08:52:00 GMT");    CACHE_LIMITER(private_no_expire)(TSRMLS_C);}/* }}} *///再到這里3 或者上面幾個 ##默認是nocacheCACHE_LIMITER_FUNC(nocache) /* {{{ */{    ADD_HEADER("Expires: Thu, 19 Nov 1981 08:52:00 GMT");     /* For HTTP/1.1 conforming clients and the rest (MSIE 5) */    ADD_HEADER("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");     /* For HTTP/1.0 conforming clients */    ADD_HEADER("Pragma: no-cache");}/* }}} *///這里2static php_session_cache_limiter_t php_session_cache_limiters[] = {    CACHE_LIMITER_ENTRY(public)    CACHE_LIMITER_ENTRY(private)    CACHE_LIMITER_ENTRY(private_no_expire)    CACHE_LIMITER_ENTRY(nocache)    {0}}; static int php_session_cache_limiter(TSRMLS_D) /* {{{ */{    php_session_cache_limiter_t *lim;     if (PS(cache_limiter)[0] == '/0') return 0;     if (SG(headers_sent)) {        const char *output_start_filename = php_output_get_start_filename(TSRMLS_C);        int output_start_lineno = php_output_get_start_lineno(TSRMLS_C);         if (output_start_filename) {            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent (output started at %s:%d)", output_start_filename, output_start_lineno);        } else {            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent");        }        return -2;    }     for (lim = php_session_cache_limiters; lim->name; lim++) {        if (!strcasecmp(lim->name, PS(cache_limiter))) {            lim->func(TSRMLS_C);   //這里1            return 0;        }    }     return -1;}

三、清除緩存

NGINX只在商業版中支持proxy_cache_purge指令清除緩存,開源的ngx_cache_purge模塊只支持單一key的緩存清除。為了實現按目錄清除緩存只能自己開發。

NGINX作為Cache服務器時將資源內容以文件形式進行緩存,緩存元信息存儲于共享內存中,組織成一棵紅黑樹。紅黑樹中的每個節點代表一個Cache元信息。NGINX將Cache Key的HASH值作為紅黑樹節點的KEY。內容緩存文件以該HASH值作為文件名存儲在磁盤上。

NGINX的處理流程簡化描述是這樣的:當請求到達時,根據Cache Key的HASH值在紅黑樹中進行查找。如果找到,并查看相關信息,如果Cache可用,返回相應的Cache文件。否則,則回源抓取。

因為元信息是以Cache Key的HASH值作為Key存儲的,因而紅黑樹中并不能保留Cache Key中有層級關系. 如”/uri/foo”和”/uri/bar”在元信息紅黑樹中完全沒有關系。要實現按照目錄清除緩存,需要將Cache Key中層次關系存儲起來。

可以這樣做,在共享內存中建立一棵目錄樹來存儲層級關系。將Cache Key類比于文件系統中的路徑, 每級路徑存儲為樹中的一個節點。當需要清除某一目錄下的所有緩存時,將該節點子樹的中的所有緩存清除即可。

安裝Purge模塊

Purge模塊被用來清除緩存

wget http://labs.frickle.com/files/ngx_cache_purge-1.2.tar.gztar -zxvf ngx_cache_purge-1.2.tar.gz

編譯

./configure /…… /--with-http_geoip_module /--add-module=/usr/local/ngx_cache_purge-1.2

四、需要注意的一些問題

設置了之后重啟nginx就可以生效了,這個時候再訪問php的頁面的話,就會被緩存了,可以查看/var/logs/nginx/fastcgi_cache_dir這個目錄下面是有緩存文件的。最后再說明一點,如果更改了緩存目錄的路徑,一定要把緩存的名稱也改掉,后端調用的名稱也同步改掉,如果只改掉了緩存目錄,不改緩存名稱的話,緩存的時候還是會緩存到之前的路徑下面去,但是調用的時候調用的是新的路徑,這個時候就會出現找不到的情況

 

參考文章

http://www.nginxtips.com/configure-nginx-fastcgi-cache/

http://www.haidx.com/fastcgi-cache-details.html

http://www.just4coding.com/blog/2014/11/01/nginx-purge-directory/

http://weizhifeng.net/nginx-proxy-cache.html

https://www.nginx.com/blog/nginx-caching-guide/#gs.6PdbraI

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

https://www.cnxct.com/several-reminder-in-nginx-fastcgi_cache-and-php-session_cache_limiter/

https://rtcamp.com/wordpress-nginx/tutorials/single-site/fastcgi-cache-with-purging/

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品国产aⅴ7777| 欧美激情按摩在线| 欧美最猛性xxxxx(亚洲精品)| 91精品国产高清自在线看超| 国产精品国产三级国产专播精品人| 亚洲天堂久久av| 久久亚洲综合国产精品99麻豆精品福利| 日韩有码在线电影| 中文字幕免费精品一区高清| 国产成人涩涩涩视频在线观看| 在线观看国产精品91| 伊人男人综合视频网| 欧美大成色www永久网站婷| 亚洲香蕉成人av网站在线观看| 亚洲精品xxx| 国产视频在线一区二区| 97成人在线视频| 国产精品免费福利| 亚洲精品福利视频| 性色av一区二区三区红粉影视| 久久久免费精品| 亚洲国产精品中文| 亚洲第一页中文字幕| 亚洲精品日韩久久久| 欧美激情网友自拍| 欧美日韩日本国产| 大胆欧美人体视频| 狠狠色狠狠色综合日日小说| 国产欧美日韩免费| 精品久久久久国产| 国产精品视频在线播放| 丰满岳妇乱一区二区三区| 午夜精品一区二区三区av| 久久久久中文字幕2018| 欧美一级电影在线| 另类美女黄大片| 久久精品人人做人人爽| 国产精品一区二区三区毛片淫片| 国产精品国内视频| 久久精品中文字幕| 亚洲韩国日本中文字幕| 成人午夜两性视频| 成人亲热视频网站| 久久精品久久精品亚洲人| 亚洲色图校园春色| 最近中文字幕mv在线一区二区三区四区| 欧美性感美女h网站在线观看免费| 国产精品久久久久久久9999| 国产成人精品视频| 91免费视频网站| 国产精品久久激情| 国产又爽又黄的激情精品视频| 欧美色视频日本版| 日韩电影免费在线观看中文字幕| 狠狠色香婷婷久久亚洲精品| 日韩激情视频在线| 中文字幕欧美精品日韩中文字幕| 伊人av综合网| 欧美小视频在线观看| 九九九久久久久久| 亚洲精品第一页| 91精品视频在线看| 亚洲二区在线播放视频| 国产精品久久婷婷六月丁香| 九九九久久国产免费| 久久视频在线观看免费| 亚洲一区二区久久久久久久| 欧美xxxx18性欧美| 欧美激情18p| 国产亚洲视频中文字幕视频| 一级做a爰片久久毛片美女图片| 欧美一级bbbbb性bbbb喷潮片| 久久久精品一区二区三区| 91精品久久久久久久久久久| 亚洲精品一区二区三区不| 国产成人精品一区二区在线| 亚洲香蕉成人av网站在线观看| 91国内免费在线视频| 少妇高潮 亚洲精品| 国产精品444| 97在线观看免费高清| 91国产视频在线播放| 成人免费福利视频| 欧美日韩另类视频| 亚洲最大成人网色| 国语自产精品视频在线看一大j8| 亚洲欧美一区二区三区四区| 欧日韩不卡在线视频| 欧美福利视频网站| 精品成人av一区| 久久综合网hezyo| 青青久久av北条麻妃黑人| www.欧美视频| 欧美午夜美女看片| 日韩亚洲成人av在线| 92裸体在线视频网站| 精品亚洲一区二区三区| 欧美日韩视频在线| 中文字幕亚洲欧美一区二区三区| 日韩欧美主播在线| 久久久久久综合网天天| 国产视频999| 日韩精品中文字幕久久臀| 97视频在线观看免费高清完整版在线观看| 国内精品一区二区三区四区| 精品福利樱桃av导航| 精品久久香蕉国产线看观看亚洲| 91禁国产网站| 精品少妇一区二区30p| 国产亚洲人成网站在线观看| 中文字幕日韩视频| 国产亚洲a∨片在线观看| 国产视频精品自拍| 亚洲欧美激情精品一区二区| 国产亚洲精品高潮| 日本成人在线视频网址| 亚洲精品日韩在线| 91精品国产99久久久久久| 精品成人久久av| 精品人伦一区二区三区蜜桃网站| 欧美精品在线看| 久久精品2019中文字幕| 中文字幕欧美视频在线| 中文字幕欧美亚洲| 综合av色偷偷网| 久久久精品久久| 狠狠久久五月精品中文字幕| 国产精品久久电影观看| 最近的2019中文字幕免费一页| 亚洲国产精品99| 亚洲视频欧洲视频| 欧美成人激情视频免费观看| 91在线视频九色| 国产精品永久免费观看| 久久久免费精品视频| 亚洲欧美一区二区精品久久久| 国产精品日日做人人爱| 欧美人在线视频| 亚洲国产婷婷香蕉久久久久久| 日韩中文字幕第一页| 亚洲日本中文字幕| 国产欧美日韩丝袜精品一区| 欧美成人性生活| 精品久久久中文| 国产精品三级网站| 91大神福利视频在线| 一本色道久久综合狠狠躁篇的优点| 亚洲香蕉在线观看| 久久福利网址导航| 在线观看亚洲区| 91免费欧美精品| 亚洲国产精品一区二区久| 欧美大奶子在线| 欧美网站在线观看| 久久久欧美精品| 欧美大肥婆大肥bbbbb| 国产精品十八以下禁看| 亚洲国产精品久久久久秋霞不卡| 久久精品青青大伊人av| 欧美成人精品不卡视频在线观看| 91精品久久久久久久久久久久久| 欧美在线视频观看免费网站| 日韩精品一二三四区| 亚洲欧美在线免费|