WordPress开启Nginx fastcgi_cache缓存加速方法-实例记录

2019年1月11日18:05:46 12

使用Wordpress建站的过程中,可谓是绞尽脑汁,如何在现有的服务器资源配置下发挥最大的性能,对于wordpress性能优化、加快博客访问速度使用了各种办法,价钱升级服务器配置是不可能的,所以只能从服务器优化方面下手。

从起初的WP Super Cache、WP Rocaker、WP Fastest Cache、cos-html-cache……等各种插件优化方式,但是这种插件缓存优化的方式有一个很大的缺点,那就是对于服务器资源性能有很高要求,不然不一定能起到加速作用,反而会造成服务器后端处理时间过长,同时代码的压缩与修改会带来各种兼容问题,最终导致用户体验变差。这类插件的功能不得不说非常强大,但是想要发挥他们的最佳性能,大部分个人站长是消耗不起的。

能用代码解决的问题就不要用插件,本博在2017年启用的Redis缓存的方式提高效率,具体教程不做太多赘述,感兴趣的朋友可以看一下

1#Redis为wordpress提供闪存级加速体验 绝佳的缓存加速方案

2#启用 WP Fastest Cache 缓存加速优化插件

今年在Qi的推荐下启用了Nginx fastcgi_cache缓存,直接通过Nginx对文章页面进行缓存,直接减少了PHP求情,这种缓存方式效率比缓存插件高了很多。

网上找了一些资料,一看歪果仁在2012年之前就采用了Nginx fastcgi_cache缓存加速存方式

,今天就对自己的服务器来一个手术。

一、安装Nginx ngx_cache_purge模块

Ngx_cache_purge模块官网:http://labs.frickle.com/files/

1.1 LNMP(悲惨的第一次) 

自然一开始用的是军哥LNMP.org一键安装包,安装模块很简单,编辑lnmp安装包目录下的 lnmp.conf 文件,在Nginx_Modules_Options=” 的单引号中加上 –add-odule=/root/ngx_cache_purge-2.3 保存,升级一下nginx就安装上了,其他模块也参考这个就行。

ngx_cache_purge-2.3需要你从frickle.com官网中下载安装包并解压,目前最新版是2.3。

 

1.2 Oneinstack(风雨后的成功) 

如果你和自然一样现在使用的是Oneinstack面板的话,可以通过下面的代码来安装ngx_cache_purge模块(基本照样抄)。

  1. # nginx -V 2>&1 | grep -o ngx_cache_purge 查看ngx_cache_purge是否安装,没有数据提示则表示未安装
  2. cd /root/oneinstack/src
  3. wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
  4. tar xzf ngx_cache_purge-2.3.tar.gz
  5. #以下几个安装包都是Oneinstack自带的,不同的版本可能会不同,请根据情况调整
  6. tar xzf nginx-1.14.2.tar.gz
  7. tar xzf pcre-8.42.tar.gz
  8. tar xzf openssl-1.1.1a.tar.gz
  9. cd /root/oneinstack/src/nginx-1.14.2
  10. nginx -V #查看nginx编译参数,最后加上--add-module=../ngx_cache_purge-2.3
  11. ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.0.2o --with-pcre=../pcre-8.42 --with-pcre-jit --with-ld-opt=-ljemalloc --add-module=../ngx_cache_purge-2.3
  12. make  #编译
  13. mv /usr/local/nginx/sbin/nginx{,_`date +%F`}  #备份nginx
  14. cp objs/nginx /usr/local/nginx/sbin
  15. nginx -V 2>&1 | grep -o ngx_cache_purge
  16. # 显示ngx_cache_purge表示已经安装成功

使用Nginx -V查看编译参数添加add-module时,一定要根据你自己的Nginx的编译参数来操作,也就是说保留原来的Nginx参数再加上add-module。例如我的:

  1. [root@izwz9czl41j742lns5zxsuz src]# nginx -V
  2. nginx version: nginx/1.14.2
  3. built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
  4. built with OpenSSL 1.1.1a  20 Nov 2018
  5. TLS SNI support enabled
  6. configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.1.1a --with-pcre=../pcre-8.42 --with-pcre-jit --with-ld-opt=-ljemalloc --add-module=../ngx_cache_purge-2.3 --with-ld-opt=-Wl,-rpath,/usr/local/lib --add-module=../lua-nginx-module --add-module=../ngx_devel_kit
  7. [root@izwz9czl41j742lns5zxsuz src]#

1.3 其他控制面板

如果你是其他控制面板,如宝塔BT、WDCP等的话,请查看官方提供的文档。

二、Nginx配置conf文件

2.1配置阿里云ECS实例 开启fastcgi_cache缓存

下面我直接贴出wzfou.com的Nginx开启fastcgi_cache缓存配置实例,详细的说明如下:

  1. #路径需要提前创建好
  2. fastcgi_cache_path /tmp/nginx-cache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=500m;
  3. fastcgi_temp_path /tmp/nginx-cache/temp;
  4. fastcgi_cache_key "$scheme$request_method$host$request_uri";
  5. fastcgi_cache_use_stale error timeout invalid_header http_500;
  6. #忽略一切nocache申明,避免不缓存伪静态等
  7. fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
  8. server {
  9.   listen 80;
  10.   listen 443 ssl http2;
  11.   ssl_certificate /usr/local/nginx/conf/ssl/www.wanvi.net.crt;
  12.   ssl_certificate_key /usr/local/nginx/conf/ssl/www.wanvi.net.key;
  13.   ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  14.   ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  15.   ssl_prefer_server_ciphers on;
  16.   ssl_session_timeout 10m;
  17.   ssl_session_cache builtin:1000 shared:SSL:10m;
  18.   ssl_buffer_size 1400;
  19.   add_header Strict-Transport-Security max-age=15768000;
  20.   ssl_stapling on;
  21.   ssl_stapling_verify on;
  22.   server_name www.wanvi.net wanvi.net;
  23.   access_log /data/wwwlogs/www.wanvi.net_nginx.log combined;
  24.   index index.html index.htm index.php;
  25.   root /data/wwwroot/www.wanvi.net;
  26.   if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
  27.   if ($host != www.wanvi.net) {  return 301 $scheme://www.wanvi.net$request_uri;  }
  28.   include /usr/local/nginx/conf/rewrite/wordpress.conf;
  29.   #error_page 404 /404.html;
  30.   #error_page 502 /502.html;
  31. #  …………………此部省略……………………
  32.    set $skip_cache 0;
  33.    #post访问不缓存
  34.    if ($request_method = POST) {
  35.             set $skip_cache 1;
  36.         }
  37.    #动态查询不缓存
  38.    if ($query_string != "") {
  39.             set $skip_cache 1;
  40.         }
  41.    #后台等特定页面不缓存(其他需求请自行添加即可)
  42.    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
  43.             set $skip_cache 1;
  44.         }
  45.    #对登录用户、评论过的用户不展示缓存
  46.    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
  47.             set $skip_cache 1;
  48.         }
  49.    #这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了!
  50.    location ~ [^/]\.php(/|$) {
  51.     #fastcgi_pass remote_php_ip:9000;
  52.     fastcgi_pass unix:/dev/shm/php-cgi.sock;
  53.     fastcgi_index index.php;
  54.     include fastcgi.conf;
  55.     add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
  56.     #新增的缓存规则
  57.     fastcgi_cache_bypass $skip_cache;
  58.     fastcgi_no_cache $skip_cache;
  59.     add_header X-Cache "$upstream_cache_status From $host";
  60.     add_header Cache-Control  max-age=0;
  61.     add_header Nginx-Cache "$upstream_cache_status";
  62.     add_header Last-Modified $date_gmt;
  63.     add_header X-Frame-Options SAMEORIGIN; # 只允许本站用 frame 来嵌套
  64.     add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型
  65.     add_header X-XSS-Protection "1; mode=block"; # XSS 保护
  66.     etag  on;
  67.     fastcgi_cache WORDPRESS;
  68.     fastcgi_cache_valid 200 301 302 1d;
  69.   }
  70.   #缓存清理配置(可选)
  71.   location ~ /purge(/.*) { #为防止转义,请去掉{ /之间的空格
  72.     allow 127.0.0.1;
  73.     #此处填写你的服务器IP
  74.     allow 你的服务器公网IP;
  75.     deny all;
  76.     #请注意此处的WORDPRESS要与上面的keys_zone保持一致
  77.     fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
  78.     }
  79. #  …………………此部分省略……………………
  80.   location ~ [^/]\.php(/|$) {
  81.     #fastcgi_pass remote_php_ip:9000;
  82.     fastcgi_pass unix:/dev/shm/php-cgi.sock;
  83.     fastcgi_index index.php;
  84.     include fastcgi.conf;
  85.   }
  86.   location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
  87.     expires 30d;
  88.     access_log off;
  89.   }
  90.   location ~ .*\.(js|css)?$ {
  91.     expires 7d;
  92.     access_log off;
  93.   }
  94.   location ~ /\.ht {
  95.     deny all;
  96.   }
  97. }

2.2有关说明

本地or内存?在fastcgi_cache_path和fastcgi_temp_path中,有人会建议将它设置为内存路径,例如:/dev/shm/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;,如果你的磁盘IO很慢的话建议采用此方式,毕竟内存的读写速度非常快。

部分机器需要设置开机自动在内存中建立nginx-cache缓存目录。

add_header Cache-Control 如果是动态内容要实时更新的话,可以设置为0,否则可以设置时间大一些。

思维导图来自Qi的网站:挖站否

三、安装Nginx Helper插件-自动刷新缓存

通过上面的方法我们已经配置好了fastcgi_cache缓存,接下来我们就要解决当Wordpress有新评论、新文章时自动刷新Nginx缓存页面了。直接搜索Nginx Helper插件下载,然后是设置,首先是开启,清除方式选择本地文件。

插件还提供了其它的一些设置,例如发表新文章、新评论时是否更新Nginx缓存。

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

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

四、安装Nginx Helper插件-自动刷新缓存

启用了Nginx fastcgi_cache后,我们就可以在浏览器Header 头部信息中看缓存是否命中。

对于已经命中了缓存的页面,Nginx fastcgi_cache会直接显示HIT For Domaiin。

对于已经设置了不缓存的页面,Nginx fastcgi_cache会直接显示BYPASS For Domaiin。

另外,对于已经登录的用户还有发表过评论的用户,Nginx fastcgi_cache也会直接BYPASS For Domaiin

同时,我们服务器的缓存路径中也能看到Nginx fastcgi_cache生成的缓存文件。

如果你发现你的评论过的用户依然用的是缓存,那应该是WP没有记住cookie,把以下代码加入到functions.php 中即可。

  1. add_action('set_comment_cookies','coffin_set_cookies',10,3);
  2. function coffin_set_cookies( $comment, $user, $cookies_consent){
  3.    $cookies_consent = true;
  4.    wp_set_comment_cookies($comment, $user, $cookies_consent);
  5. }

五、总结

Nginx开启fastcgi_cache缓存对于加快网页响应速度以及节省服务器资源有着非常重要的意义,可以看出来启用缓存后服务器的承载能力有了非常大的提升。

本博在启用fastcgi_cache缓存时,发现在Nginx配置文件中添加了Cache-Control信息,但是总是不生效。HTTP头部信息会总会包含以下信息:

Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache,

经过一些列资料检索排查,问题出在了LNMP和Oneinstack一键包中的session.cache_limiter的PHP.ini设置部分, 默认值是nocache,我们需要将它设置为none即可。

本博在一些列操作的过程中出现了一些列问题,起初在LNMP下出现首页正常其他页面都是404 NO FOUND,然后在Oneinstack下缓存不生效。

这些都是一些小问题,你在操作的过程中也可能会遇到这些问题。记住,对于代码一定要细心。

weinxin
我的微信
快来关注一下,就差你了

发表评论

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

目前评论:12   其中:访客  6   博主  6

    • avatar 简单生活 1

      实测,用这个缓存的都没有插件快…. 为何?

        • avatar 自然 Admin

          @简单生活 这个是直接加载静态HTML,绕过来后端PHP处理,应该更快,你可以看一下http头,是否缓存了?

            • avatar 简单生活 1

              @自然 那你试试我站速度怎么样! :mrgreen:

                • avatar zir 0

                  @简单生活 挺快的啊

                  • avatar 自然 Admin

                    @简单生活 速递挺快的啊

                    • avatar 简单生活 1

                      @简单生活 你评论恢复邮件通知怎么弄的,我的失效了!

                        • avatar 自然 Admin

                          @简单生活
                          //使用smtp发送邮件(请根据自己使用的邮箱设置SMTP)
                          add_action('phpmailer_init', 'mail_smtp');
                          function mail_smtp( $phpmailer ) {
                          $phpmailer->FromName = '自然博客'; //发件人名称
                          $phpmailer->Host = '邮件服务器地址'; //修改为你使用的邮箱SMTP服务器
                          $phpmailer->Port = 465; //SMTP端口
                          $phpmailer->Username = 'no-reply@ixmu.net'; //邮箱账户
                          $phpmailer->Password = '密码'; //邮箱密码
                          $phpmailer->From = 'no-reply@ixmu.net'; //邮箱账户
                          $phpmailer->SMTPAuth = true;
                          $phpmailer->SMTPSecure = 'ssl'; //tls or ssl (port=25时->留空,465时->ssl)
                          $phpmailer->IsSMTP();
                          }

                  • avatar 随风 0

                    评论测试

                    • avatar 简单生活 1

                      你右下角插入表情和图片的图标有错位…