在it.net.cn的日志中出现了很多返回的状态号为200但是Content-Length为0的日志记录,类似下面的记录: 1.202.219.10 - - [01/Mar/2013:22:51:56 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (compatible; JikeSpider; +http://shoulu.jike.com/spider.html)" 212.95.58.204 - - [02/Mar/2013:01:22:03 +0800] "GET / HTTP/1.1" 200 0 "http://leaguan.netfast.org/info/outofmemory.cn" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14" 144.76.19.166 - - [02/Mar/2013:05:25:29 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:7.0.1) Gecko/20100101 Firefox/7.0.1" 1.202.219.100 - - [02/Mar/2013:05:49:08 +0800] "HEAD /code-snippet/tagged/%E5%8D%95%E9%93%BE%E8%A1%A8%26%26c%2B%2B HTTP/1.1" 200 0 "-" "Mozilla/5.0 (compatible; JikeSpider; +http://shoulu.jike .com/spider.html)"但是程序中理论上是没有长度为0的响应的,没有办法只有从nginx配置上解决问题,我们可以通过判断nginx输出响应的长度是否为0来判断是否要缓存当前的响应。 首先需要在nginx的http配置节内添加map变量: map $upstream_http_content_length $flag_cache_empty { default 0; 0 1; }然后在nginx的配置文件目录下新建一个名字为disable_empty_response_cache.conf的配置文件,文件内容如下: fastcgi_no_cache $flag_cache_empty; fastcgi_cache_bypass $flag_cache_empty;这个文件中定义了fastcgi_no_cache和 fastcgi_cache_bypass的值为$flag_cache_empty,也就是说如果响应为空则不做缓存。 最后一步,需要在使用了nginx缓存的location中引用disable_empty_response_cache.conf文件,如下示例: #outofmemory.cn code details page, do cache location ~ /code-snippet/\d+/(.+)$ { include oom_fastcgi_params.conf; fastcgi_cache nginx_webpy_cache; fastcgi_cache_valid 200 100d; fastcgi_cache_min_uses 1; fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; fastcgi_hide_header "Set-Cookie"; include disable_empty_response_cache.conf; add_header X-Cache $upstream_cache_status; }这样nginx就不会缓存空响应了。 (责任编辑:IT) |