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