用Varnish和Memcached缓存给WordPress网站提速-内存级加速

WordPress   2014年05月30日 17:53  

用Varnish和Memcached缓存给Wordpress网站提速-内存级加速

Varnish是一款高性能的缓存加速器,Varnish把数据存放在服务器的内存中,利用内存可以极大的提高PHP页面执行速度,可以设置0~60秒的精确缓存时间,32位的机器支持的缓存文件最大为2 GB。

Varnish采用VCL的配置,而且具有强大的管理功能,如top、stat、admin、lis,管理方式比较灵活。Varnish的状态机设计不仅巧妙,结构也很清晰,利用二叉堆管理缓存文件,即可达到随时删除的目的。

Memcached是一个高性能的分布式内存对象缓存系统,通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached对于减少MysqL数据查询压力非常有帮助。

由于Varnish采用了Visual Page Cache技术,所有缓存的数据都直接从内存读取,而Squid从硬盘读取缓存的数据,所以Varnish在访问速度方面会更快一些。但是Varnish在高并发状态下,CPU、I/O和内存等资源的开销高于Squid。

目前Varnish3.0版本解决了服务器重启后Varnish缓存消失的问题,性能优化上有了更大的提升。本篇文章就来分享一下利用Varnish和Memcached缓存来给Wordpress加速,因为要用到内存,所以比较适合那些大内存的服务器。

如果你正遭遇着大流量给Wordpress服务器带来的压力的苦恼,可以来尝试这些Wordpress提速方法:

用Varnish和Memcached缓存给Wordpress网站提速-内存级加速

一、Varnish安装方法

1、Varnish官网:

  • 1、官方网站:https://www.-cache.org/

2、对于Centos 5的,可以执行以下命令来安装:


rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-3.0/el5/noarch/varnish-release/varnish-release-3.0-1.el5.centos.noarch.rpm
yum install varnish

3、对于是Centos 6的,可以执行以下命令来安装:


rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-3.0/el6/noarch/varnish-release/varnish-release-3.0-1.el6.noarch.rpm
yum install varnish

Varnish安装完成

4、如果版本搞错,就会出现如下提示错误:


error: Failed dependencies:
	rpmlib(FileDigests) <= 4.6.0-1 is needed by varnish-release-3.0-1.el6.noarch
	rpmlib(PayloadIsXz) <= 5.2-1 is needed by varnish-release-3.0-1.el6.noarch

Error: Missing Dependency: libedit.so.0 is needed by package varnish-3.0.5-1.el5.centos.i386 (varnish-3.0)

Varnish安装出错提示

5、Centos 5安装时还会提示有依赖关系不能解决,解决的办法就是添加扩展的YUM 源,执行以下命令:


rpm -ivh https://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.1-1.el5.rf.i386.rpm (32位)
rpm -ivh https://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm (64位)
yum clean all
yum update

6、对于是Debian系统,可以执行以下命令来安装:


curl https://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -
echo "deb https://repo.varnish-cache.org/debian/ wheezy varnish-3.0" >> /etc/apt/sources.list
apt-get update
apt-get install varnish

6、对于是Ubuntu系统,可以执行以下命令来安装:


curl https://repo.varnish-cache.org/debian/GPG-key.txt | sudo apt-key add -
echo "deb https://repo.varnish-cache.org/ubuntu/ precise varnish-3.0" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install varnish

7、设置Varnish开机启动,执行:chkconfig varnish on和chkconfig varnishncsa on

8、启动Varnish的命令是:service varnish start和service varnishncsa start

Varnish开机启动

9、这里还有一个Linux+Nginx+MySQL+PHP+Varnish一键安装包,自动安装完成:Varnish高性能开源HTTP加速器:Varnish Nginx和Varnish Apache搭建配置

二、Varnish相关配置

1、设置好Varnish缓存规则。默认是/etc/varnish/default.vcl,大家可以下载这个Varnish WordPress配置文件覆盖原来的,地址:https://centos.googlecode.com/files/default.vcl。源码内容:


# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
# Default backend definition.  Set this to point to your content
# server.
backend default {
  .host = "127.0.0.1";
  .port = "8080";
}
acl purge {
        "localhost";
        "127.0.0.1";
}
# Below is a commented-out copy of the default VCL logic.  If you
# redefine any of these subroutines, the built-in logic will be
# appended to your code.
sub vcl_recv {
     # Only cache the following site
    if (req.http.host ~ "(amhg.freehao123.info)") {
        set req.backend = default;
    } else {
        return (pass);
    }
if (req.request == "PURGE") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed.";
                }
                return (lookup);
        }
     if (req.restarts == 0) {
     if (req.http.x-forwarded-for) {
         set req.http.X-Forwarded-For =
         req.http.X-Forwarded-For + ", " + client.ip;
     } else {
         set req.http.X-Forwarded-For = client.ip;
     }
     }
     if (req.request != "GET" &&
       req.request != "HEAD" &&
       req.request != "PUT" &&
       req.request != "POST" &&
       req.request != "TRACE" &&
       req.request != "OPTIONS" &&
       req.request != "DELETE") {
         /* Non-RFC2616 or CONNECT which is weird. */
         return (pipe);
     }
     if (req.request != "GET" && req.request != "HEAD") {
         /* We only deal with GET and HEAD by default */
         return (pass);
     }
     if (req.http.Authorization || req.http.Cookie ~ "wordpress_logged" || req.http.Cookie ~ "comment_") {
         /* Not cacheable by default */
         return (pass);
     }
     return (lookup);
}
sub vcl_pipe {
     # Note that only the first request to the backend will have
     # X-Forwarded-For set.  If you use X-Forwarded-For and want to
     # have it set for all requests, make sure to have:
     # set bereq.http.connection = "close";
     # here.  It is not set by default as it might break some broken web
     # applications, like IIS with NTLM authentication.
     return (pipe);
}
sub vcl_pass {
     return (pass);
}
sub vcl_hash {
     hash_data(req.url);
     if (req.http.host) {
         hash_data(req.http.host);
     } else {
         hash_data(server.ip);
     }
     return (hash);
}
sub vcl_hit {
if (req.request == "PURGE") {
                purge;
                error 200 "Purged.";
        }
     return (deliver);
}
sub vcl_miss {
if (req.request == "PURGE") {
                purge;
                error 200 "Purged.";
        }
     return (fetch);
}
sub vcl_fetch {
     if (beresp.ttl <= 0s ||
         beresp.http.Set-Cookie ||
         beresp.http.Vary == "*") {
         /*
          * Mark as "Hit-For-Pass" for the next 2 minutes
          */
         set beresp.ttl = 120 s;
         return (hit_for_pass);
     }
set beresp.ttl = 1d;
     return (deliver);
}
sub vcl_deliver {
     return (deliver);
}
sub vcl_error {
     set obj.http.Content-Type = "text/html; charset=utf-8";
     set obj.http.Retry-After = "5";
     synthetic {"
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
   <head>
     <title>"} + obj.status + " " + obj.response + {"</title>
   </head>
   <body>
     <h1>Error "} + obj.status + " " + obj.response + {"</h1>
     <p>"} + obj.response + {"</p>
     <h3>Guru Meditation:</h3>
     <p>XID: "} + req.xid + {"</p>
     <hr>
     <p>Varnish cache server</p>
   </body>
</html>
"};
     return (deliver);
}
sub vcl_init {
     return (ok);
}
sub vcl_fini {
     return (ok);
}

2、下载下来的default.vcl你需要调整的地方有一处,就是将域名更改为自己要使用Varnish缓存的域名。

Varnish修改配置规则

3、另外default.vcl还设置缓存时间,单位是s(秒),h(小时),d(天)。

Varnish调整缓存时长

4、配置Varnish的访问端口。Varnish配置默认的访问端口不是80端口,因此需要修改/etc/sysconfig/varnish配置文件,把端口设置为80。

Varnish配置端口

5、在/etc/sysconfig/varnish这个文件中还可以设置Varnish缓存大小,默认是1GB。

Varnish设置缓存大小

三、修改Apache和Nginx为非80端口

1、Varnish的端口改为了80后,我们需要将Apache和Nginx改为非80端口,一般地进入到Apache和Nginx的配置文件修改即可。

Varnish修改服务器端口

2、特别注意:安装了虚拟主机控制面板,除了要修改nginx.conf、nginx-host.conf或者httpd.conf外,还要修改虚拟主机的配置文件,你需要根据自己的VPS主机面板来调整。

Varnish修改虚拟主机端口

3、端口号一般是在配置文件的上方或者最下方。

Varnish端口在配置文件上方或者下方

四、Varnish缓存效果和清除缓存方法

1、上面操作完成后,执行重启命令:service varnish restart,必要时可以重启PHP、Apache和Nginx等。

2、Varnish清除缓存的格式是:varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret ban.url XXXX,其中6082是管理端口后,你可以自己在 /etc/sysconfig/varnish中定义。

3、如果你想清除所有的Varnish缓存,就执行:varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret ban.url ^.*$

4、如果你是想清除某一个页面的缓存,就执行:varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret ban.url /a/2014.html

5、如果你是想清除/a/b/s*.html这样的页面,执行:varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret ban.url ^/a/b/s.*$

6、如果你是想清除/a/b/*.html 这样的页面,执行:varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret ban.url ^/a/b.*$

7、总之,Varnish清除缓存遵循正则表达式,ban.url 是相对URL,查看最近的操作记录:varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret ban.list

Varnish清除缓存方法

8、Varnish HTTP Purge插件自动清除缓存。当你的Wordpress发表文章、编辑文章、修改主题、评论时,Varnish HTTP Purge会自动发出清除该页面缓存请求,无需自己手动清除。官网:https://wordpress.org/plugins/varnish-http-purge/

Varnish WordPress插件

9、Varnish HTTP Purge也支持手动强制清除Varnish全部缓存。

Varnish强制删除缓存

五、Varnish缓存效果和命中率统计

1、Varnish缓存生效后,打开浏览器查看Http的Header头部信息,可以看到有网页是从Varnish缓存中读取。

Varnish查看浏览器头部信息

2、执行:varnishstat 可以看到Varnish缓存状态。(点击放大)

Varnish查看缓存状态

3、Client connections accepted是成功发送HTTP请求的总数量,Client requests received到现在为止发送HTTP请求的累计次数,Cache hits在缓存区中查找并且命中缓存的次数,Cache misses非命中数,N struct object表示当前被缓存的数量。

4、查看Varnish内存使用量:varnishstat -1|grep SMA。

Varnish查看内存使用量

5、SMA.s0.g_space 表示当前可以应用的内存量, SMA.s0.g_bytes 表示的是当前cache实际的内存大小( SMA.s0.c_bytes= SMA.s0.g_bytes +SMA.s0.c_freed ),SMA.s0.c_bytes自动调节的范围,

6、从上图中可以看出我的一个256MB内存已经被分配光了,但是Varnish的命中率还是挺低的。(最主要的原因是这是一台测试VPS,几乎没有访问量,自然谈不上有多少访问缓存数据)

7、实际使用过程中,大家可以随时观察和分析自己的Varnish缓存命中率,如果Varnish命中率比较低的,可以在default.vcl中加入以下规则。


sub vcl_recv
{
if (!(req.url ~ "wp-(login|admin)"))
{
unset req.http.cookie;
}
}
sub vcl_fetch
{
if (!(req.url ~ "wp-(login|admin)"))
{
unset obj.http.set-cookie;
}
}

8、该规则主要是:如果不是wordpress自身的登录和管理页面,就去掉页面http头部的set-cookie标记,从而让Wordpress绝大部分页面都直接使用Varnish缓存。

六、Memcached缓存加速使用

1、Memcached使用得比较广泛,常用的VPS控制面板,如WDCPLNMPAMH等都提供了Memcached扩展安装,参考:WDCP,LNMP安装PHP缓存加速扩展eAccelerator,xcache和memcached

2、对于Wordpress,我们可以使用基于Memcached 的WordPress 缓存插件:,这个插件主要是将Wordpress的页面缓存到内存中,第二次访问该页面时直接从内存中读取,官网:https://wordpress.org/plugins//

3、要想成功使用Batcache,你需要先让Wordpress用上Memcached ,下载一个插件:https://wordpress.org/plugins//,解压,将其中的object-cache.php文件上传到/wp-content/目录中。

4、然后将Batcache下载到本地,解压,将压缩包中的advanced-cache.php上传到/wp-content/目录中。

Memcached安装插件

5、再将Batcache压缩包中的batcache.php上传到/wp-content/plugins/ 目录中。最后在wp-config.php 文件首行中加入:define('WP_CACHE', true);

Memcached添加配置文件

6、Batcache启用后,如果一切正常,刷新几下页面,在</head>标签前面会看到Batcache缓存标识数据。

7、查看Memcached内存使用情况,可以执行:telnet 127.0.0.1 11211,然后输入stats就可以看到Memcached缓存使用情况了。相关的说明如下:

Memcached缓存状态

8、注意:有些VPS可能没有安装telnet,执行以下命令安装:yum install xinetd和yum install telnet –server

9、另外,有用WP Super cache的朋友,可以直接启用WP Super cache的Memcached缓存加速:WP Super cache启用Memcached内存缓存加速及其效果分析

七、Varnish和Memcached缓存加速小结

1、Varnish缓存安装比较简单,主要是注意修改Varnish的端口号为80,然后把Apache和Nginx的端口号修改为非80,Memcached缓存各大VPS控制面板都会提供直接安装方法,安装后在探针中可以检测到。

2、总得来说Varnish和Memcached都属于内存级别的缓存加速,Varnish即使服务器重启也会原有的缓存也不丢失,因此适合页面缓存,而Memcached更适合MysqL数据库缓存,可以大大减少数据库压力。

文章出自:免费资源部落 https://www.freehao123.com/ 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

在这个部落村庄里,已经有50 位神马家族成员冒出泡来在农场开始干活了
  • Less 3

    沙发?

    Less 回复:

    顺便宣传推广一下:www.vpsvps.info 给您新资讯~

    musk100 回复:

    @Less, 前排挤挤

    worpdressnote 回复:

    @Less, 现在用的hhvm+memcached,效果杠杠的

    qi 回复:

    @worpdressnote, 博主现在的Wordpress是运行在HHVM上吗?感觉秒开。

    worpdressnote 回复:

    @qi, 是的,前两天测试下了HHVM 和PHP的差别,可以看看这篇文章的数据:

    https://www.wordpressnote.com/wordpress-php-hhvm/

    这是农场的第 1 块农田,部落批准 [Less] 在[2014-5-30 19:33]开垦完成.
  • 洛克 14

    来晚了 :!:

    外星人源码论坛 回复:

    @洛克, 来晚了 咱俩挤一挤! (我不搞基)

    这是农场的第 2 块农田,部落批准 [洛克] 在[2014-5-30 19:35]开垦完成.
  • 7024 3

    晚了。。

    这是农场的第 3 块农田,部落批准 [7024] 在[2014-5-30 19:45]开垦完成.
  • befory 5

    前排~~~~

    这是农场的第 4 块农田,部落批准 [befory] 在[2014-5-30 19:51]开垦完成.
  • 烟花易冷

    不错来看看~~

    这是农场的第 5 块农田,部落批准 [烟花易冷] 在[2014-5-30 20:01]开垦完成.
  • 锅岛霖懿 2

    逛逛~

    这是农场的第 6 块农田,部落批准 [锅岛霖懿] 在[2014-5-30 20:14]开垦完成.
  • 陌羽 3

    昨天刚想折腾wp的memcached,今天qi就发教程了,点32个茶叶蛋!

    这是农场的第 7 块农田,部落批准 [陌羽] 在[2014-5-30 20:18]开垦完成.
  • wordpressnote 13

    感觉用了HHVM,这些都似乎可以不用做了

    大喇叭 回复:

    @wordpressnote, 你用这个啊

    wordpressnote 回复:

    @大喇叭, 是啊,感觉不错

    大喇叭 回复:

    @wordpressnote, 难怪,,,速度这么不错,软件求发

    wordpressnote 回复:

    @大喇叭, 等回家后吧,现在在外面度假

    大喇叭 回复:

    @wordpressnote, 这么爽的啊…

    这是农场的第 8 块农田,部落批准 [wordpressnote] 在[2014-5-30 22:17]开垦完成.
  • johnhuo 3

    终于来早一次了。。。。我的vps就装了memcached

    qi 回复:

    @johnhuo, memcached对数据库缓存有帮助。

    这是农场的第 9 块农田,部落批准 [johnhuo] 在[2014-5-30 22:31]开垦完成.
  • 洛克 14

    6元钱买了个5位纯字母.com 2016-07-04到期 新网的 怎么样 :mrgreen:

    疯子 回复:

    @洛克, 来一打?

    这是农场的第 10 块农田,部落批准 [洛克] 在[2014-5-30 23:02]开垦完成.
  • varnish很不错的。

    这是农场的第 11 块农田,部落批准 [悦听有声] 在[2014-5-30 23:47]开垦完成.
  • 泷涯 5

    备@案后换国内主机,顺便就把wp换成typecho了。现在博客都是秒开

    这是农场的第 12 块农田,部落批准 [泷涯] 在[2014-5-31 01:12]开垦完成.
  • 贴吧 4

    不错的哈。。

    这是农场的第 13 块农田,部落批准 [贴吧] 在[2014-5-31 01:13]开垦完成.
  • 潮流台 11

    :arrow: 为毛我看起来都很复杂呢!

    这是农场的第 14 块农田,部落批准 [潮流台] 在[2014-5-31 09:46]开垦完成.
  • Kung 23

    嘛。。这玩意也适合论坛吧。。

    这是农场的第 15 块农田,部落批准 [Kung] 在[2014-5-31 12:11]开垦完成.
  • 不认识 17

    这玩意是个好东西。。。

    这是农场的第 16 块农田,部落批准 [不认识] 在[2014-5-31 13:26]开垦完成.
  • 魔力源码社区 2

    正在找呢!最近发现淘宝相册做图床绝对!20g空间!无限流量

    这是农场的第 17 块农田,部落批准 [魔力源码社区] 在[2014-5-31 17:28]开垦完成.
  • 已经给自己的站装上了~不知道和原来对比效果怎样,貌似不开super cache一样快~

    这是农场的第 18 块农田,部落批准 [PC丶爱好者] 在[2014-6-1 08:34]开垦完成.
  • 寒忆 1

    Batcache能直接在线 下载安装 然后启用吗?还是说 先下载到本地 照着上面的步骤 ,只上传那两个文件。那还需要在插件管理里面安装启用插件吗

    这是农场的第 19 块农田,部落批准 [寒忆] 在[2014-7-19 23:27]开垦完成.
  • precomx

    现在Varnish已经是4.0.1了,你这个还是3.x的

    这是农场的第 20 块农田,部落批准 [precomx] 在[2014-7-28 13:44]开垦完成.
  • NoAnyLove 3

    我目前用的是Opcache,一般是40~50个查询在0.1XX级别。
    加上Memcached之后。查询个数大大下降了,降到了10~20级别,但是耗时没有明显提升,依然是0.1XX级别,而且感觉打开速度略有变慢,不知道是不是心理原因。

    这是农场的第 21 块农田,部落批准 [NoAnyLove] 在[2014-9-7 09:28]开垦完成.
  • 小飞国外网赚博客 1

    不错哦~

    这是农场的第 22 块农田,部落批准 [小飞国外网赚博客] 在[2014-11-6 10:57]开垦完成.
  • Qa 4

    安装了varnish 开启网站403,具体是 进入 www.acgget.com 301转跳到www.acgget.com:8080 8080是nginx占用的端口,varnish用的是80

    这是农场的第 23 块农田,部落批准 [Qa] 在[2014-11-11 16:31]开垦完成.
  • Eden 1

    The following memcached servers are not responding or not running:
    Page Cache: 127.0.0.1:11211.
    This message will automatically disappear once the issue is resolved.

    qi,我根据你的方法,设置上传好文件后,在W3TC把Page cache method:从Disk Enhanced选择变成了memcached,更新设置后,出现了上面的一段红色标注,我打开我的页面,查看页脚,Page Caching using Disk变成了Page Caching using memcached。这样设置正确吗?

    qi 回复:

    @Eden, 看看memcached服务有没有正常运行,如果正常运行,看看端口有没有在防火*中打开。

    这是农场的第 24 块农田,部落批准 [Eden] 在[2015-3-9 00:33]开垦完成.
  • 请修改昵称

    搞怕了,三个站wordpress互相访问,全乱套了,服务器重启都没用,卸了WP Super Cache才恢复正常。

    qi 回复:

    @请修改昵称, 失败了?

    请修改昵称 回复:

    @qi, 不能同时在几个wp站用,不然会相互缓存,访问wp1就变了wp2,文章不变,但站名称、模板、样式这些会变,可能 不能在同一浏览器窗口打开多个站点吧,没尝试。不过这种现象网上有解决的办法。

    qi 回复:

    @请修改昵称, 还有这样的情况?是指同一个服务器上不能同时用?

    请修改昵称 回复:

    @qi, 不清楚,应该是同一浏览器的其他窗口都会缓存吧,后来删了就没弄了。

    请修改昵称 回复:

    @qi, 百度搜索 “多个WordPress下配置memcache object-cache”,有介绍。

    这是农场的第 25 块农田,部落批准 [请修改昵称] 在[2015-4-11 23:07]开垦完成.
  • 螺蛳粉

    请问,装了wp-super cache 还要装这个 varnish么? wp- super cache 可以配合和 memcache 使用,他们三能一起用么? 谢谢亲。

    qi 回复:

    @螺蛳粉, 没有必要了,缓存插件还是只安装一个好。wp- super cache 可以配合和 memcache 使用。

    这是农场的第 26 块农田,部落批准 [螺蛳粉] 在[2016-12-1 22:26]开垦完成.
  • 螺蛳粉

    请问varnish和batcache的作用是不是一样啊?他们都是将php页面缓存到内存中,这两个哪个更好呢?

    qi 回复:

    @螺蛳粉, 是一样的,varnish要强大些但是复杂,batcache要方便一些。

    螺蛳粉 回复:

    @qi, 谢谢qi,大江南美,qiqi最美。 我在问一个问题,wp-super-cache是把所有页面缓存到 ECS 内存 上么? 因为我的ECS 内存还比较大。 看了你的教程,我知道varnish是把php页面缓存到内存中的,wp-super-cache的作用和功效和varnish一样么? 谢谢亲!

    qi 回复:

    @螺蛳粉, 不一样,wp-super-cache是生成类似静态的页面文件,性能取决于硬盘的读写速度,和内存没有关系。

    这是农场的第 27 块农田,部落批准 [螺蛳粉] 在[2016-12-1 22:31]开垦完成.
看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部