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 restart5、打開站點,看緩存目錄是否增大
du -sh /home/cache/fcgi
轉自:http://blog.angryfox.com/?p=1930