您的位置:首页 > 运维架构 > Nginx

Nginx的缓存:proxy_cache和fastcgi_cache

2017-02-07 11:35 316 查看
proxy_cache和fastcgi_cache构成了Nginx的缓存,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存,可能是任何内容,包括静态的和动态,缓存减少了nginx与后端通信的次数,节省了传输时间和后端宽带;fastcgi_cache主要用于对FastCGI的动态程序进行缓存,很多情况是php生成的动态的内容,fastcgi_cache缓存减少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力,这比用memcached之类的缓存要轻松得多。。两者的功能基本上一样。

在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为“负载均衡服务器”与“Web缓存服务器”来使用。

所以可以根据实际情况结合使用proxy_cache和fastcgi_cache来架构Nginx的负载均衡系统。

FastCGI 的技术原理就要了解何为”短生存期应用程序”,何为”长生存期应用程序”。先从 CGI 技术开刀,以下是 CGI 技术的理论:每次当客户请求一个 CGI 的时候,Web 服务器就请求操作系统生成一个新的 CGI 进程。当 CGI 满足要求后,服务器就杀死这个进程。服务器对客户端的每个请求都要重复这样的过程。而 FastCGI 技术的理论为:FastCGI 程序一旦产生后,他可以持续工作,足够满足客户的请求直到被明确的终止。如果你希望通过协同处理来提高程序的性能,你可以请求 Web 服务器运行多个
FastCGI应用程序的副本。CGI 就是所谓的短生存期应用程序,FastCGI 就是所谓的长生存期应用程序。由于 FastCGI 程序并不需要不断的产生新进程,可以大大降低服务器的压力。并且产生较高的应用效率。

很多时候一个页面由多个数据片断组成,为了提高页面速度,要么分别缓存,要么整体缓存(所谓的Page Cache)

关于Nginx fastcgi_cache,基础的可以参看Nginx官方文档http://wiki.nginx.org/HttpFcgiModule,下面是一个典型的做法是:
fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
fastcgi_cache_valid 200 301 302 1d;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key http://$host$request_uri;


大概解释下各个参数的含义:

  fastcgi_temp_path:生成fastcgi_cache临时文件目录,fastcgi_cache_path:fastcgi_cache缓存目录,可以设置目录哈希层级,比如2:2会生成256*256个字目录,keys_zone是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先写在fastcgi_temp_path再移到fastcgi_cache_path,所以这两个目录最好在同一个分区,从0.8.9之后可以在不同的分区,不过还是建议放同一分区。

  fastcgi_cache_valid:定义哪些http头要缓存,fastcgi_cache_use_stale:定义哪些情况下用过期缓存

fastcgi_cache_key:定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,Nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录。

  fastcgi_cache:用哪个缓存空间

如何手动清除缓存?有个Nginx的第三方扩展可帮你做到:https://github.com/FRiCKLE/ngx_cache_purge/

直接找到缓存文件,然后删掉就可以;

Nginx fastcgi_cache缓存很不错,但我只想在某些页面用fastcgi_cache,很简单,有两种方法,一是在location中定义fastcgi_cache,这样只有满足一定规则的url才会用上cache,其他的就不会了;另外一种方法是在你不需要缓存的页面上,输出禁止缓存的头信息,用ColaPHP的话,直接$this->response->disableBrowserCache(); 具体代码:
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");


大部分都是Memcache、Xcache、Proxy_Cache,FastCgi Cache很少采用

配置方法很简单

1、新建文件夹存放缓存文件

mkdir /home/cache/fcgi -p (www的权限)

2、修改nginx.conf文件(LNMP一键包目录在/usr/local/nginx/conf/nginx.conf),在http层加入:

fastcgi_cache_path /home/cache/fcgi levels=1:2 keys_zone=fcgi:15m inactive=1d max_size=1g;

#15m为内存占用 1g为硬盘最大占用空间

3、修改位于vhost目录下的站点文件
location ~ .*\.(php|php5)?$
{
#try_files $uri =404;
fastcgi_pass  unix:/tmp/php-cgi.sock;
#fastcgi_index index.php;
include fcgi.conf;
#fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /home/wwwroot/$fastcgi_script_name;  #网站请求的根目录
include        fastcgi_params;
fastcgi_cache fcgi;
fastcgi_cache_valid 200 302 301 1h;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key $request_method:$host$request_uri;
}
/etc/init.d/nginx restart


5、打开站点,看缓存目录是否增大

du -sh /home/cache/fcgi

转自:http://blog.angryfox.com/?p=1930
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: