WordPress优化——利用Nginx fastcgi_cache缓存加速

  • A+
所属分类:Linux

高并发网站架构的核心原则其实就一句话"把所有的用户访问请求都尽量往前推",即:能缓存在用户电脑本地的,就不要让他去访问CDN。 能缓存CDN服务器上的,就不要让CDN去访问源(静态服务器)了。能访问静态服务器的,就不要去访问动态服务器。以此类推:能不访问数据库和存储就一定不要去访问数据库和存储。

WordPress最好的优化方式就是尽量不安装插件,之前有分享过《wordpress启动Redis缓存加速》,Wordpress是典型的PHP-MySQL应用,去做数据库缓存,倒不如让轻量级的Nginx直接去缓存WordPress内容。

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

1. 安装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模块

OneinStack》和《lnmp一键安装包》下安装ngx_cache_purge模块

  1. cd /root/oneinstack/src
  2. wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
  3. wget http://nginx.org/download/nginx-1.9.10.tar.gz
  4. tar xzf ngx_cache_purge-2.3.tar.gz
  5. tar xzf nginx-1.9.10.tar.gz
  6. cd nginx-1.9.10
  7. nginx -V #查看nginx编译参数,最后加上--add-module=../ngx_cache_purge-2.3
  8. ./configure --prefix=/usr/local/nginx --user=www --group=www \
  9. --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module \
  10. --with-ipv6 --with-http_gzip_static_module --with-http_realip_module \
  11. --with-http_flv_module --with-ld-opt=-ljemalloc \
  12. --add-module=../ngx_cache_purge-2.3
  13. make  #编译
  14. mv /usr/local/nginx/sbin/nginx{,_`date +%F`}  #备份nginx
  15. cp objs/nginx /usr/local/nginx/sbin
  16. nginx -V 2>&1 | grep -o ngx_cache_purge
  17. # 显示ngx_cache_purge表示已经安装成功

2. Nginx配置

建议将fastcgi_cache_path设置tmpfs内存中,操作系统不同tmpfs路径也不同,如下:

CentOS:/dev/shm

Ubuntu和Debian:/run/shm

修改nginx虚拟主机配置文件/usr/local/nginx/conf/vhost/linuxeye.com.conf:

  1. fastcgi_cache_path /dev/shm/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
  2. fastcgi_cache_key "$scheme$request_method$host$request_uri";
  3. fastcgi_cache_use_stale error timeout invalid_header http_500;
  4. fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
  5. server {
  6. listen 443 ssl http2;
  7. ssl_certificate /usr/local/nginx/conf/vhost/linuxeye_blog.crt;
  8. ssl_certificate_key /usr/local/nginx/conf/vhost/linuxeye_blog.key;
  9. ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
  10. ssl_session_cache shared:SSL:10m;
  11. ssl_session_timeout 10m;
  12. #ssl_stapling on;
  13. #ssl_stapling_verify on;
  14. resolver 8.8.8.8 8.8.4.4 valid=300s;
  15. resolver_timeout 5s;
  16. server_name linuxeye.com;
  17. access_log /home/wwwlogs/blog_nginx.log combined;
  18. index index.html index.htm index.php;
  19. include wordpress.conf;
  20. root /home/wwwroot/blog;
  21. set $skip_cache 0;
  22. if ($request_method = POST) {
  23.     set $skip_cache 1;
  24.     }
  25. if ($query_string != "") {
  26.     set $skip_cache 1;
  27.     }
  28. if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
  29.     set $skip_cache 1;
  30.     }
  31. if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
  32.     set $skip_cache 1;
  33.     }
  34. location ~ [^/]\.php(/|$) {
  35.     #fastcgi_pass remote_php_ip:9000;
  36.     fastcgi_pass unix:/dev/shm/php-cgi.sock;
  37.     fastcgi_index index.php;
  38.     include fastcgi.conf;
  39.     fastcgi_cache_bypass $skip_cache;
  40.     fastcgi_no_cache $skip_cache;
  41.     fastcgi_cache WORDPRESS;
  42.     fastcgi_cache_valid  60m;
  43.     }
  44. location ~ /purge(/.*) {
  45.     allow 127.0.0.1;
  46.     deny all;
  47.     fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
  48.     }
  49. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
  50.     expires 30d;
  51.     access_log off;
  52.     }
  53. location ~ .*\.(js|css)?$ {
  54.     expires 7d;
  55.     access_log off;
  56.     }
  57. }

使nginx配置生效

  1. service nginx reload

重启系统后shm内存中nginx-cache文件夹会丢失,为了使重启生效(自动创建文件夹),修改/etc/init.d/nginx的make_dirs下一行(大概52行)添加:

  1. [ ! -d '/dev/shm/nginx-cache' ] && { mkdir /dev/shm/nginx-cache; chown -R ${user}.$user /dev/shm/nginx-cache; }

3. WordPress安装Nginx Helper插件

WordPress后台【插件】—【安装插件】搜索【Nginx Helper】安装即可。如下设置:

Wordpress优化——利用Nginx fastcgi_cache缓存加速

修改wordpress网站根目录wp-config.php添加如下行:

  1. define('RT_WP_NGINX_HELPER_CACHE_PATH','/dev/shm/nginx-cache');

4. 测试

测试时候勾选Enable Logging(记录日志)、Enable Nginx Timestamp in HTML(插入缓存信息)

查看网页源代码:

Wordpress优化——利用Nginx fastcgi_cache缓存加速

查看Nginx Helper是否刷新日志:

Wordpress优化——利用Nginx fastcgi_cache缓存加速

Wed Jan 27 11:34:35 CST 2016

avatar

发表评论

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

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

    • avatar 刘sun

      请问,多个vhost能用?

        • avatar yeho Admin

          @刘sun 参考:http://serverfault.com/questions/539125/is-it-possible-to-have-a-fastcgi-cache-path-for-each-website-virtual-host

        • avatar miming

          按照上面的 conf 设定,一个网站是没问题的,
          但在多设定一个网站后,nginx -t 会出错,
          nginx: [emerg] the same path name “/dev/shm/nginx-cache” used in /usr/local/nginx/conf/vhost/demo.1798.in.conf:1 and in /usr/local/nginx/conf/vhost/gtour.info.conf:1
          nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

          • avatar 颜羽夕。

            应该加个多站点配置,因为单keys_zone多站点缓存会冲突

            • avatar kamin

              用了这个是不是就可以停用redis之类的缓存了?
              还是说都可以并存?

                • avatar yeho Admin

                  @kamin 可以停止了,数据库可以用缓存

                    • avatar BabyBichu

                      @yeho 这么说Oneinstack里把Redis还有Mencache都装上是白装咯?看来只用这个就行啦?
                      目前我就是照的安装过程,以及使用的Cloudflare的Rule,全站(包括伪静态HTML)都缓存,所以访问到的都是CloudFlare上的Edge Cache,这样子即使板瓦工很慢也不会影响访问速度了。
                      那么是不是这个就显然没有必要了呢?

                        • avatar yeho Admin

                          @BabyBichu 只用这个即可

                            • avatar BabyBichu

                              @yeho 我在想
                              有时候板瓦工(BandWagonHost)也是会抽风的 所以在CloudFlare的Page Rule也给全站的伪静态html加上了缓存 有时服务器抽风进不去后台 但是前台网页都还能进去
                              也不知道这种情况是否还有使用Nginx fastcgi_cache的必要呢?不过抽风时 访问自己VPS的IP也是能进得去OneinStack的主页的

                      • avatar 颜羽夕。

                        老大我来给你解决个问题:
                        Nginx helper的自定义清理路径需要在wp-config.php加入define( ‘RT_WP_NGINX_HELPER_CACHE_PATH’,’/tmp/wpcache’); #这个路径做好是二级路径。
                        然后选择 文件路径 的方式来清理缓存,而不是请求的方式,因为这样手动清理缓存并不能清理。
                        关于目录的问题,就像mkdir创建文件夹,如果是二级目录不需要加-p参数就可以了,二级以上的文件夹必须加-p参数。为什么说到文件夹呢?因为Nginx helper插件的清理功能是类似于这样的,他不带-p参数来创建缓存路径,这样做的后果是清理了缓存之后不重载Nginx前台就会GG。。

                          • avatar 采觅随记

                            @颜羽夕。 这个现象我好像没有遇到,上面代码没有加-P参数不是也能正常创建文件夹了。不过我遇到的是按了清楚全部缓存Purging entire cache ”按钮后,首页会GG,这个应该是因为Nginx helper插件不能重启nginx导致的 :grin: ,解决参照张戈博客:http://zhangge.net/5061.html :mrgreen:

                            • avatar 采觅随记

                              @颜羽夕。 好吧我错了 :!: ,张戈文卓后面也写了,但是如果换成二级路劲的话….不是没法用到博主推荐的tmpfs内存了吗…毕竟硬盘比内存速度差远了

                            • avatar 后知后觉

                              安装上面的操作,缓存目录下没有文件生成,header显示cache-control:nocache ,max-age=0,请问是什么原因啊,fastcgi_ignore_headers Cache-Control Expires Set-Cookie;这句加了还是这样

                                • avatar 技术宅

                                  @后知后觉 把页面缓存下面两个comment去掉

                                • avatar Yephy

                                  大神,昨晚上照你的办法用了插件,结果发现:Nginx Helper这个鬼一开启,前端有评论时,鸟哥主题里的/begin/inc/functions/comment-ajax.php?ver=2016.1.28这个鬼东西就加载卡住!~这是要死的节奏啊!~禁用插件就不会卡了!~这是什么原因啊!~?

                                  • avatar 深蓝

                                    这篇博文被N多人转载了,“把所有的用户访问请求都尽量往前推”这句话不知道出处是这里吗?好多地方看到,很精髓!

                                    • avatar 后知后觉

                                      用了这个以后登录状态会被缓存,导致无法评论啊,有什么好的解决方案吗

                                      • avatar yeho Admin

                                        需要进入openresty源码目录

                                        • avatar 林大壮

                                          装这个还需要自动清空缓存吗

                                          • avatar 林大壮

                                            请问博主,用了这个Nginx fastcgi_cache优化 还需要装Jemalloc来优化数据库吗

                                            • avatar ITYOY

                                              看了看,这个上头的nginx还是1.9的,现在上了1.10 还能使么?

                                              • avatar Orso

                                                typecho能实现这种缓存吗

                                                  • avatar yeho Admin

                                                    @Orso 不清楚有没有这类插件。

                                                  • avatar 大喇叭

                                                    nice 收藏一下 :razz:

                                                    • avatar 鲜果咖啡

                                                      使用了Opcache可以用么,是不是可以更快

                                                      • avatar 美剧天堂

                                                        我的网站也是用wordpress系统,使用了最新的php7,没有开启Opcache,但是有人建议用php7一定要开启Opcache,说是php会更快,但是我的内存只有1G,不敢开启Opcache,怕占用更多的内存,不知道如何是好,请教博主一下?

                                                          • avatar yeho Admin

                                                            @美剧天堂 建议安装。

                                                              • avatar 美剧天堂

                                                                @yeho 那开启Opcache会不会占用更多内存还是会降低物理内存的使用呢?

                                                                  • avatar 采觅博主

                                                                    @美剧天堂 放心开吧,占用不了多少!博主也是1G,我也是1G,wordpress个人站1G一般够用的。除非你服务器环境搭建不当或者没有优化,现在内存就所剩不多了。 :grin:

                                                                      • avatar 美剧天堂

                                                                        @采觅博主 我去,我用oneinstack搭建的,我不知道有没有优化,也不知道怎么优化 :?:

                                                                      • avatar 采觅随记

                                                                        @美剧天堂 那你开启就是了,放心!它缓存PHP,你网站程序才多大。

                                                                  • avatar 禅猫

                                                                    噢 才发现啊,yeho太不厚道了,自己偷偷启用cache 20

                                                                    • avatar 咱们结婚吧

                                                                      什么时候写一个openresty 编译ngx_cache_purge 的试一下。
                                                                      编译了半天 都没有成功。
                                                                      gmake 之后 就提示错误
                                                                      make
                                                                      错误

                                                                        • avatar yeho Admin

                                                                          @咱们结婚吧 安装前修改options.conf nginx_modules_options=’–add-module=../ngx_cache_purge’

                                                                        • avatar 自然

                                                                          请问怎么解决缓存后评论异常情况