<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[nginx -cache loader process 进程分析header头输出。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Web服务器]]></category>
<pubDate>Tue, 02 Sep 2014 12:54:13 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nginx模块fastcgi_cache后会在启动时候出现cache manager process和cache loader process 进程，查了下得知这玩意是用来作header使用的，PHP输出后由经它后给替换了header，有点像NAT出去时经过外网的路由时给把IP头给替换一个道理，这样有它的好处，也就是cache控制由前端nginx而不是由php本身，起到分层的作用：<br/><textarea name="code" class="C" rows="15" cols="100">
[root@jackxiang conf]# ps aux&#124;grep nginx
root&nbsp;&nbsp;&nbsp;&nbsp; 30054&nbsp;&nbsp;0.1&nbsp;&nbsp;0.0 308184&nbsp;&nbsp;1740 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ss&nbsp;&nbsp; 20:44&nbsp;&nbsp; 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30060&nbsp;&nbsp;3.6&nbsp;&nbsp;0.3 329396 23208 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;20:44&nbsp;&nbsp; 0:00 nginx: worker process&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30062&nbsp;&nbsp;3.5&nbsp;&nbsp;0.3 329396 23208 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;20:44&nbsp;&nbsp; 0:00 nginx: worker process&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30069&nbsp;&nbsp;0.0&nbsp;&nbsp;0.0 308184&nbsp;&nbsp;2224 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;20:44&nbsp;&nbsp; 0:00 nginx: cache manager process&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30070&nbsp;&nbsp;0.0&nbsp;&nbsp;0.0 308184&nbsp;&nbsp;2112 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;20:44&nbsp;&nbsp; 0:00 nginx: cache loader process 
</textarea><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序代码是Discuz!论坛， 随便开启测试了几下，发现/dev/shm/nginx_cache/下没有任何目录建立，也没有文件创建。调试的http header响应头里的X-Cache-CFC 结果一直是MISS。从服务器进程上来看，Nginx cache manager process 跟Nginx cache loader process 进程也正常运行：<br/>1&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3100&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;0 14:52 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 nginx: master process /usr/sbin/nginx<br/>2&nbsp;&nbsp;www-data&nbsp;&nbsp;3101&nbsp;&nbsp;3100&nbsp;&nbsp;0 14:52 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 nginx: worker process<br/>3&nbsp;&nbsp;www-data&nbsp;&nbsp;3102&nbsp;&nbsp;3100&nbsp;&nbsp;0 14:52 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 nginx: cache manager process<br/>4&nbsp;&nbsp;www-data&nbsp;&nbsp;3103&nbsp;&nbsp;3100&nbsp;&nbsp;0 14:52 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 nginx: cache loader process<br/><br/>不知道为何会这样，为何没有cache成功，我以为我配置参数有问题，只好阅读WIKI。发现fastcgi_ignore_headers 参数下解释有这么一段<br/>&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_ignore_headers<br/>&nbsp;&nbsp;&nbsp;&nbsp;Syntax: fastcgi_ignore_headers field …<br/>&nbsp;&nbsp;&nbsp;&nbsp;Default:<br/>&nbsp;&nbsp;&nbsp;&nbsp;Context: http<br/>&nbsp;&nbsp;&nbsp;&nbsp;server<br/>&nbsp;&nbsp;&nbsp;&nbsp;location<br/>&nbsp;&nbsp;&nbsp;&nbsp;Reference: fastcgi_ignore_headers<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;This directive forbids processing of the named headers from the FastCGI-server reply. It is possible to specify headers like “X-Accel-Redirect”, “X-Accel-Expires”, “Expires” or “Cache-Control”.<br/><br/>也就是说这个参数的值，将会被忽略掉，同样被忽略掉的响应头比如”X-Accel-Redirect”, “X-Accel-Expires”, “Expires” or “Cache-Control”，而nginx配置中并没有fastcgi_ignore_headers参数的设定，那么问题会不会出现在FASTCGI响应结果里包含了类似”X-Accel-Redirect”, “X-Accel-Expires”, “Expires” or “Cache-Control”这几个响应头呢？用strace抓包，看了下nginx与fpm进程通讯的数据<br/>1&nbsp;&nbsp;####为了确保准确抓到处理该http请求的进程，我把nginx 、fpm都只开启了一个进程处理。<br/>2&nbsp;&nbsp;//strace -ff -tt -s 1000 -o xxx.log -p PHPFPM-PID<br/>3&nbsp;&nbsp;14:52:07.837334 write(3, &quot;&#92;1&#92;6&#92;0&#92;1&#92;0&#92;343&#92;5&#92;0X-Powered-By: PHP/5.3.10-1ubuntu3.5&#92;r&#92;nExpires: Thu, 19 Nov 1981 08:52:00 GMT&#92;r&#92;nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0&#92;r&#92;nPragma: no-cache&#92;r&#92;nContent-type: text/html&#92;r&#92;n&#92;r&#92;nHello cfc4n1362034327&#92;0&#92;0&#92;0&#92;0&#92;0&#92;1&#92;3&#92;0&#92;1&#92;0&#92;10&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&quot;, 256) = 256<br/>4&nbsp;&nbsp; <br/>5&nbsp;&nbsp;//strace -ff -tt -s 1000 -o xxx.log -p Nginx-PID<br/>6&nbsp;&nbsp;15:05:13.265663 recvfrom(12, &quot;&#92;1&#92;6&#92;0&#92;1&#92;0&#92;343&#92;5&#92;0X-Powered-By: PHP/5.3.10-1ubuntu3.5&#92;r&#92;nExpires: Thu, 19 Nov 1981 08:52:00 GMT&#92;r&#92;nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0&#92;r&#92;nPragma: no-cache&#92;r&#92;nContent-type: text/html&#92;r&#92;n&#92;r&#92;nHello cfc4n1362035113&#92;0&#92;0&#92;0&#92;0&#92;0&#92;1&#92;3&#92;0&#92;1&#92;0&#92;10&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&#92;0&quot;, 4023, 0, NULL, NULL) = 256<br/><br/>从抓取的数据包里可以看到，fpm确实返回了包含“Expires”、“Cache-Control”头的http 响应头信息。那么疑问来了：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;nginx的fastcgi_cache没缓存这条http响应，是因为响应头里包含“Expires”、“Cache-Control”的原因吗？<br/>&nbsp;&nbsp;&nbsp;&nbsp;程序里并没有输出“Expires”、“Cache-Control” http header的代码，这是谁输出的呢？<br/>&nbsp;&nbsp;&nbsp;&nbsp;既然是fpm响应的时候，就已经有了，那么是php的core模块，还是其他拓展模块输出的？<br/>&nbsp;&nbsp;&nbsp;&nbsp;“Expires:”时间为何是“Thu, 19 Nov 1981 08:52:00 GMT”?<br/><br/>疑问比较多，一个一个查起，先从Nginx的fastcgi_cache没缓存这条http响应查起。我根据测试环境nginx版本1.1.9(ubuntu 12.04默认的)，到nginx官方下了对应版本的源码，搜索了fastcgi参数使用的地方，在http&#92;ngx_http_upstream.c找到了。虽然不能很流程的读懂nginx的代码，但粗略的了解，根据了解的情况加以猜测，再动手测试实验，也得出了结论，确定了nginx的fastcgi_cache的规则。<br/><br/>来自：http://www.cnxct.com/several-reminder-in-nginx-fastcgi_cache-and-php-session_cache_limiter/
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] nginx -cache loader process 进程分析header头输出。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>