Nginx的fastcgi_cache缓存的方法,由于不依赖于php服务端,完全又nginx服务器相应HTML页面请求,性能应该更佳。而且这个做法实际上也是百度云加速、CloudFlare等CDN服务的实现方法,因此又开始折腾这种缓存方法,真正实现网站全静态化。
前期准备
nginx缓存依赖于ngx_cache_purge模块,确保这个模块已经安装,本站使用“宝塔”面板默认已经安装
修改配置文件,请仔细阅读代码中的所有注释,根据实际情况修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#################################################################################################### # Nginx开启fastcgi_cache-purge缓存加速,支持html伪静态页面 By 张戈博客 # 文章地址:http://zhangge.net/5042.html # 参 考 ①:http://jybb.me/nginx-wordpress-fastcgi_cache-purge # 参 考 ②:https://rtcamp.com/wordpress-nginx/tutorials/single-site/fastcgi-cache-with-purging/ # 转载本文请务必保留以上申明,谢谢合作! #################################################################################################### #下面各个参数的含义请自行百度,我就不赘述了 #下面2行的中的wpcache路径请自行提前创建,否则可能会路径不存在而无法启动nginx,max_size请根据分区大小自行设置 fastcgi_cache_path /tmp/wpcache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=1G; fastcgi_temp_path /tmp/wpcache/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 { listen 80; #请修改为自己的域名 server_name zhangge.net; index index.html index.htm index.php default.html default.htm default.php; #请修改为自己网站的存放路径 root /home/wwwroot/zhangge.net; #REWRITE-END #fastcgi_cache缓存start set $skip_cache 0; #post访问不缓存 if ($request_method = POST) { set $skip_cache 1; } #动态查询不缓存 if ($query_string != "") { set $skip_cache 1; } #后台等特定页面不缓存(其他需求请自行添加即可) if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") { set $skip_cache 1; } #对登录用户、评论过的用户不展示缓存 if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") { set $skip_cache 1; } #这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了! location ~ [^/]\.php(/|$) { try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi-72.sock; #sock的路径 fastcgi_index index.php; include fastcgi.conf; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; #新增的缓存规则 fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; add_header X-Cache "$upstream_cache_status From $host"; fastcgi_cache WORDPRESS; 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_valid 200 301 302 1d; } #缓存清理配置(可选) location ~ /purge(/.*) { allow 127.0.0.1; allow 你网站的真实IP; deny all; fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1"; } #fastcgi_cache缓存end |
前两行定义了缓存存储的路径,位于 /tmp/wpcache和 /tmp/wpcache/temp,如果这个路径不存在的话,手动创建这两个目录,并且确保www用户有可写权限。
安装插件
按照前面的设置,nginx缓存应该可以运行了。但是有些时候我们希望某些页面能在发生更新的时候自动清除缓存(比如文章内容更新,访客评论,阅读数刷新),不然网站一直显示的是缓存的内容,那就适得其反了。
针对fastcgi_cache的方式有一个专门的WordPress插件来完成自动清理缓存工作,叫做Nginx Helper
在WordPress后台安装这个插件,激活并按照下面所示配置其他选项
缓存清理的行为是直接删除本机上存储的缓存文件,这个路径名由变量RT_WP_NGINX_HELPER_CACHE_PATH定义,因此还需要在WordPress根目录下的wp-config.php中新增一行。
1 2 |
//根据实际情况定义缓存的存放路径 define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/wpcache'); |
效果预览
①、缓存效果
替换新的配置,并且重载 Nginx 之后,访问前台页面,查看 header,会多出一个 X-Cache 标志。
X-Cache 一般会有 3 个状态:MISS、HIT、BYPASS。
- MISS 表示未命中
即这个页面还没被缓存,新发布或刚被删除的页面,首次访问将出现这个状态(图略)。
- HIT 表示缓存命中
打开一个会缓存的页面,比如文章内容 html 页面,F5 刷新几次即可在 F12 开发者模式当中的 Header 头部信息中看到如图缓存命中状态:
- BYPASS 表示缓存黑名单
即页面路径在 Nginx 规则中被设置成不缓存(set $skip_cache 1;),比如 WP 后台,查看 header:
如果你发现想要缓存的页面却是这个状态,就可以去检查排除规则中是不是包含了这个路径!反之,如果你发现后台登录不了,或者各种登陆态丢失问题,则应该到排除规则中加上该页面路径的关键字。
②、清理效果
这个插件和缓存的搭配非常好用,不管我们是发布文章,还是有人发表评论,插件都能根据我们的设置来清理对应的缓存!比如有人发表了一个自动审核通过的评论(或博主审核通过一条评论),插件将会自动删除评论相关的文章缓存,具体看下上图张戈贴出的标注即可。
如何查看插件是否正常工作呢?很简单,勾选开启插件日志,然后去点击更新一篇旧文章,最后打开插件日志即可看到是否删除记录。
用 Linux 的朋友,可以直接使用 tailf 命令查看该日志,然后去更新文章即可看到效果,如下图所示:
至于要证实是否真的删除了缓存,我们可以先打开浏览器的开发者模式,定位到 network 界面,然后访问刚刚更新的文章,即可看到如下状态:
很明显,缓存已被成功删除,首页看都不用看,肯定也是这个状态了。
本文转载:
https://www.feiqy.com/fastcgi_cache/
https://zhangge.net/5042.html
文章评论
日常来访,记得微笑