使用varnish等对博客进行性能优化

现在博客执行速度比较慢,一般动态页面要1-2s的响应时间。下面采用了多种方法进行优化。

opcode缓存,利用php的apc扩展

安装php的apc扩展实现php中间代码缓存。

sudo pecl install apr
#extension=apc.so 添加到php.ini中去

然后重启服务器就可以了。
用php代码来查看缓存的文件列表等情况:

<?php
print_r(apc_cache_info());
//apc_clear_cache();  //清除缓存
?>

使用反向代理缓存服务器varnish

安装varnish:

sudo apt-get install varnish

修改默认端口为80端口:

#sudo vim /etc/default/varnish
DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"
#-a :80  监听80端口
#-f /etc/varnish/default.vcl:指定配置文件路径
#-s malloc,256M:指定只使用内存缓存,最大使用缓存内存为256M
#-T localhost:6082 :指定varnish管理地址

配置文件内容/etc/varnish/default.vcl:

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}
sub vcl_recv {
  if (req.http.Accept-Encoding) { #防止为不同的accept-encoding做不同缓存版本
    if (req.url ~ "\.(gif|jpg|jpeg|swf|flv|mp3|mp4|pdf|ico|png|gz|tgz|bz2)(\?.*|)$") {
      remove req.http.Accept-Encoding;
    } elsif (req.http.Accept-Encoding ~ "gzip") {
      set req.http.Accept-Encoding = "gzip";
    } elsif (req.http.Accept-Encoding ~ "deflate") {
      set req.http.Accept-Encoding = "deflate";
    } else {
      remove req.http.Accept-Encoding;
    }
  }
  if(req.url !~ "(\.|\=|\?).*$" && req.url !~ "/$"){  #解决访问 kyle.ai/blog   跳转到 kyle.ai:8080/blog/ 的问题,给目录后加斜杠
    set req.url = regsub(req.url, "$", "/");
  }
  if (req.url !~ "(/blog)"){ #只对博客地址做缓存
    return (pass);
  }
  if(req.http.cookie ~ "varnish=clear"){ #如果cookies中有 varnish=clear 则强制刷新缓存
	  set req.hash_always_miss = true;
  }

  if (req.url ~ "\.(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
    unset req.http.cookie;
    set req.url = regsub(req.url, "\?.*$", "");
  }
  if (req.http.cookie) {
    if (req.http.cookie ~ "(wordpress_logged)") {  #检测到有登陆的cookie就不缓存,直接请求后端
      return(pass);
    }
    if (req.url ~ "(/blog)"){ #去除其它无关的cookie
      unset req.http.cookie;
    }
  }
}
sub vcl_fetch {
  if (req.url ~ "\.(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
    set beresp.ttl = 365d;
  }else{
    set beresp.ttl = 30d;
  }

}
sub vcl_deliver {
   if (obj.hits > 0) {
     set resp.http.X-Cache = "HIT";
   } else {
     set resp.http.X-Cache = "MISS";
   }
}
sub vcl_hit {
    return (deliver);
}

修改apache的端口为8080,然后启动varnish:

sudo /etc/init.d/varnish restart

修改wordpress程序,让它不跳转siteurl设置的那个地址,修改主题文件夹下面的functions.php文件,添加一句:

remove_filter('template_redirect','redirect_canonical');

清除varnish所有缓存命令:

varnishadm -T 127.0.0.1:80 url.purge .

varnish日志查看命令:

varnishlog
#-b 只显示varnish和后端服务器之间通信的记录条。当你想优化缓存命中率的时候,非常有用。
#-c 和-b类似,只是针对与客户端的通信情况。
#-i tag 只有显示带有特定标签的行。”varnishlog –I SessionOpen”将只显示新会话的情况。注意标签是大小写敏感的。
#-I 通过正则表达式过滤数据,并显示匹配行。”$varnishlog –c –I RxHeader –I Cookie”,将显示所有来自客户端的cookie头信息。
#-o 根据请求id,将记录条目分组。

不重启重新加载配置文件:

sudo /etc/init.d/varnish reload

Varnish3.0中文入门教程:http://anykoro.sinaapp.com/?p=261