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

    高并发网站架构的核心原则其实就一句话"把所有的用户访问请求都尽量往前推",即:能缓存在用户电脑本地的,就不要让他去访问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

    • 本文由 发表于 2016-01-27
    • 转载请务必保留本文链接:https://linuxeye.com/439.html
    Nginx Lua Redis防止CC攻击 Linux

    Nginx Lua Redis防止CC攻击

    Nginx Lua Redis防止CC攻击实现原理:同一个外网IP、同一个网址(ngx.var.request_uri)、同一个客户端(http_user_agent)在某一段时间(CCseconds...
    Keepalived+Nginx架构整理版 Linux

    Keepalived+Nginx架构整理版

    Keepalived介绍 keepalived是一个类似于layer3, 4, 5 交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如...
    Nginx中文域名配置 Linux

    Nginx中文域名配置

    Nginx虚拟主机上绑定一个带中文域名,比如linuxeye.中国,浏览器不能跳转。 why? 因为操作系统的核心都是英文组成,DNS服务器的解析也是由英文代码交换,所以DNS服务器上并不支持直接的中...
    匿名

    发表评论

    匿名网友

      • avatar 刘sun

        请问,多个vhost能用?

          • avatar yeho

            @ 刘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

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

                      • avatar BabyBichu

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

                          • avatar yeho

                            @ 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 Yephy

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

                                  • avatar 深蓝

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

                                    • avatar 后知后觉

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

                                      • avatar yeho

                                        需要进入openresty源码目录

                                        • avatar 林大壮

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

                                          • avatar 林大壮

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

                                            • avatar ITYOY

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

                                              • avatar Orso

                                                typecho能实现这种缓存吗

                                                • avatar 大喇叭

                                                  nice 收藏一下 :razz:

                                                  • avatar 鲜果咖啡

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

                                                    • avatar 美剧天堂

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

                                                        • avatar yeho

                                                          @ 美剧天堂 建议安装。

                                                            • 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

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

                                                                      • avatar 自然

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