GHL's Notes/

Typecho自动清除Nginx缓存插件,NginxHelper

前言

用Typecho的时候,发现Typecho没有一个类似于Wordpress的NginxHelper能自动清除缓存的插件,于是我就做了一个出来。

经过了接近几个小时学习插件+调试,这个插件终于诞生了,我给他取名叫NginxHelper,旨在为Wordpress的NginxHelper插件致敬。

插件功能

  1. 当有人评论,文章推送,新建页面的时候,自动清理nginx缓存
  2. 当文章,页面被修改时自动清理相对应缓存
  3. 支持自动预缓存功能,可一键自动缓存所有页面

使用方法

第一步,配置nginx缓存规则,具体可参考挖站否-开启Nginx fastcgi_cache缓存加速方法-Nginx配置实例,适当更改http_cookie和request_uri

第二步,先下载源码(地址),把nginxhelper文件夹扔到typecho插件目录(usr/plugins)

第三步,更改Plugin.php文件中$NGINX_CACHE_PATH改为你的Nginx缓存路径
路径最后面无需带/ !!!图片如下:
Nginx

最后一步,启用NginxHelper插件,完工了

附赠Nginx缓存规则(非Stable版本)

这堆放在server{上
请注意cache_path也就是缓存目录,要提前创建,而且要正确填在$NGINX_CACHE_PATH里

fastcgi_cache_path /tmp/nginx levels=1:2 keys_zone=TYPECHO:250m inactive=1d max_size=500m;
fastcgi_temp_path /tmp/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;

这堆放在server{里面

  set $cache 0;
    #post访问不缓存
   if ($request_method = POST) {
            set $cache 1;
        }
   #动态查询不缓存
   if ($query_string != "") {
            set $cache 1;
        }
    if ($request_uri ~* "/purgeall/|/action/|/admin/|/admin/*.php|/feed/|/sitemap/|index.php|sitemap(_index)?.xml") {
            set $cache 1;
        }
   if ($http_cookie ~* "PHPSESSID|typecho_authCode|typecho_uid|typecho_remember_mail|typecho_remember_author|typecho_remember_url") {
            set $cache 1;
        }

  location ~ .*\.php(\/.*)*$ {
    #fastcgi_pass remote_php_ip:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
   set $path_info "";
    set $real_script_name $fastcgi_script_name;
    if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
      set $real_script_name $1;
      set $path_info $2;
    }
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
   fastcgi_param SCRIPT_NAME $real_script_name;
    #fastcgi_param PATH_INFO $path_info;
  add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    #新增的缓存规则
    fastcgi_cache_bypass $cache;
    fastcgi_no_cache $cache;
    add_header X-Cache "$upstream_cache_status From $host";
    add_header Cache-Control  max-age=0;
    add_header Nginx-Cache "$upstream_cache_status";
    add_header Last-Modified $date_gmt;
    add_header X-Frame-Options SAMEORIGIN; # 只允许本站用 frame 来嵌套
    add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型
    add_header X-XSS-Protection "1; mode=block"; # XSS 保护
    etag  on;
    fastcgi_cache TYPECHO;
    fastcgi_cache_valid 200 301 302 1d;


  }

完工了。

留下一条评论

共有 10 条评论

  1. 南蜇:

    留个标记,以后说不定会用到

    July 24th, 2019 at 12:07 am 回复
  2. 云武:

    WP需要安装ngx_cache_purge模块,为啥TP不用就成功了呢?

    August 14th, 2019 at 09:29 am 回复
  3. 云武:

    这个缓存有点问题,登陆缓存了+评论者被缓存,查看了Typecho_Cookie写法不对

    September 12th, 2019 at 11:36 am 回复
  4. zyb:

    一直显示miss,不知道为啥。

    November 15th, 2019 at 01:49 pm 回复
  5. zyb:

    一开始能够正常hit,后来不知道为什么就不行了,但是把网站及其配置文件转移到另一台vm(内存1g)上可以hit。出问题的那台内存512,可能与内存有关吗?

    November 15th, 2019 at 04:59 pm 回复
  6. zyb:

    找到原因了。。关掉etag on就好了。。。

    November 16th, 2019 at 12:36 pm 回复
  7. zyb:

    刚才是巧合。。。好像是tpcache的残余

    November 16th, 2019 at 12:50 pm 回复
  8. zyb:

    奇葩的是我得开启tpcache然后禁用tpcache,才可以正常hit。我尝试着注释掉include fastcgi.conf,也能正常hit,就是画面不显示而已。。。。

    November 16th, 2019 at 01:41 pm 回复
  9. 老杨:

    话说这个清理缓存插件可以直接集成到主题?

    October 10th, 2020 at 03:06 pm 回复
    1. GHL:

      不能。插件是插件,主题是主题。

      November 5th, 2020 at 05:59 pm 回复