廢話不多說了, 直接上配置, 其實 fastcgi_cache 和 proxy_cache 的配置基本一樣:
# !快取檔案存放目錄幾個問題:# levels 快取層次
# inactive 失效時間, 1d = 1天
# max_size 最大快取空間(硬碟占用)
fastcgi_cache_path /home/xwsoul/code/web/demo/cgi_cache/cache_dir/ levels=2:2 keys_zone=cgi_one:10m inactive=2h max_size=2g;
server
try_files $uri @missing;
location @missing
location ~ .*\.php$
# cgi指向位址
fastcgi_pass 127.0.0.1:9000;
# 呼叫 cache 的命名空間
fastcgi_cache cgi_one;
# 快取觸發的方法 header, get, post 中的乙個或多個
fastcgi_cache_methods get;
# 生成的快取名稱的 key 的名字
# $request_method 請求方法,基於上面的設定,這裡為get
# $host 主機
# $request_uri 請求位址
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# 生效值: 即**目標的狀態碼以及快取時間
fastcgi_cache_valid 200 302 1h;
# 確定快取成為過期資料的情況
# 請求過多少次相同的url後, 快取將開始
fastcgi_cache_min_uses 1;
# 關閉快取
fastcgi_cache_bypass $xwsoul_nocache;
fastcgi_no_cache $xwsoul_nocache;
# 傳送頭資訊到客戶端 - 一般是瀏覽器
add_header x-cache "$upstream_cache_status";
# fastcgi 的其他引數配置
include fastcgi.conf;
}}
1. 為什麼使用 set 變數控制 $xwsoul_nocache 來控制 fastcgi_cache_bypass(0.8x之後官方推薦的方法) 和 fastcgi_no_cache 引數確定是否生成快取?
很簡單, 因為不能是所有的頁面都需要 cache.當然有更好的實現方法請盡量給建議.
2. 如果我在 /cgi_cache/ 下的指令碼不需要快取可以實現麼, 怎麼辦?
這個也很簡單, 通過 cgi 的返回的 head 即可控制:
header('cache-control:no-cache, must-revalidate, max-age=0;');
和header('expires:0;');
均可實現.
3. 為什麼快取的 cache name 裡需要 $scheme ?
因為 http/https 是不同的安全級別, 可能需要的快取機制是不一樣的!
最後附上對應訪問的php測試指令碼
<?php';$code = isset($_get['code'])?$_get['code']:'';
echo '';
var_dump($code);
echo '
$code = md5($code);
$rand = mt_rand(1, 10);
echo '';
echo 'loop', $rand, ':
';for ($i = 0;$i < $rand;$i++)
echo '
';echo date('ymd h:i:s'), '';
廢話不多說了, 直接上配置, 其實 fastcgi_cache 和 proxy_cache 的配置基本一樣:
# !快取檔案存放目錄幾個問題:# levels 快取層次
# inactive 失效時間, 1d = 1天
# max_size 最大快取空間(硬碟占用)
fastcgi_cache_path /home/xwsoul/code/web/demo/cgi_cache/cache_dir/ levels=2:2 keys_zone=cgi_one:10m inactive=2h max_size=2g;
server
try_files $uri @missing;
location @missing
location ~ .*\.php$
# cgi指向位址
fastcgi_pass 127.0.0.1:9000;
# 呼叫 cache 的命名空間
fastcgi_cache cgi_one;
# 快取觸發的方法 header, get, post 中的乙個或多個
fastcgi_cache_methods get;
# 生成的快取名稱的 key 的名字
# $request_method 請求方法,基於上面的設定,這裡為get
# $host 主機
# $request_uri 請求位址
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# 生效值: 即**目標的狀態碼以及快取時間
fastcgi_cache_valid 200 302 1h;
# 確定快取成為過期資料的情況
# 請求過多少次相同的url後, 快取將開始
fastcgi_cache_min_uses 1;
# 關閉快取
fastcgi_cache_bypass $xwsoul_nocache;
fastcgi_no_cache $xwsoul_nocache;
# 傳送頭資訊到客戶端 - 一般是瀏覽器
add_header x-cache "$upstream_cache_status";
# fastcgi 的其他引數配置
include fastcgi.conf;
}}
1. 為什麼使用 set 變數控制 $xwsoul_nocache 來控制 fastcgi_cache_bypass(0.8x之後官方推薦的方法) 和 fastcgi_no_cache 引數確定是否生成快取?
很簡單, 因為不能是所有的頁面都需要 cache.當然有更好的實現方法請盡量給建議.
2. 如果我在 /cgi_cache/ 下的指令碼不需要快取可以實現麼, 怎麼辦?
這個也很簡單, 通過 cgi 的返回的 head 即可控制:
header('cache-control:no-cache, must-revalidate, max-age=0;');
和header('expires:0;');
均可實現.
3. 為什麼快取的 cache name 裡需要 $scheme ?
因為 http/https 是不同的安全級別, 可能需要的快取機制是不一樣的!
最後附上對應訪問的php測試指令碼
<?php';$code = isset($_get['code'])?$_get['code']:'';
echo '';
var_dump($code);
echo '
$code = md5($code);
$rand = mt_rand(1, 10);
echo '';
echo 'loop', $rand, ':
';for ($i = 0;$i < $rand;$i++)
echo '
';echo date('ymd h:i:s'), '
';
基於nginx的FastCGI的快取配置
廢話不多說了,直接上配置,其實 fastcgi cache 和 proxy cache 的配置基本一樣 快取檔案存放目錄 levels 快取層次 inactive 失效時間,1d 1天 max size 最大快取空間 硬碟占用 fastcgi cache path home xwsoul code ...
基於nginx的FastCGI的快取配置
廢話不多說了,直接上配置,其實 fastcgi cache 和 proxy cache 的配置基本一樣 快取檔案存放目錄 levels 快取層次 inactive 失效時間,1d 1天 max size 最大快取空間 硬碟占用 fastcgi cache path home xwsoul code ...
Nginx中FastCGI配置優化
fastcgi fastcgi是從cgi發展改進而來的。傳統cgi介面方式的主要缺點是效能很差,因為每次http伺服器遇到動態程式時都需要重新啟動指令碼解析器來執行解析,然後結果被返回給http伺服器。這在處理高併發訪問時,幾乎是不可用的。另外傳統的cgi介面方式安全性也很差,現在已經很少被使用了。...