对于网站来说,琐碎文件是一个很鸡肋的问题。太多过小文件的管理总有这样那样的问题,特别是当文件数量到达临界时,甚至作一条ls或者rm都无法正常反应。而且正常情况下琐碎文件都会主动缓存,花费太多资源去实现意义也不大。
之前曾经通过nginx的memcache扩展,配合TokyoTyrant Server(每次都觉得很别嘴)这个即支持memcache协议,又可以持久化的Key-Value实现过琐碎文件的管理,但限于Memcache无法逾越的1M鸿沟,只能保存些小文件。
这些天看到一个Nginx第三方插件 HttpRedis, 本身仅仅只是计划用它来做一些短域名跳转之类的应用,忽然觉得Redis没有内容主体的限制,而且性能优良,完全可以用作琐碎文件的下载。
首先下载nginx——不知不觉nginx已经有了正式的1.0以上的版本了!
wget http://www.nginx.org/download/nginx-1.0.10.tar.gz
下载 http_redis:
wget http://people.freebsd.org/~osa/ngx_http_redis-0.3.5.tar.gz
开始编译,没什么复杂的:
tar vzxf nginx-1.0.10.tar.gz
tar vzxf ngx_http_redis-0.3.5.tar.gz
cd nginx-1.0.10
./configure –user=www –group=www –prefix=/app/nginx –add-module=../ngx_http_redis-0.3.5
make -j4 && make install //部分CPU无法通过编译,还是乖乖的make && make install
修改nginx的配置文件:
在http{}之中加入:
server {
listen 80;
server_name www.test.com;
location / {
set $redis_key CACHE_$request_uri;
redis_pass localhost:6379;
default_type text/html;
}
}
安装redis,还是老一套:
apt-get install redis-serve
/etc/init.d/redis-server start
比如你现在需要通过http://www.test.com/a.html访问一个页面,则可以直接通过下面的方法在redis中塞入一个值,依次类推:
redis-cli
redis > set CACHE_a.html “Hello World!”
OK
redis > set CACHE_/b/a.html “Hello World!”
OK
调试无误后就可以使用程序端直接向redis中写入数据了。
当然,也可以通过设置不同的“default_type”存放图片或者其他类型的文件。 由于此扩展支持redis连接池,而且redis本身也支持master-slaver数据同步,完全可以实现redis端的负载均衡(考虑到redis的性能,我觉得意义不大,除非为了热备份)。需要注意的是Redis是内存数据库,尽管它有定时将数据回写磁盘的机制,但如果不启用vm的话,内存是一个硬性的限制。