基於nginx的FastCGI的快取配置

2021-09-02 03:47:42 字數 4414 閱讀 4409

廢話不多說了, 直接上配置, 其實 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介面方式安全性也很差,現在已經很少被使用了。...