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/blog.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 blog.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网站根目录wp-config.php添加如下行:

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

4. 测试

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

查看网页源代码:

查看Nginx Helper是否刷新日志:

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:

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

    • avatar 咱们结婚吧 1

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

        • avatar yeho Admin

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

        • avatar 禅猫 3

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

          • avatar 美剧天堂 1

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

              • avatar yeho Admin

                @美剧天堂 建议安装。

                  • avatar 美剧天堂 1

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

                      • avatar 采觅博主 3

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

                          • avatar 美剧天堂 1

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

                          • avatar 采觅随记 3

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

                      • avatar 鲜果咖啡 0

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

                        • avatar 大喇叭 1

                          nice 收藏一下 :razz:

                          • avatar Orso 0

                            typecho能实现这种缓存吗

                              • avatar yeho Admin

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

                              • avatar ITYOY 2

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

                                • avatar 林大壮 1

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

                                  • avatar 林大壮 1

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

                                    • avatar yeho Admin

                                      需要进入openresty源码目录

                                      • avatar 后知后觉 1

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

                                        • avatar 深蓝 3

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

                                          • avatar Yephy 0

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

                                            • avatar 后知后觉 1

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

                                                • avatar 技术宅 0

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

                                                • avatar 颜羽夕。 1

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

                                                    • avatar 采觅随记 3

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

                                                      • avatar 采觅随记 3

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

                                                      • avatar kamin 0

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

                                                          • avatar yeho Admin

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

                                                              • avatar BabyBichu 1

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

                                                                  • avatar yeho Admin

                                                                    @BabyBichu 只用这个即可

                                                                      • avatar BabyBichu 1

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

                                                                • avatar 颜羽夕。 1

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

                                                                  • avatar miming 1

                                                                    按照上面的 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 刘sun 0

                                                                      请问,多个vhost能用?

                                                                        • avatar yeho Admin

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