欢迎光临
屌丝博客

nginx的fastcgi_cache缓存

proxy_cache的作用是缓存后端服务器的内容,包括静态的和动态。另一文章
fastcgi_cache的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容。
proxy_cache缓存减少了nginx与后端通信的次数,节省了传输时间和后端宽带。

fastcgi_cache缓存减少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力,这比用memcached之类的缓存要轻松得多。

$uri 和  $request_uri结果可能不一样(譬如伪静态,需要自己重新定义url)

proxy_cache_path /dev/shm/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

location ~ .*\.php?$
{
    set $nocache yes;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;

    if ( $request_uri ~ "^/test"){
        set $nocache "";
    }
    fastcgi_cache   cache_php;
    fastcgi_cache_valid   200 302  1h;
    fastcgi_cache_min_uses  1;
    fastcgi_cache_use_stale error  timeout invalid_header http_500;
    fastcgi_cache_key $scheme://$host$request_uri;
    fastcgi_cache_bypass  $nocache;
    fastcgi_no_cache  $nocache;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
 }
 
fastcgi_cache_path:fastcgi_cache
缓存目录,可以设置目录层级,比如1:2会生成16*256个字目录,cache_php是这个缓存空间的名字,cache是用多少内存(这样热门的内容
nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间。本来还有个
fastcgi_temp_path参数,但发现似乎没用。
fastcgi_cache_valid:定义哪些http头要缓存
fastcgi_cache_min_uses:URL经过多少次请求将被缓存
fastcgi_cache_use_stale:定义哪些情况下用过期缓存
fastcgi_cache_key:定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,Nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录

fastcgi_cache:用哪个缓存空间
 
 php删除缓存的文件
 function clearCache($url) {
    $cacheRoot = '/dev/shm/proxy_cache_dir';
    $url = trim($url);
    
    if (empty($url)) return '请输入正确URL.';
    
    $md5 = md5($url);
    $cacheFile = $cacheRoot . '/' . substr($md5, -2, 2) . '/' . substr($md5, -4, 2) . '/' . $md5;
    
    if (!file_exists($cacheFile)) return '缓存不存在';
    
    if (@unlink($cacheFile)) {
        return '清除缓存成功。';
    } else {
        return '清除缓存失败。';
    }
}
 
 这个脚本有个副作用,手动清除之后,缓存失效,但Nginx后面还会自己清除一遍,然后报个unlink失败的日志,不过无关紧要。