(完整版)Nginx模块fastcgi_cache的几个注意点_第1页
(完整版)Nginx模块fastcgi_cache的几个注意点_第2页
(完整版)Nginx模块fastcgi_cache的几个注意点_第3页
(完整版)Nginx模块fastcgi_cache的几个注意点_第4页
(完整版)Nginx模块fastcgi_cache的几个注意点_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、配置这些参数时,注意每个参数的作用域,像fastcgi cache path 参数,只能在httpNginx 模块fastcgi_cache的几个注意点在web项目中,大家都已经非常熟悉其架构流程了。都说Cache是万金油,哪里不舒服抹哪里。这些流程中,几乎每个环节都会进行cache。从浏览器到 webserver,到cgi程序,到DB数据库,会进行浏览器cache,数据cache,SQL查询的cache等等。对于fastcgi这里的cache,很少被使用。去年年底,我对nginx的fastcgi_cache进行摸索使用。在我的 测试过程中,发现一些 WIKI以及网络上没被提到的注意点,这里分

2、享一下。从浏览器到数据库的流程图这里是我的NGinx配置信息#增加调试信息add_header X-Cache-CFC $upstream_cache_status - $upstream_resp on se_time;fastcgi_temp_path /dev/shm/ngin x_tmp;#cache设置fastcgi_cache_path /dev/shm/ngin x_cache levels=1:2 keys_z on e=cfcache:10min active=50m;fastcgi_cache_key $request_method:/$host$request_uri;f

3、astcgi_cache_methods GET HEAD;fastcgi_cache cfcache;fastcgi_cache_valid any 1d;fastcgi_cache_ min _uses 1;fastcgi_cache_use_stale error timeout in valid_header http_500;fastcgi_ig no re_clie nt_abort on;酉己置项里配置,而 fastcgi_cache_min_uses这个参数,可以在 http、server、location三个配置项里配置。这样更灵活的会每个域名、每个匹配的location 进

4、行选择性cache 了。 具体的参数作用域,参考FASTCGI模块的官方 WIKI。我为了调试方便,添加了一个X-Cache-CFC的http 响应头,$upstream_cache_status变量表示此请求响应来自cache的状态,分别为:MISS未命中EXPIRED - expired, request was passed to backend Cache已过期UPDATING- expired, stale response was used due to proxy/fastcgi_cache_use_stale updating Cache已过期,(被其他 nginx 子进程)更

5、新中STALE - expired, stale response was used due to proxy/fastcgi_cache_use_staleCache已过期,响应数据不合法,被污染HIT 命中 cache4r一二说 w- -IL-.FI- 二兰=汇壬-:尸汩.二FASTCGI CACHE $upstream cache status 结果为 miss,次也没命中程序代码是 Discuz!论坛,随便开启测试了几下,发现/dev/shm/nginx_cache/ 下没有任何目录建立,也没有文件创建。调试的http header响应头里的X-Cache-CFC结果一直是 MISSo

6、 从服务器 进程上来看,Nginx cache manager process跟 Nginx cache loaderprocess 进程也正常运行:root 3100 1 0 14:52 ? 00:00:00 ngi nx: master process /usr/sb in/ngi nxwww-data 3101 3100 0 14:52 ? 00:00:00 ngi nx: worker processwww-data 3102 3100 0 14:52 ? 00:00:00 ngi nx: cache ma nager processwww-data 3103 3100 0 14:52

7、 ? 00:00:00 ngi nx: cache loader process不知道为何会这样,为何没有cache成功,我以为我配置参数有问题,只好阅读 WIKI。发现fastcgi_ignore_headers参数下解释有这么一段fastcgi ignore headersSyn tax: fastcgi_ig nore_headers fieldDefault:Con text: httpserverlocatio nRefere nee: fastcgi_ig nore_headersThis directive forbidsprocessing of the named heade

8、rs from the FastCGI-serverreply. It is possible to specify headers like“ X-Accel-Redirect ” ,“X-Accel-Expires” ,“ Expires ” or“ Cache-Control ” .也就是说这个参数的值,将会被忽略掉,同样被忽略掉的响应头比如”X-Accel-Redirect ” , “X-Accel-Expires ” , “ Expires ” or “Cache-Control ”,而 nginx 配置中并没有fastcgi_ignore_headers参数的设定,那么问题会不会出

9、现在FASTCGI响应结果里包含了类似” X-Accel-Redirect ” , “X-Accel-Expires ” , “ Expires ” or“Cache-Control ”这几个响应头呢?用strace抓包,看了下 nginx与fpm进程通讯的数据#为了确保准确抓到处理该http请求的进程,我把nginx、fpm都只开启了一个进程处理。/strace -ff -tt -s 1000 -o xxx.log -p PHPFPM-PID14:52:07.837334 write(3, 1601034350X-Powered-By:PHP/5.3.10-1ubu ntu3.5r nExp

10、ires:Thu, 19 Nov 1981 08:52:00 GMTrnCache-Co ntrol:no-store, no-cache, must-revalidate, post-check=0, pre-check=0r nPragma: no-cacher nConten t-type: text/htmlr nrnH ellocfc4n 13620343270000013010100000000000, 256) = 256/strace -ff -tt -s 1000 -o xxx.log -p Ngi nx-PID15:05:13.265663 recvfrom(12, 160

11、1034350X-Powered-By:PHP/5.3.10-1ubu ntu3.5r nExpires:Thu, 19 Nov 1981 08:52:00 GMTrnCache-Co ntrol:no-store, no-cache, must-revalidate, post-check=0, pre-check=0r nPragma: no-cacher nConten t-type: text/htmlr nrnH ellocfc4n 13620351130000013010100000000000,4023, 0, NULL, NULL)=256从抓取的数据包里可以看到,fpm确实返

12、回了包含Expires 、“ Cache-Control ”头的http响应头信息。那么疑问来了:nginx的fastcgi cache没缓存这条 http 响应,是因为响应头里包含Expires ”、Cache-Co ntrol ”的原因吗程序里并没有输出Expires ”、“ Cache-Control ” http header的代码,这是谁输出的呢?既然是fpm响应的时候,就已经有了,那么是 php的core模块,还是其他拓展模块输 出的?“Expires: ” 时间为何是“ Thu, 19 Nov 1981 08:52:00 GMT ” ?疑问比较多,一个一个查起,先从Nginx的f

13、astcgi_cache 没缓存这条http响应查起。 我根据测试环境 nginx版本1.1.9(ubuntu 12.04默认的),到nginx官方下了对应版本的源 码,搜索了 fastcgi参数使用的地方,在 httpngx_http_upstream.c 找到了。虽然不能很 流程的读懂nginx的代码,但粗略的了解,根据了解的情况加以猜测,再动手测试实验,也得出了结论,确定了 nginx的fastcgi_cache 的规则。n gx_http_upstream.c/line 3136 当 fastcgi响应包含 set-cookie 时,不缓存static ngx_int_tn gx_ht

14、tp_upstream_process_set_cookie( ngx_http_request_t *r, n gx_table_elt_t*h,ngx_uint_t offset)#if (NGX_HTTP_CACHE)n gx_http_upstream_t *u;u = r-upstream;if (!(u-co nf-ig no re_headers & NGX_HTTP_UPSTREAM_IGN_SET_COOKIE) u-cacheable = 0;#en difreturn NGX_OK;/line 3242当响应头包含Expires时,如果过期时间大于当前服务器时间,则ngi

15、nx_cache会缓存该响应,否则,则不缓存static ngx_int_t*h,n gx_http_upstream_process_expires (n gx_http_request_tngx_uint_t offset)n gx_http_upstream_t *u;u = r-upstream;u-headers_i n.expires = h;#if (NGX_HTTP_CACHE)time_t expires;if (u-co nf-ig no re_headers & NGX_HTTP_UPSTREAM_IGN_EXPIRES) return NGX_OK;if (r-cach

16、e = NULL) return NGX_OK;if (r-cache-valid_sec != 0) return NGX_OK;expires = n gx_http_parse_time(h-value.data, h-value .len);if (expires = NGX_ERROR | expires cacheable = 0;return NGX_OK;r-cache-valid_sec = expires;#en difreturn NGX_OK;line 3199当响应头包含 Cache-Control 时,#如果#这里有如果啊。/【注意】如果Cache-Control参

17、数值为no-cache、no-store、private 中任意一个时,则不缓存不缓存II【注意】如果Cache-Control参数值为 max-age时,会被缓存,且nginx设置的cache 的过期时间,就是系统当前时间+ mag-age的值if (n gx_strlcasestrn(p, last, (u_char *) n o-cache, 8 - 1) != NULL| ngx_strlcasestrn(p, last, (u_char *) n o-store, 8 - 1) != NULL| ngx_strlcasestrn(p, last, (u_char *) private

18、, 7 - 1) != NULL)u-cacheable = 0;return NGX_OK;p = n gx_strlcasestr n( p, last, (u_char *) max-age=, 8 - 1);if (p = NULL) return NGX_OK;r-cache-valid_sec = n gx_time() + n;也就是说,fastcgi 响应http 请求的结果中,响应头包括Expires、Cache-Control、Set-Cookie三个,都会可能不被cache,但不只有这些,别忘了 nginx配置中fastcgi_ignore_headers参数设定的部分。

19、以及ngxin 的 X-ACCEL X-Accel-Redirect 、X-Accel-Expires 、X-Accel-Charset 、X-Accel-Buffering等 nginx 自定义的响应头。由于这几个不常用,我也没深入研究。通过对nginx的ngx_http_upstream 模块代码模糊理解,加猜测,以及写了脚本测试验证,可以得到结论是正确的。即Ngi nx fastcgi_cache 在缓存后端fastcgi响应时,当响应里包含“ set-cookie ”时,不缓存;当响应头包含 Expires时, 如果过期时间大于当前服务器时间,则nginx_cache会缓存该响应,否则

20、,则不缓存;当响应头包含 Cache-Control 时,如果 Cache-Control 参数值为 no-cache、no-store、private 中任意一个时,则不缓存,如果Cache-Control参数值为max-age时,会被缓存,且 nginx设置的cache的过期时间,就是系统当前时间+ mag-age的值。nginx fastcgi_cache响应 expirednginx fastcgi_cache hit 命中FASTCGI_CACHE $upstream_cache_status 结果为 miss,次也没命中。/逐个测试,测试时,注释其他的header(Expires:

21、 .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:30);header(Cache-C on trol: no-cache);header(Cache-C on trol: no-store);header(Cache-C on trol: private);header(Cache-C on trol: max-age=10);setcookie(cfc4 n,testaaaa);ech

22、o Hello cfc4n ,time();到了这里,疑问1解决了。那么疑问2、3呢?程序里并没有输出“ Expires“Cache-Control ” http header的代码,这是谁输出的呢 ?既然是fpm响应的时候,就已经有了,那么是php的core模块,还是其他拓展模块输出的?我精简了代码,只输出一个“hello world,发现也确实被缓存了。显然, php脚本程序中并没输出http header 的“ Expires ”、“ Cache-Control ”,多次测试,最终定位到session_start函数,翻阅源码找到了这些代码:/ext/sessio n/sessio n.

23、c lin e: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( no cache) /* */ADD_HEADER(Expires: Thu, 19 Nov 1981 08:52:00 GMT);/* For HTTP/1.1 con formi ng clie nts and

24、 the rest (MSIE 5) */ADD_HEADER(Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0);/* For HTTP/1.0 con formi ng clie nts */ADD_HEADER(Pragma: n o-cache);/* */这里2static php_sessi on _cache_limiter_t php_sessi on _cache_limiters = CACHE_LIMITER_ENTRY(public)CACHE_LIMITER_EN

25、TRY(private)CACHE_LIMITER_ENTRY(private_ no_expire)CACHE_LIMITER_ENTRY( nocache)0;static int php_session_cacheimiter(TSRMLS_D) /* */php_sessi on _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);

26、int output_start_li neno = php_output_get_start_li nen o(TSRMLS_C);if (output_start_file name) php_error_docref(NULLTSRMLS_CCE_WARNING:Cannot send session cache limiter-headers already sen t (output started at %s:%d), output_start_file name, output_start_li neno); else php_error_docref(NULLTSRMLS_CCE_WARNING:Cannot send session cache limiter-headers already sen t);return -2;for (lim = php_sessi on _cache_limiters; lim-n ame; lim+) if (!strcasecmp(lim-n ame, PS(cache_limiter) lim-fu nc(TSRMLS_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论