nginx不僅有個大家很熟悉的緩存代理后端內容的proxy_cache,還有個被很多人忽視的fastcgi_cache。
proxy_cache的作用是緩存后端服務器的內容,可能是任何內容,包括靜態的和動態.
fastcgi_cache的作用是緩存fastcgi生成的內容,很多情況是php生成的動態的內容.
proxy_cache緩存減少了nginx與后端通信的次數,節省了傳輸時間和后端寬帶.
fastcgi_cache緩存減少了nginx與php的通信的次數,更減輕了php和數據庫(mysql)的壓力,這比用memcached之類的緩存要輕松得多。
但是,緩存也有弊端,比如說評論了之后不能會當時顯示等等,自己取舍,有得必有失.
本著測試的原則,在本站上測試了一下fastcgi_cache這個功能,貌似還不錯,減少數據庫的查詢了,順便優化下fastcgi的參數,的嘿嘿,貼上配置nginx的httpd段里面加入
fastcgi_connect_timeout 300;
指定連接到后端FastCGI的超時時間。
fastcgi_send_timeout 300;
向FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手后向FastCGI傳送請求的超時時間。
fastcgi_read_timeout 300;
接收FastCGI應答的超時時間,這個值是指已經完成兩次握手后接收FastCGI應答的超時時間。
fastcgi_buffer_size 32k;
指定讀取FastCGI應答第一部分需要用多大的緩沖區,一般第一部分應答不會超過1k,由于頁面大小為4k,所以這里設置為4k。
fastcgi_buffers 4 32k;
定本地需要用多少和多大的緩沖區來緩沖FastCGI的應答請求。如果一個PHP腳本所產生的頁面大小為256KB,那么會為其分配4個64KB的緩沖區來緩存;如果頁面大小大于256KB,那么大于256KB的部分會緩存到fastcgi_temp指定的路徑中,但是這并不是好方法,因為內存中的數據處理速度要快于硬盤。一般這個值應該為站點中PHP腳本所產生的頁面大小的中間值,如果站點大部分腳本所產生的頁面大小為256KB,那么可以把這個值設置為“16 16k”、“4 64k”等。
fastcgi_busy_buffers_size 64k;
默認值是fastcgi_buffers的兩倍。
fastcgi_temp_file_write_size 64k;
在寫入fastcgi_temp_path時將用多大的數據塊,默認值是fastcgi_buffers的兩倍。
fastcgi_cache_path /var/logs/nginx/fastcgi_cache_dir levels=1:2 keys_zone=cache_fastcgi:128m inactive=1d max_size=10g;
這個指令為FastCGI緩存指定一個路徑,目錄結構等級,關鍵字區域存儲時間和非活動刪除時間。以及最大占用空間。
然后在server的location里面調用,如下緩存php文件:
- location ~ /.php$ {
- root /var/www/html/yan_blog;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; //Vevb.com
- include fastcgi_params;
- fastcgi_cache cache_fastcgi;
表示開啟FastCGI緩存并為其指定一個名稱。
fastcgi_cache_valid 200 302 301 1h;
fastcgi_cache_valid any 1m;
為指定的應答代碼指定緩存時間,如上例中將200,302 301應答緩存一小時,其他為1分鐘。
fastcgi_cache_min_uses 1;
設置鏈接請求幾次就被緩存。
fastcgi_cache_use_stale error timeout invalid_header http_500;
定義哪些情況下用過期緩存
fastcgi_cache_key $request_method://$host$request_uri;
注意一定要加上$request_method作為cache key,否則如果HEAD類型的先請求會導致后面的GET請求返回為空
}
設置了之后重啟nginx就可以生效了,這個時候再訪問php的頁面的話,就會被緩存了,可以查看/var/logs/nginx/fastcgi_cache_dir這個目錄下面是有緩存文件的。最后再說明一點,如果更改了緩存目錄的路徑,一定要把緩存的名稱也改掉,后端調用的名稱也同步改掉,如果只改掉了緩存目錄,不改緩存名稱的話,緩存的時候還是會緩存到之前的路徑下面去,但是調用的時候調用的是新的路徑,這個時候就會出現找不到的情況,在日志里面可以看出來,如下:
- 2012/04/24 13:55:35 [emerg] 2020#0: cache “cache_one” uses the “/var/logs/nginx/fastcgi_cache_dir” cache path while previously it used the “/var/logs/nginx/proxy_cache_dir” cache path
- 2012/04/24 14:06:30 [emerg] 2020#0: cache “cache_one” uses the “/var/logs/nginx/fastcgi_cache_dir” cache path while previously it used the “/var/logs/nginx/proxy_cache_dir” cache path
- 2012/04/24 14:16:03 [emerg] 2020#0: cache “cache_one” uses the “/var/logs/nginx/fastcgi_cache_dir” cache path while previously it used the “/var/logs/nginx/proxy_cache_dir” cache path
- 2012/04/24 14:25:39 [emerg] 2020#0: cache “cache_fastcgi” uses the “/var/logs/nginx/proxy_cache_dir” cache path while previously it used the “/var/logs/nginx/fastcgi_cache_dir” cache path
這個問題讓我糾結了好久,最后查看日志才發現沒改緩存名的時候,調用的時候調用的是新路徑,但是緩存的時候緩存到沒改之前的路徑里面去了。郁悶、
新聞熱點
疑難解答
圖片精選