生命之中的最大错误在于:终日担心犯错误。— 爱尔伯特·哈伯德 (Elbert Hubbard 1856-1915),《笔记》
今天测试nginx的按时间缓存,发现两个问题:
1 proxy_cache_purge的1.0版本安装到0.8.54版本会出错,请安装1.3版本,否则清除缓存时curl会收到“curl: (52) Empty reply from server”,没法清除缓存
2 proxy_store和它是冲突的,proxy_store off才行,如果http段全局有on,那就在这里需要声明off
安装proxy_cache_purge你可以访问这里查看到官方提供的第三方插件http://wiki.nginx.org/3rdPartyModules
访问 http://labs.frickle.com/nginx_ngx_cache_purge/查看具体配置方式
关于安装的文章太多,不重复。
缓存的特点:
md5值分段截取为文件夹
1,2层级的目录是md5值的后面1个字符和2个字符作为文件夹的
有记KEY值和相应的头信息
清除缓存的响应:
1 proxy_cache_purge的1.0版本安装到0.8.54版本会出错,请安装1.3版本,否则清除缓存时curl会收到“curl: (52) Empty reply from server”,没法清除缓存
2 proxy_store和它是冲突的,proxy_store off才行,如果http段全局有on,那就在这里需要声明off
安装proxy_cache_purge你可以访问这里查看到官方提供的第三方插件http://wiki.nginx.org/3rdPartyModules
访问 http://labs.frickle.com/nginx_ngx_cache_purge/查看具体配置方式
引用
#### proxy_cache_path 指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中。缓存的文件名和key为代理URL的MD5 码。levels参数指定缓存的子目录数,所有活动的key和元数据存储在共享的内存区域中,这个区域用keys_zone参数指定,keys_zone指定缓存的名字和共享内存大小,如果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。cache manager进程控制磁盘的缓存大小,在max_size参数中定义,超过其大小后最少使用数据将被删除。
proxy_cache_path /www/ng_cache levels=1:2 keys_zone=tmp_cache:1000m inactive=1d max_size=10000m;
proxy_cache_path /www/ng_cache levels=1:2 keys_zone=tmp_cache:1000m inactive=1d max_size=10000m;
关于安装的文章太多,不重复。
缓存的特点:
md5值分段截取为文件夹
1,2层级的目录是md5值的后面1个字符和2个字符作为文件夹的
有记KEY值和相应的头信息
[root@aslibra nginx]# head d/8a/353329a20615078e7391e2c4d091e8ad
?;AN????O9AN??
?=???
KEY: www.aslibra.com/test/beijing/
HTTP/1.1 200 OK
Server: nginx/0.8.15
Date: Tue, 09 Aug 2011 13:42:40 GMT
Content-Type: text/html; charset=utf-8
Connection: close
X-Powered-By: PHP/5.2.10
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">....
?;AN????O9AN??
?=???
KEY: www.aslibra.com/test/beijing/
HTTP/1.1 200 OK
Server: nginx/0.8.15
Date: Tue, 09 Aug 2011 13:42:40 GMT
Content-Type: text/html; charset=utf-8
Connection: close
X-Powered-By: PHP/5.2.10
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">....
清除缓存的响应:
[root@aslibra nginx-0.8.54]# curl -H "host:www.aslibra.com" 127.0.0.1/purge/test/
<html>
<head><title>Successful purge</title></head>
<body bgcolor="white">
<center><h1>Successful purge</h1>
<br>Key : www.aslibra.com/test/
<br>Path: /Data/cache/nginx/d/8a/353329a20615078e7391e2c4d091e8ad
</center>
<hr><center>nginx/0.8.54</center>
</body>
</html>
[root@aslibra nginx-0.8.54]# curl -H "host:www.aslibra.com" 127.0.0.1/purge/test/
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/0.8.54</center>
</body>
</html>
<html>
<head><title>Successful purge</title></head>
<body bgcolor="white">
<center><h1>Successful purge</h1>
<br>Key : www.aslibra.com/test/
<br>Path: /Data/cache/nginx/d/8a/353329a20615078e7391e2c4d091e8ad
</center>
<hr><center>nginx/0.8.54</center>
</body>
</html>
[root@aslibra nginx-0.8.54]# curl -H "host:www.aslibra.com" 127.0.0.1/purge/test/
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/0.8.54</center>
</body>
</html>
问题示例:
网站有千万个网页文件需要存储,占用空间大约有300-400G,导致问题:
1 小文件太多,备份困难
2 空间增长很难调整
3 前端做缓存,因为object很高,效率很低,squid和lighttpd都不合适
解决方案说明:
1 nginx+memcached接口
Nginx有一个模块是可以读取memcached的数据的,可以把网页文件内容保存到memcached里面,如果数据无效,则proxy到后端,后端服务器更新此数据
2 memcachedb接口
memcachedb是新浪的一个开源项目,用硬盘作为存储空间,用的是Berkeley DB的存储引擎,memcached的协议。
有memcached的方便性,同时有高效的读写性能,没有内存作为存储空间的限制,数据永久保留,同时使用局域网的机器就可以处理并且很容易共享,不限制为本地文件,有自动的备份机制。
3 php程序管理存储
php处理memcached很容易,和前端约定相应的key即可
4 计划任务处理更新
由于memcachedb是永久保存,前端无法判断是否过期,所以需要自己制定策略删除过期的网页,以便前端获取不到而自动更新
5 magent作为memcachedb的代理接口,解决备份问题
memcachedb有备份方法,我碰到过出现无法同步的情况,magent也可以帮助解决此问题,它是为memcached设计的,但由于memcachedb使用memcached协议,所以也同样适用
解决方案配置示例:
假设www.aslibra.com/article/xxx 地址需要使用此方案,那就可以用服务器A(2)和B(3)作为memcachedb服务,可以在A(2)上跑magent,C(4)服务器是后端服务器,负责存入memcachedb数据
前端Nginx配置判断:
定义了memcachedb的upstream,有一个是backup标识的
/article/的请求会先查询memcachedb,找不到再发送到后端服务器
注意 proxy_set_header memcached_key $memcached_key 这句,可以保持key值的一致性
对于中文出现在地址的情况很实用,后端使用$_SERVER['REQUEST_URI'] 会和 $uri 不一致
A和B缓存服务器:
如果配置主从,那可以启用magent:
C服务器配置rewrite(lighttpd):
PHP代码参考:
删除文件:
如果有记录日志(可以是web服务器日志或者php记录的日志),可以根据保存的日志处理
需要删除的 $m->delete($key) 即可
备份请参考memcachedb的操作指南。
此解决方案适合memcached的存储方式,况且不用处理过期的问题,php可以解决过期时间
文章更新请关注本文更新:
http://www.aslibra.com/blog/post/memcachedb_cache_solution.php
参考资料:
1 Berkeley DB
2 memcachedb
3 magent
4 NginxModules
5 嵌入式数据库系统Berkeley DB
6 memcached和magent的安装
7 memcachedb的安装
网站有千万个网页文件需要存储,占用空间大约有300-400G,导致问题:
1 小文件太多,备份困难
2 空间增长很难调整
3 前端做缓存,因为object很高,效率很低,squid和lighttpd都不合适
解决方案说明:
1 nginx+memcached接口
Nginx有一个模块是可以读取memcached的数据的,可以把网页文件内容保存到memcached里面,如果数据无效,则proxy到后端,后端服务器更新此数据
2 memcachedb接口
memcachedb是新浪的一个开源项目,用硬盘作为存储空间,用的是Berkeley DB的存储引擎,memcached的协议。
有memcached的方便性,同时有高效的读写性能,没有内存作为存储空间的限制,数据永久保留,同时使用局域网的机器就可以处理并且很容易共享,不限制为本地文件,有自动的备份机制。
3 php程序管理存储
php处理memcached很容易,和前端约定相应的key即可
4 计划任务处理更新
由于memcachedb是永久保存,前端无法判断是否过期,所以需要自己制定策略删除过期的网页,以便前端获取不到而自动更新
5 magent作为memcachedb的代理接口,解决备份问题
memcachedb有备份方法,我碰到过出现无法同步的情况,magent也可以帮助解决此问题,它是为memcached设计的,但由于memcachedb使用memcached协议,所以也同样适用
解决方案配置示例:
假设www.aslibra.com/article/xxx 地址需要使用此方案,那就可以用服务器A(2)和B(3)作为memcachedb服务,可以在A(2)上跑magent,C(4)服务器是后端服务器,负责存入memcachedb数据
前端Nginx配置判断:
upstream backend {
server 192.168.1.4;
}
upstream memcachedb {
server 192.168.1.2:11212;
server 192.168.1.3:11212 backup;
}
server {
server_name www.aslibra.com;
location / {
proxy_pass http://backend;
}
location ~* ^/article/ {
set $memcached_key $host$uri;
default_type text/html;
memcached_pass memcachedb;
error_page 404 = /fallback;
}
location = /fallback {
internal;
proxy_set_header memcached_key $memcached_key;
proxy_pass http://backend;
}
}
server 192.168.1.4;
}
upstream memcachedb {
server 192.168.1.2:11212;
server 192.168.1.3:11212 backup;
}
server {
server_name www.aslibra.com;
location / {
proxy_pass http://backend;
}
location ~* ^/article/ {
set $memcached_key $host$uri;
default_type text/html;
memcached_pass memcachedb;
error_page 404 = /fallback;
}
location = /fallback {
internal;
proxy_set_header memcached_key $memcached_key;
proxy_pass http://backend;
}
}
定义了memcachedb的upstream,有一个是backup标识的
/article/的请求会先查询memcachedb,找不到再发送到后端服务器
注意 proxy_set_header memcached_key $memcached_key 这句,可以保持key值的一致性
对于中文出现在地址的情况很实用,后端使用$_SERVER['REQUEST_URI'] 会和 $uri 不一致
A和B缓存服务器:
memcachedb -p 11212 -l 0.0.0.0 -u root -d -r -N -H /data/aslibra.com/article/
如果配置主从,那可以启用magent:
magent -s 192.168.1.2:11212 -b 192.168.1.3:11212
#默认监听 0.0.0.0:11211,提供给PHP使用
#比如这里是在192.168.1.2上运行
#默认监听 0.0.0.0:11211,提供给PHP使用
#比如这里是在192.168.1.2上运行
C服务器配置rewrite(lighttpd):
$HTTP["host"] == "www.aslibra.com" {
server.document-root = "/data/www.aslibra.com/"
url.rewrite-once = (
"^/article" => "/php/cache.php"
)
}
server.document-root = "/data/www.aslibra.com/"
url.rewrite-once = (
"^/article" => "/php/cache.php"
)
}
PHP代码参考:
<?
//do sth to build html
echo $html;
//如果有传递memcached_key值就把结果存入memcachedb
//不需要设置缓存时间,因为没有用 :)
//有需要更新,那就记录一下日志
if($_SERVER['HTTP_MEMCACHED_KEY']){
$m = new Memcache;
if($m->connect('192.168.1.2', 11211) ){
$key = $_SERVER['HTTP_MEMCACHED_KEY'];
$m->set($key, $html);
//有必要就记日志
//log to file...
}
}
?>
//do sth to build html
echo $html;
//如果有传递memcached_key值就把结果存入memcachedb
//不需要设置缓存时间,因为没有用 :)
//有需要更新,那就记录一下日志
if($_SERVER['HTTP_MEMCACHED_KEY']){
$m = new Memcache;
if($m->connect('192.168.1.2', 11211) ){
$key = $_SERVER['HTTP_MEMCACHED_KEY'];
$m->set($key, $html);
//有必要就记日志
//log to file...
}
}
?>
删除文件:
如果有记录日志(可以是web服务器日志或者php记录的日志),可以根据保存的日志处理
需要删除的 $m->delete($key) 即可
备份请参考memcachedb的操作指南。
此解决方案适合memcached的存储方式,况且不用处理过期的问题,php可以解决过期时间
文章更新请关注本文更新:
http://www.aslibra.com/blog/post/memcachedb_cache_solution.php
参考资料:
1 Berkeley DB
2 memcachedb
3 magent
4 NginxModules
5 嵌入式数据库系统Berkeley DB
6 memcached和magent的安装
7 memcachedb的安装
引用
Webbench是有名的网站压力测试工具,它是由Lionbridge公司(http://www.lionbridge.com)开发。它的帮助文件和文档请到:www.webbench.com上查看。
Webbech 能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webBech的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量。webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。
Webbech 能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webBech的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量。webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。
上面是引用的介绍,webbench很简单,下载tar.gz文件后,解压后,make就可以出来了。
测试很简单,就是模拟多少个人同时访问,每个人持续多久,看看可以产生多少个有效连接,以便说明网站的效率。
我最近做了个apache和lighttpd的比较,只是简单的对比,没有做好最优化的配置,所以不算很科学,但也是发现一些问题:
./webbench -c 1000 -t 20 http://hi.baidu.com/hqlulu/
c=1000 20s
apache 58147
lighttp 61487
c=2000 10s
apache 26333
lighttp 30482
c=5000 1s
apache 2844
lighttp 2367
相对而言,apache在处理小文件会有点优势,或者是持续连接比较小的情况会比较好,可能文件比较大的情况就不太好了,lighttpd显得会有优势。相对而言,有人说apache处理php会稳定很多,那其实lighttpd处理静态文件应该是有优势的了。
有人做过对比,我贴一下图片:

坐标分两个:x轴是并发等级,y轴是每秒产生的连接数
估计可以这么理解:并发数不太多的情况下,每个webserver的表现差别不大,但并发数增大,则IIS、lighttpd等的表现则很好,那其实就看自己的网站现在是什么情况了。
今天看了看greengnn的blog,发现两个图很好,转一下:

设计和数据分离

页面制作的蜘蛛网络
(用户,开发者,信息数据。。。)
从图上可以看到,做网页需要考虑的东东很多,好复杂,要做好真没这么容易,大家看图就明白了,懒得说。

设计和数据分离

页面制作的蜘蛛网络
(用户,开发者,信息数据。。。)
从图上可以看到,做网页需要考虑的东东很多,好复杂,要做好真没这么容易,大家看图就明白了,懒得说。



