本插件需要 WEB 服务器为 Nginx 并且需要 ngx_cache_purge 模块支持
插件特性
直接在nginx层缓存,媲美静态页面速度
支持所有页面缓存
支持内容修改之后自动更新内容、分类、首页缓存
支持评论生效更新缓存
支持登录状态下不缓存
支持搜索等动态页面不缓存
更新日志
v1.0
初始版本
v1.1
修复评论分页刷新
增加Tag页面刷新
增加自定义刷新后缀
已知问题
非js方式的访问统计插件会失效
使用方法
需要修改nginx配置文件,添加
#下面2行的中的wpcache路径请自行提前创建,否则可能会路径不存在而无法启动nginx,max_size请根据分区大小自行设置
fastcgi_cache_path /www/server/nginx/fastcgi_cache_dir levels=1:2 keys_zone=fcache:250m inactive=1d max_size=1G;
fastcgi_temp_path /www/server/nginx/fastcgi_cache_dir/temp;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
#忽略一切nocache申明,避免不缓存伪静态等
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
#Ps:如果是多个站点,以上内容不要重复添加,否则会冲突,可以考虑将以上内容添加到nginx.conf里面,避免加了多次。
server
{
***略***
set $skip_cache 0;
#post访问不缓存
if ($request_method = POST) {
set $skip_cache 1;
}
#动态查询不缓存
if ($query_string != "") {
set $skip_cache 1;
}
#pjax查询缓存
if ($query_string ~ "_pjax=(.*)") {
set $skip_cache 0;
}
#后台等特定页面不缓存(其他需求请自行添加即可)
if ($request_uri ~* "/admin/|/action/|/search/|/feed/|baidu_sitemap.xml|sitemap.xml") {
set $skip_cache 1;
}
#对登录的用户不展示缓存
if ($http_cookie ~* "typecho_authCode") {
set $skip_cache 1;
}
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-74.sock;
fastcgi_index index.php;
include fastcgi.conf;
include pathinfo.conf;
#新增的缓存规则
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cuojue-Cache "$upstream_cache_status From $host";
fastcgi_cache fcache;
fastcgi_cache_valid 200 1d;
}
location ~* /{后台设置的token}/_clean_cache(/.*) {
fastcgi_cache_purge fcache "$scheme$request_method$host$1$is_args$args";
}
***略***
}
以上的
location ~* /{后台设置的token}/_clean_cache(/.*) {
fastcgi_cache_purge fcache "$scheme$request_method$host$1$is_args$args";
}
需要和后台设置的token一致,例如后台设置1150AE6A4F7938AE754D
则这里设置为
location ~* /1150AE6A4F7938AE754D/_clean_cache(/.*) {
fastcgi_cache_purge fcache "$scheme$request_method$host$1$is_args$args";
}
缓存效果
替换新的配置,并且重载Nginx之后,访问前台页面,查看header,会多出一个 X-Cuojue-Cache 标志。
X-Cuojue-Cache 一般会有3个状态:MISS、HIT、BYPASS。
-
MISS表示未命中
即这个页面还没被缓存,新发布或刚被删除的页面,首次访问将出现这个状态(图略)。 -
HIT表示缓存命中
打开一个会缓存的页面,比如文章内容html页面,F5刷新几次即可在F12开发者模式当中的Header头部信息中看到如图缓存命中状态:
-
BYPASS表示缓存黑名单
即页面路径在Nginx规则中被设置成不缓存(set $skip_cache 1;),比如typecho后台和搜索:
如果你发现想要缓存的页面却是这个状态,就可以去检查排除规则中是不是包含了这个路径!反之,如果你发现后台登录不了,或者各种登陆态丢失问题,则应该到排除规则中加上该页面路径的关键字。
缓存刷新
自动刷新
后台配置完成后,涉及文章,评论等更新,会自动刷新对应缓存。默认缓存24小时后过期。
自动刷新缓存是访问对应的刷新地址实现的,所以以上的nginx配置和后台token一定要一致,如不一致,缓存是不会刷新的。
手动刷新
手动刷新,可以拼合地址规则。
定义token为:ABCD1234
定义页面为:https://cuojue.org/read/typecho-fastcgi_cache.html
则刷新地址是:https://cuojue.org/ABCD1234/_clean_cache/read/typecho-fastcgi_cache.html
访问这个地址就会刷新,插件内也是模拟访问这个地址,实现的刷新。
这个地址,在有缓存的时候,访问会返回200
刷新成功,在不存在缓存的时候,会返回正常的404
未找到页面错误。
所以如果没有配置正确,缓存是不会刷新的。
缓存key就是url,如果url变化了,旧的缓存也不会刷新。
进阶操作
评论者信息被缓存修复
typecho主题一般使用php的函数获取cookies来填充评论者信息,导致了如果用户评论了文章,就会缓存评论者的信息,如何修复参考下面的文章
Set-Cookie头处理
使用了fastcgi_cache来缓存所有页面,导致了一个问题,那就是set-cookie也被缓存了,其他用户再次访问会导致被设置缓存的cookie,解决方法见下文。
下载地址
链接:Ncache.zip 密码:ncache
参考:
Nginx开启fastcgi_cache缓存加速,支持html伪静态页面 | 张戈博客
为typecho增加缓存功能,支持memcached缓存
下载时提示 相逢何必曾相识!有缘再见
博主你好,安装之后貌似没有缓存,
没有出现你说的x-cuojue-cache,建立的缓存文件夹也没有内容
请详细阅读安装说明
经过实测 ,伪静态网址不带任何后缀(比如HTML),无法/ABCD1234/_clean_cache/命令手动删除缓存。提示404,但是缓存是存在的。
你好,带与不带后缀。是没有区别的,缓存key是
$scheme$request_method$host$request_uri
在我站测试是没有任何区别的,具体可见tag页面,是无后缀的。
可以选择右边的“私密评论”,把你站地址,和token发给我,我帮你试一下。
博主你好,请问nginx的conf里,fastcgi缓存地址需要和你的保持一致吗?如果使用自定义地址,插件需要作出修改吗
目前的版本 v1.1
fastcgi_cache_key和fastcgi_cache_purge需要一致。
token和后台填写需要一致。
path可以随意。
好的谢谢博主!
您好!本站使用的伪静态形式是www.xxx.com/t/36502 ,没有html后缀可以使用这个插件吗
自然是可以的
本博客内容较多, max_size=1G; 可以改大一些吗》?
https://www.baidu.com/s?wd=fastcgi_cache_path
缓存层在nginx,本插件的作用是自动更新缓存,缓存配置请参考nginx
修改了nginx配置 重启 nginx出现 .. nginx: [emerg] "fastcgi_cache_path" directive is not allowed here in /usr/local/nginx/conf/nginx.conf:98 这样的提示。
自己配置写错了,已经解决了。
这样的提示就是fastcgi_cache_path放错位置了,不能放在server层内
缓存层在nginx,本插件的作用是自动更新缓存,缓存配置请参考nginx
没有任何基础不建议使用本插件
现在最后问题就是删除文章后,缓存还在依然可以访问。
目前确实如此,没有Hook Post delete接口,缓存在24小时过期后才会自动删除。
等有空了尝试加上此功能。
临时解决可以参考上面的手动拼合规则手动删除一下缓存。
重启 nginx 出现这样的提示 Stoping nginx... nginx: [emerg] "try_files" directive is duplicate in /usr/local/nginx/conf/pathinfo.conf:4
你发的nginx配置文件中的 try_files $uri =404; 和我服务器配置文件pathinfo.conf文件中的try_files $fastcgi_script_name =404; 起冲突。
此问题与本文无关
请问token是随机生成还是按照你这个呢?我在后台设置了与你同样的token然后网站就无法打开了
token随机写一个,后台要和nginx里面配置一致,例子里面的{}不要带上了
有个疑问 就是更新文章的时候 居然缓存了很久很久?这是我没更新地址的原因吗
如果nginx没有配置正确,就是token那里,默认缓存是24小时的
我测试过后都中缓存 就是发布出现了问题在一个的话我不是很清楚这个缓存是怎么刷新的 能手动刷新嘛
手动刷新,可以拼合地址规则。
定义token为:ABCD1234
定义页面为:https://cuojue.org/read/typecho-fastcgi_cache.html
则刷新地址是:https://cuojue.org/ABCD1234/_clean_cache/read/typecho-fastcgi_cache.html
访问这个地址就会刷新,插件内也是模拟访问这个地址,实现的刷新
所以如果没有配置正确,缓存是不会刷新的。
缓存key就是url,如果url变化了,旧的缓存也不会刷新。
请问网站左下方的 69ms 怎么加载
邮箱是否正确,正确的话我晚上把具体代码发给你
你发一篇文章吧,这样大家都能学
https://cuojue.org/read/typecho-add-total.html
分享一下
内容、分类、首页缓存更新存在bug
请详细描述一下问题
本站目前正在使用本插件,所涉及的前/后台,文章发表、更新、评论均可正常刷新。看了下你站貌似使用了百度云减速,可在/etc/hosts中指定你站域名和实际IP,因为刷新策略是使PHP访问对应的刷新地址,所以nginx刷新缓存的token要绝对配置正确
我试试,hosts 感谢
确认了hit之后,可以先手动访问一下刷新缓存的链接,试下能不能正常访问