nginx fastcgi python_基于nginx的FastCGI的缓存配置

基于nginx的FastCGI的缓存配置

上篇文章 基于nginx的代理缓存配置(适用于脚本执行) 是一种基于代理的实现的缓存机制, 实际上是一种多层访问转换的 cache 实现. 也就是实际执行脚本层是不做缓存的, 而缓存依赖代理访问的代理层, 这样对于单台服务的应用来说, 无疑是一种资源浪费, 那么有没有更好的方法来实现缓存的方法呢? 其实强大的Nginx已经为大家想好了这点, 直接基于FastCGI的cache实现.

清理缓存的, 需要添加 nginx_purge_cache 插件, 插件在这里找.

废话不多说了, 直接上配置, 其实 fastcgi_cache 和 proxy_cache 的配置基本一样:

# !缓存文件存放目录

# levels 缓存层次

# keys_zone 缓存空间名和共享内存大小(热点内容放在内存)

# 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 {

listen 80;

server_name demo.xwsoul.com;

root /home/xwsoul/code/web/demo;

index index.html index.php;

# 清理 fastcgi_cache

location ~ /pcgi(/*) {

allow 127.0.0.1;

allow 192.168.2.0/24;

deny all;

fastcgi_cache_purge cgi_one "$scheme$request_method$host$1";

}

try_files $uri @missing;

location @missing {

rewrite ^/cgi_cache/(.*) /cgi_cache/index.php?code=$1 last;

}

location ~ .*\.php$ {

# 默认情况下关闭cache

set $xwsoul_nocache yes;

# 请求的 URL 在 /cgi_cache/ 的允许缓存

if ($request_uri ~ ^/cgi_cache/) {

set $xwsoul_nocache "";

}

# CGI指向地址

fastcgi_pass 127.0.0.1:9000;

# 调用 cache 的命名空间

fastcgi_cache cgi_one;

# 缓存触发的方法 HEADER, GET, POST 中的一个或多个

fastcgi_cache_methods GET;

# 生成的缓存名称的 key 的名字

# $scheme https/http

# $request_method 请求方法,基于上面的设置,这里为GET

# $host 主机

# $request_uri 请求地址

fastcgi_cache_key "$scheme$request_method$host$request_uri";

# 生效值: 即代理目标的状态码以及缓存时间

fastcgi_cache_valid 200 302 1h;

# 确定缓存成为过期数据的情况

fastcgi_cache_use_stale error timeout invalid_header http_500;

# 请求过多少次相同的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测试脚本

$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 $code, '

‘;

}

echo ‘

‘;

echo date(‘Ymd H:i:s’), ‘

‘;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值