℃冻番茄's Blog

Feed Rss

我曾经写过一篇文章──《初步试用Squid的替代产品──Varnish Cache网站加速器》,但当时仅仅是用着玩,没做深入研究。

今天写的这篇关于Varnish的文章,已经是一篇可以完全替代Squid做网站缓存加速器的详细解决方案了。网上关于Varnish的资料很少,中文资料更是微乎其微,希望本文能够吸引更多的人研究、使用Varnish。

在我看来,使用Varnish代替Squid的理由有三点:
1、Varnish采用了“Visual Page Cache”技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存、磁盘中交换文件,性能要比Squid高。
2、Varnish的稳定性还不错,我管理的一台图片服务器运行Varnish已经有一个月,没有发生过故障,而进行相同工作的Squid服务器就倒过几次。
3、通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存,这一点是Squid不能具备的。

点击在新窗口中浏览此图片


下面来安装Varnish网站缓存加速器(Linux系统):
1、创建www用户和组,以及Varnish缓存文件存放目录(/var/vcache):

/usr/sbin/groupadd www -g 48
/usr/sbin/useradd -u 48 -g www www
mkdir -p /var/vcache
chmod +w /var/vcache
chown -R www:www /var/vcache

2、创建Varnish日志目录(/var/logs/):

mkdir -p /var/logs
chmod +w /var/logs
chown -R www:www /var/logs

3、编译安装varnish:

wget http://blog.s135.com/soft/linux/varnish/varnish-1.1.2.tar.gz
tar zxvf varnish-1.1.2.tar.gz
cd varnish-1.1.2
./configure –prefix=/usr/local/varnish
make && make install

4、创建Varnish配置文件:

vi /usr/local/varnish/vcl.conf

输入以下内容:

引用
backend myblogserver {
set backend.host = “192.168.0.5″;
set backend.port = “80″;

acl purge {
“localhost”;
“127.0.0.1″;
“192.168.1.0″/24;
}

sub vcl_recv {
if (req.request == “PURGE”) {
if (!client.ip ~ purge) {
error 405 “Not allowed.”;
}
lookup;
}

if (req.http.host ~ “^blog.s135.com”) {
set req.backend = myblogserver;
if (req.request != “GET” && req.request != “HEAD”) {
pipe;
}
else {
lookup;
}
}
else {
error 404 “Zhang Yan Cache Server”;
lookup;
}
}

sub vcl_hit {
if (req.request == “PURGE”) {
set obj.ttl = 0s;
error 200 “Purged.”;
}
}

sub vcl_miss {
if (req.request == “PURGE”) {
error 404 “Not in cache.”;
}
}

sub vcl_fetch {
if (req.request == “GET” && req.url ~ “\.(txt|js)$”) {
set obj.ttl = 3600s;
}
else {
set obj.ttl = 30d;
}
}

这里,我对这段配置文件解释一下:
(1)、Varnish通过反向代理请求后端IP为192.168.0.5,端口为80的web服务器;
(2)、Varnish允许localhost、127.0.0.1、192.168.0.***三个来源IP通过PURGE方法清除缓存;
(3)、Varnish对域名为blog.s135.com的请求进行处理,非blog.s135.com域名的请求则返回“Zhang Yan Cache Server”;
(4)、Varnish对HTTP协议中的GET、HEAD请求进行缓存,对POST请求透过,让其直接访问后端Web服务器。之所以这样配置,是因为POST请求一般是发送数据给服务器的,需要服务器接收、处理,所以不缓存;
(5)、Varnish对以.txt和.js结尾的URL缓存时间设置1小时,对其他的URL缓存时间设置为30天。

5、启动Varnish

ulimit -SHn 51200
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on

6、启动varnishncsa用来将Varnish访问日志写入日志文件:

/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/varnish.log &

7、配置开机自动启动Varnish

vi /etc/rc.local

在末尾增加以下内容:

引用
ulimit -SHn 51200
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &

8、优化Linux内核参数

vi /etc/sysctl.conf

在末尾增加以下内容:

引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000    65000

再看看如何管理Varnish:
1、查看Varnish服务器连接数与命中率:

/usr/local/varnish/bin/varnishstat

点击在新窗口中浏览此图片

2、通过Varnish管理端口进行管理:
用help看看可以使用哪些Varnish命令:

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 help
引用
Available commands:
ping [timestamp]
status
start
stop
stats
vcl.load
vcl.inline
vcl.use
vcl.discard
vcl.list
vcl.show
param.show [-l] []
param.set
help [command]
url.purge
dump.pool

3、通过Varnish管理端口,使用正则表达式批量清除缓存:
(1)、例:清除类似http://blog.s135.com/a/zhangyan.html的URL地址):

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /a/

(2)、例:清除类似http://blog.s135.com/tech的URL地址:

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge w*$

(3)、例:清除所有缓存:

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$

4、一个清除Squid缓存的PHP函数(清除Varnish缓存同样可以使用该函数,无需作任何修改,十分方便):

  1. <?php
  2. function purge($ip, $url)
  3. {
  4. $errstr = ”;
  5. $errno = ”;
  6. $fp = fsockopen ($ip, 80, $errno, $errstr, 2);
  7. if (!$fp)
  8. {
  9. return false;
  10. }
  11. else
  12. {
  13. $out = ”PURGE $url HTTP/1.1\r\n”;
  14. $out .= ”Host:blog.s135.com\r\n”;
  15. $out .= ”Connection: close\r\n\r\n”;
  16. fputs ($fp, $out);
  17. $out = fgets($fp , 4096);
  18. fclose ($fp);
  19. return true;
  20. }
  21. }
  22. purge(“192.168.0.4″, ”/index.php”);
  23. ?>

附1:Varnish官方网站:http://www.varnish-cache.org/

附2:2007年12月10日,我写了一个每天0点运行,按天切割Varnish日志,生成一个压缩文件,同时删除上个月旧日志的脚本(/var/logs/cutlog.sh):
/var/logs/cutlog.sh文件内容如下:

引用
#!/bin/sh
# This file run at 00:00
date=$(date -d “yesterday” +”%Y-%m-%d”)
pkill -9 varnishncsa
mv /var/logs/youvideo.log /var/logs/${date}.log
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &
mkdir -p /var/logs/youvideo/
gzip -c /var/logs/${date}.log > /var/logs/youvideo/${date}.log.gz
rm -f /var/logs/${date}.log
rm -f /var/logs/youvideo/$(date -d “-1 month” +”%Y-%m*”).log.gz

设置在每天00:00定时执行:

/usr/bin/crontab -e

或者

vi /var/spool/cron/root

输入以下内容:

引用
0 0 * * * /bin/sh /var/logs/cutlog.sh

今天一直在调一个bug,使用jquery的jsonp做跨域时,在ie6下面,每次点击按钮,$.getJSON提交都返回不到值。

后来用Fiddler分析后才发现$.getJSON提交后,http请求被中断了。

找了很久的问题,后来发现是因为按钮放置在<form>标签里面引起的,后把submit按钮放置在form标题外面,问题解决!

分析应该是form中断了$.getJSON发出的http请求,即使action=”javascript:void(0);” 也一样被中断

记录一下,方便以后的同行们碰到同样的问题““

http://td.phpd.cn/

采集程序托管在新浪的云计算平台,memcache缓存化处理,每5秒自动从民生银行采一次数据!

另重写了一下js,显示黄金白银的价格信息及卖买价成交量,数据源已经ok了,正在开发android手机端

开放json格式接口

http://xzytd.sinaapp.com/index.php

来上海三个多月了,一直在嘉定就没怎么出过门,前二天去买好了回南昌的车票,运气还算不错,竟然买到了动车票。5个多小时就可以到南昌了。今天是回家过年的最后一个周末,下周这个时候就要准备回家了,再加上今天天气还不错,在租的房子附近转了转,拍了一些照片。

最近开始着手练习android开发,第一个练手作用是手机端的显示黄金白银报价,因为自己闲时玩玩t+d,但市面上还没有相应的手机应用,所以决定自己做个用用。

今天分析民生银行的数据,发现还是容易得到的,然后用php封装了一下,从民生银行拿到数据,并且做上memcache缓存,生成json数据输出。这样就可以做为android手机端的数据源了!

经过分析,现在从民生银行里拿到了还算比较实时的黄金t+d和白银t+d的报价信息。价格信息非常的全,买卖共10个报价并且交易手数等等。目前已经封装成了接口形式

数据源 http://phpd.cn/td.php 支持JSONP格式,跨域直接调用

html显示页面 http://phpd.cn/td.html 演示只显示白银t+d

希望有共同爱好的朋友一起讨论讨论。

android sdk官方站被墙了,还好找到了一个估计是appspot搭的代理站

http://androidappdocs-staging.appspot.com/sdk/index.html

eclipse还是比较好下载的,安装及配置的方法与在windows上相同!

第一个练手项目,准备开发一个android2.1下的用于显示黄金、白银、美指等数据的小APP。数据源初步打算用php从和讯或cngold等比较及时的站点采集得到,然后封装成接口供app调用!

辞旧迎新的时刻,祝愿大家在2011年身体健康、工作顺心、数钱数到手抽筋!!!!

自从来上海加入我友网后,工作上还算顺利的,像什么加班啊、福利啊什么的神马都是浮云,就希望他妈的发些年终奖另多调几天的休,好好过完这个年。

另就近网web版已进入开发尾期,服务接口都已开发完毕,现在开始抽时间好好学习android开发了,手机端的 LBS 应用还是有非常大的市场前景的,真是另人期待啊。

主题用的是Lightword最新版,修改了一下css,让它显示中文更好,默认字体改为微软雅黑。

另博客里的垃圾评论太多了,以前一直不愿整理,后来才知道wp自带了一个非常棒的反垃圾评论插件Akismet,只是没启用而以,今天也把它打开了,500多个评论99%拉到了垃圾评论里面,确实不错!

之前wp的自动升功能一直不好使,同样也是今天才发现wp的文件所有者是root,用ftp的方式根本改不了wp的文件,chown了一下,就ok了.

另诚招独立博客友情链接!

主动发送信息实现过程:

机器人通过http去指定的url上去获取单条要给机器人发送的信息,为空的话,隔5秒后再取,不为空,取出并且机器人发送本条信息,同时下次取信息时,会把这条已发送的信息的ID通过POST传给http,通知web程序本条信息已成功发出!

程序写好,编译也通过了,但是公司上网要走公司的代理,所以qq机器人暂时还没有通过测试,先在博客里记录一下,回家后再测

目前机器人处开发阶段,设定了一个时间,机器人登陆后60秒左右后会自动下线!

xqqrobot_1224

需求:多台memcache共同工作,一台memcache服务器为主服务器A 其它的memcache服务器为B,C,D…

后台对memcache进行delete及set操作时,把操作命令存至redis或是其它媒介中,采用redis lists 做一简单的队阵方式保存操作的命令,也就是把A的日志记录压入队阵中

然后服务器跑一php的脚本,不停的循环从redis 中弹出A的命令日志,最后,把命令给B,C,D等从服务器执行,这样就达到了主从一至的要求。

目前只是简单的想法,准备找时间深入一下,弄一个主从备份的脚本,并且加上主从切换的功能。