现在博客执行速度比较慢,一般动态页面要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