mod_memcompress plugin for lighttpd

Jan 刚发布了令人期待的LINUX AIO支持,我也来凑热闹把我写好的mod_memcompress plugin 奉献给大家;)

mod_memcompress工作方式类似mod_compress, 把浏览器的gzip,deflate请求的内容压缩后放到内存里,下次其它浏览器相同的请求直接从内存里输出结果。

mod_memcompress 的配置参数如下:

  • memcompress.filetype, 设置压缩文件的类型。举例memcompress.filetype = ("text/html", "application/x-javascript", "text/css")
  • memcompress.maxfilesize, memcompress压缩的最大文件大小,单位是Kbytes。缺省是4096
  • memcompress.maxmemory, memcompress缓存占用最大的内存大小,单位是Mbytes。缺省是256
  • memcompress.nocompress-url, PCRE正则表达式。匹配正则表达式的URI将不被处理。
  • memcompress.enable, 打开memcompress的开关。缺省enable
  • memcompress.lruremovenumber,当memcompress用到最大内存时,memcompress从缓存中删除的条目数量。缺省500个。
  • memcompress.compression-level, 压缩级别,是1~9的数字,越大代表压缩率越高,压缩时占用cpu也越多。缺省是Z_DEFAULT_COMPRESSION

当压缩结果存到缓存里是,返回的HTTP头有X-Mem-Hit: to memcompress;当压缩结果从缓存中读取时,返回的HTTP头有X-Mem-Hit: by memcompress。方便判断缓存效果;)

在说说实现细节,挺有意思。memcompress把缓存结果信息hash到131072(2^17)的数组里,然后用数组的prev,next整型变量做lru伪双向链表,lurheader和lruend记录lru链表的头和尾。大家可能奇怪,为什么不用指针去实现双向链表呢。其实第一版的lru是用指针实现,但偶尔会出现指针指到不正确的地方导致Segment Fault。LRU指针不正确是可以在更新LUR表时遍历一次检查,但这样的开销就太大了;换成整型变量做LRU后,不再出现segment fault了。

源代码下载

Keywords: , , ,


2 Responses to “mod_memcompress plugin for lighttpd”  

  1. 1 zend

    怎么编译进去的啊

  2. 2 Q

    修改src下的Makefile.am 和 Makefile.in. 可参考mod_cache patch中对src/Makefile.am 和 src/Makefile.in 改动。

    我的lighttpd src改动比较大,做个clean的patch比较费劲;)

Leave a Reply



天气信息