为网站开启Nginx fastcgi_cache缓存加速,支持html伪静态页面

  • A+
所属分类:WordPress

转贴、标志

Nginx内置FastCgi缓存,但是不支持自动清除缓存。当你在Wordpress里面新建/修改一篇文章,或者访客提交评论的时候,自动清空相关的缓存是必要的!Nginx需要安装ngx_cache_purg+量身定做的WordPress缓存清理插件:Nginx Helper

一、安装Nginx ngx_cache_purge模块

1)查看ngx_cache_purge是否安装

  1. nginx -V 2>&1 | grep -o ngx_cache_purge

显示ngx_cache_purge表示已经安装

2)安装ngx_cache_purge模块

军哥的《lnmp一键安装包》下安装ngx_cache_purge模块

所用模块为 ngx_cache_purge,官方地址:http://labs.frickle.com/files/,我们可以挑选一个新版本下载到服务器上,比如 http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz

  1. cd /usr/local/src
  2. #下载
  3. wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
  4. #解压
  5. tar zxvf ngx_cache_purge-2.3.tar.gz

访问 http://nginx.org/en/download.html 可查找Nginx的最新版本号和以往旧版本号,选择你想要的Nginx版本(此操作可让你升级当前Nginx或不升级),我们这里选Nginx 1.8.1版,http://nginx.org/download/nginx-1.8.1.tar.gz

  1. cd /usr/local/src
  2. #下载
  3. wget http://nginx.org/download/nginx-1.8.1.tar.gz
  4. #解压
  5. tar zxvf nginx-1.8.1.tar.gz
  1. cd nginx-1.8.1
  2. #查看当前系统中原来nginx编译参数
  3. nginx -V
  4. #下面是军哥LNMP的编译参数,一般显示为:
  5. [~]# nginx -V
  6. nginx version: nginx/1.8.1  
  7. built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)   
  8. built with OpenSSL 1.0.1e-fips 11 Feb 2013  
  9. TLS SNI support enabled  
  10. configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_spdy_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module
  11. #可看到上面参数中,没有ngx_cache_purge模块
  12. #还是在当前目录中,nginx-1.8.1目录,输入下面命令
  13. ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_spdy_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --add-module=../ngx_cache_purge-2.3
  14. #没有报错就编译
  15. make
  16. #备份系统中原nginx,原文件加上日期,此过程中Nginx不会停止服务的
  17. mv /usr/local/nginx/sbin/nginx{,_date +%F}
  18. #复制新编译的Nginx去运行目录
  19. cp objs/nginx /usr/local/nginx/sbin
  20. #测试新Nginx是否正确
  21. /usr/local/nginx/sbin/nginx -t
  22. #显示以下就为正确
  23. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok  
  24. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful 
  25. #执行make upgrade开始升级
  26. make upgrade
  27. # 显示ngx_cache_purge表示已经安装成功
  28. nginx -V 2>&1 | grep -o ngx_cache_purge
  29. #最后确认一下nginx进程,可以发现有2个主进程,并且有正在关闭的进程(shutting down):
  30. ps aux | grep nginx
  31. root 969 0.0 0.3 8260 1844 ? Ss Dec09 0:01 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf  
  32. www 4196 0.1 2.5 19112 12872 ? S 14:52 0:00 nginx: worker process is shutting down  
  33. www 4260 0.1 2.5 19112 12872 ? S 14:52 0:00 nginx: worker process is shutting down  
  34. www 4257 0.1 2.5 19112 12872 ? S 14:52 0:00 nginx: worker process is shutting down  
  35. root 4663 0.0 0.3 5488 1900 ? S 14:58 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf  
  36. #过一段时间后,再次确认nginx进程,可以发现老进程已自动退出了(存在一段时间是因为旧进程还有未结束的服务)
  37. ps aux | grep nginx
  38. #可重启LNMP服务,或者重启服务器
  39. reboot

二、Nginx配置

要用这个缓存功能,建议重新弄一个 server 模块(替换之前的),如下代码是张戈博客目前正在使用的规则(已删除了我自定义的伪静态规则,避免混淆视听):

  1. ####################################################################################################
  2. #     Nginx开启fastcgi_cache-purge缓存加速,支持html伪静态页面 By 张戈博客
  3. #     文章地址:https://zhangge.net/5042.html ‎
  4. #     参 考 ①:http://jybb.me/nginx-wordpress-fastcgi_cache-purge
  5. #     参 考 ②:https://rtcamp.com/wordpress-nginx/tutorials/single-site/fastcgi-cache-with-purging/
  6. #     转载本文请务必保留以上申明,谢谢合作!
  7. ####################################################################################################
  8. #下面各个参数的含义请自行百度,我就不赘述了
  9. #下面2行的中的wpcache路径请自行提前创建,否则可能会路径不存在而无法启动nginx,max_size请根据分区大小自行设置
  10. fastcgi_cache_path /tmp/wpcache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=1G;
  11. fastcgi_temp_path /tmp/wpcache/temp;
  12. fastcgi_cache_key "$scheme$request_method$host$request_uri";
  13. fastcgi_cache_use_stale error timeout invalid_header http_500;
  14. #忽略一切nocache申明,避免不缓存伪静态等
  15. fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
  16. server
  17.     {
  18.         listen 80;
  19.         #请修改为自己的域名
  20.         server_name thexq.com;
  21.         index index.html index.htm index.php default.html default.htm default.php;
  22.         #请修改为自己网站的存放路径
  23.         root  /home/wwwroot/zhangge.net;
  24.         set $skip_cache 0;
  25.         #post访问不缓存
  26.         if ($request_method = POST) {
  27.             set $skip_cache 1;
  28.         }
  29.         #动态查询不缓存
  30.         if ($query_string != "") {
  31.             set $skip_cache 1;
  32.         }
  33.         #后台等特定页面不缓存(其他需求请自行添加即可)
  34.         if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
  35.             set $skip_cache 1;
  36.         }
  37.         #对登录用户、评论过的用户不展示缓存(这个规则张戈博客并没有使用,所有人看到的都是缓存)
  38.         if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
  39.             set $skip_cache 1;
  40.         }
  41.         #这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了!
  42.         location ~ [^/]\.php(/|$)
  43.             {
  44.                 try_files $uri =404;
  45.                 fastcgi_pass  unix:/tmp/php-cgi.sock;
  46.                 fastcgi_index index.php;
  47.                 include fastcgi.conf;
  48.                 #新增的缓存规则
  49.                 fastcgi_cache_bypass $skip_cache;
  50.                 fastcgi_no_cache $skip_cache;
  51.                 add_header X-Cache "$upstream_cache_status From $host";
  52.                 fastcgi_cache WORDPRESS;
  53.                 fastcgi_cache_valid 200 301 302 1d;
  54.         }
  55.         location / {
  56.                 #此处可以添加自定义的伪静态规则(之前你新增的伪静态规则可以添加到这,没有就不用了)
  57.                 try_files $uri $uri/ /index.php?$args;
  58.                 rewrite /wp-admin$ $scheme://$host$uri/ permanent;
  59.          }
  60.         #缓存清理配置(可选模块,请细看下文说明)
  61.         location ~ /purge(/.*) {
  62.             allow 127.0.0.1;
  63.             allow "此处填写你服务器的真实外网IP";
  64.             deny all;
  65.             fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
  66.         }
  67.         location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
  68.                 access_log off; log_not_found off; expires max;
  69.         }
  70.         location = /robots.txt { access_log off; log_not_found off; }
  71.         location ~ /\. { deny  all; access_log off; log_not_found off; }
  72.         #请注意修改日志路径,access指打开日志,off则不记录日志
  73.         access_log /home/wwwlogs/zhangge.net.log access;
  74. }

请仔细阅读代码中的所有注释,该修改的修改,该创建的创建,该补充的根据实际情况补充,覆盖原conf文件后,一定要测试conf文件是否正确

  1. #测试nginx.conf正确性:
  2. /usr/local/nginx/sbin/nginx –t
  3. #重启nginx
  4. /usr/local/nginx/sbin/nginx -s reload

三、安装插件

上文已经提到了 fastcgi_cache 有一个量身定做的WordPress缓存清理插件:Nginx Helper

所以,接下来我们就去安装这个插件 。非常简单,直接进入WordPress后台插件安装界面搜索 Nginx Helper 关键词在线安装即可。

安装后,从后台【工具】==>【Nginx Helper】打开插件设置界面如下所示:

为网站开启Nginx fastcgi_cache缓存加速,支持html伪静态页面

Ps:顺带说一下后面2项的含义:

记录插件日志:勾选这个选项后,插件设置下面会显示日志记录存放路径。这个功能主要用来测试插件的设置,比如去已缓存的文字发表一个新的评论,然后看下日志里面是否出现删除记录。

插入缓存信息:勾选这个选项后,前台页面的源代码底部将插入页面的缓存信息,类似如下:

  1. <!--Cached using Nginx-Helper on 2015-05-30 12:34:22. It took 162 queries executed in 1.922 seconds.-->
  2. <!--Visit http://wordpress.org/extend/plugins/nginx-helper/faq/ for more details-->

勾上第启用缓存清理后,将出现如下选项:为网站开启Nginx fastcgi_cache缓存加速,支持html伪静态页面

该怎么设置,应该看图就懂了吧?否则张戈苦逼的用中文标注了半天就白费功夫了!

清理模式选择

上图我也标注的比较清楚了,还是详细解释一下吧!

①、purge模式

这个模式需要保留上文 Nginx 配置中的 purge 清理路径,清理的时候会产生一个请求。

出于安全考虑,一般 purge 都不会完全开放!只有特定的 IP 可以访问,所以,如果用了CDN的朋友,再使用模式一,则需要在服务器上的 /etc/hosts 中将网站域名解析为服务器真实IP,以便插件直接请求purge路径,而不用走CDN节点,避免请求被拒绝。还是没搞懂的话就放弃这个模式吧!

②、文件模式

模式二是直接清理对应的缓存文件,不需要请求 purge这个清理路径,所以使用模式二,不需要配置上文 Nginx 的 purge 规则(我个人推荐使用这个模式)。

由于插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除!

解决办法:

很简单,在WordPress根目录下的wp-config.php中新增如下代码即可:

  1. //根据实际情况定义缓存的存放路径
  2. define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/wpcache');

Ps:不知道添加到第几行的话,可以添加到 define('WPLANG', 'zh_CN'); 的后面即可。添加后建议重载一下php,确保变量生效(主要针对开启了PHP缓存的网站)。

四、效果预览

①、缓存效果

替换新的配置,并且重载Nginx之后,访问前台页面,查看header,会多出一个X-Cache 标志。

X-Cache 一般会有3个状态:MISS、HIT、BYPASS。

  • MISS表示未命中

即这个页面还没被缓存,新发布或刚被删除的页面,首次访问将出现这个状态(图略)。

  • HIT表示缓存命中

打开一个会缓存的页面,比如文章内容html页面,F5刷新几次即可在F12开发者模式当中的Header头部信息中看到如图缓存命中状态:

为网站开启Nginx fastcgi_cache缓存加速,支持html伪静态页面

  • BYPASS表示缓存黑名单

即页面路径在Nginx规则中被设置成不缓存(set $skip_cache 1;),比如WP后台,查看header:

为网站开启Nginx fastcgi_cache缓存加速,支持html伪静态页面

如果你发现想要缓存的页面却是这个状态,就可以去检查排除规则中是不是包含了这个路径!反之,如果你发现后台登录不了,或者各种登陆态丢失问题,则应该到排除规则中加上该页面路径的关键字。

②、清理效果

这个插件和缓存的搭配非常好用,不管我们是发布文章,还是有人发表评论,插件都能根据我们的设置来清理对应的缓存!比如有人发表了一个自动审核通过的评论(或博主审核通过一条评论),插件将会自动删除评论相关的文章缓存,具体看下上图张戈贴出的标注即可。

如何查看插件是否正常工作呢?很简单,勾选开启插件日志,然后去点击更新一篇旧文章,最后打开插件日志即可看到是否删除记录。

用Linux的朋友,可以直接使用tailf命令查看该日志,然后去更新文章即可看到效果,如下图所示:

为网站开启Nginx fastcgi_cache缓存加速,支持html伪静态页面

至于要证实是否真的删除了缓存,我们可以先打开浏览器的开发者模式,定位到network界面,然后访问刚刚更新的文章,即可看到如下状态:

为网站开启Nginx fastcgi_cache缓存加速,支持html伪静态页面

很明显,缓存已被成功删除,首页看都不用看,肯定也是这个状态了。

 

转自:https://zhangge.net/5042.html

https://blog.linuxeye.com/439.html

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: