当前位置: > Linux服务器 > nginx >

nginx缓存了空响应导致之后的请求都返回空的解决方案

时间:2015-06-28 19:35来源:linux.it.net.cn 作者:IT
在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)
------分隔线----------------------------
栏目列表
推荐内容