blog.quehy.com freshmeat squid

What is ModCache

ModCache is a cache accelerator plugin for lighttpd, which works like Squid with similar configuration. However modcache is faster and more effective than Squid because of powerful Lighttpd.

ModCache has following advantages over Squid:

How to use ModCache

ModCache provides following options: Note: make sure that mod_cache is loaded before mod_proxy.

Refresh Patterns

cache.refresh-pattern likes squid's refresh-pattern. cache.refresh-pattern format is "url_pcre_regex" => "minutes options". Note: zero 'minutes' means cache forever and minutes option is mandatory.
Available refresh-pattern options are: ModCache don't cache urls without refresh-pattern rules matched.

How ModCache works

ModCache implements as below: (use http://host/uri as url example)

Step 1: modcache_uri_handler.
   checks cache.domains, cache.refresh-pattern orderly for whether to use cache or not; if OK, then checks file 'cache.bases/host/uri' existness and it's expire time; if OK again, set con->use_cache_file to 1;
Step 2: modcache_docroot_handler.
   If con->use_cache_file was 1, set con->physical.doc_root to cache.bases and con->physical.rel_path to '/host/uri'; otherwise just returns.
Step 3: mod_proxy.
   If con->use_cache_file was 0, mod_proxy will set con->write_cache_file to 1; otherwise mod_proxy just returns.
Step 4: Actual request handle. request handled by mod_staticfile mod_compress or mod_proxy depend on lighttpd configuration.
Step 5: modcache_handle_response.
   If con->write_cache_file was 1, modcache will try to save response content to 'cache.bases/host/uri', some useful response's headers to 'cache.bases/host/uri.cachehd'; otherwise modcache fills current response headers with cached headers.
Step 6: modcache_cleanup.
   If con->write_cache_file was 1 and everything went ok, modcache closes fd of cached file.

Config example for lighttpd 1.4 series

FOR STATIC WEB PAGE SERVER:

server.modules = (
#	....,  other modules 
	"mod_cache", # make sure mod_cache loaded before mod_proxy
	"mod_proxy"
)
cache.support-queries = "enable" #ignore '?' in url
cache.bases = ("/data/cache") #write cached files in /data/cache directory
cache.refresh-pattern = (
	"\.(?i)(flv)$" => "0 fetchall-for-range-request flv-streaming", # to work with mod_flv_streaming for flv files
	"\.(?i)(js|css|xml)$" => "240", # update js/css/xml every 4 hours and on refresh requests
	"\.(?i)(htm|html|shtml)$" => "30", # update html/htm/shtml every 30 minutes and on refresh requests
	"\.(?i)(jpg|bmp|jpeg|gif|png)$" => "2880", # update graphics files every 2 days
	"\.(?i)(rar|zip|wmv|avi|mp3|ape|rm|mpeg|mpg|wma|asf|rmvb|flv)$" => "0 fetchall-for-range-request", # cache media file forever
	"." => "30 update-on-refresh" # default to update every 30 minutes and on refresh requests
)
#mod_proxy setting, config your backend servers here
proxy.server  = ( "/" =>
        (
                ( "host" => "x.x.x.x", "port" => 80 ) # real backend http server ip and port
        )
)
#it's important to enable proxy.worked-with-mod-cache or mod_proxy will not cooperate with modcache
proxy.worked-with-mod-cache = "enable"

FOR BBS AND FORUM SERVER (V1.6.0 SUPPORTED):

server.modules = (
#	....,  other modules 
	"mod_cache", # make sure mod_cache loaded before mod_proxy
	"mod_proxy"
)
cache.support-queries = "enable" #ignore '?' in url
cache.dynamic-mode = "enable"
cache.bases = ("/data/cache") #write cached files in /data/cache directory
cache.refresh-pattern = (
	"\.(?i)(flv)$" => "0 fetchall-for-range-request flv-streaming", # to work with mod_flv_streaming for flv files
	"\.(?i)(js|css|xml)$" => "240", # update js/css/xml every 4 hours and on refresh requests
	"\.(?i)(htm|html|shtml)$" => "30", # update html/htm/shtml every 30 minutes and on refresh requests
	"\.(?i)(jpg|bmp|jpeg|gif|png)$" => "2880", # update graphics files every 2 days
	"\.(?i)(rar|zip|wmv|avi|mp3|ape|rm|mpeg|mpg|wma|asf|rmvb|flv)$" => "0 fetchall-for-range-request", # cache media file forever
	".(?i)php$" => "5", # update php request every 5 minutes
	"." => "30 update-on-refresh" # default to update every 30 minutes and on refresh requests
)
#mod_proxy setting, config your backend servers here
proxy.server  = ( "/" =>
        (
                ( "host" => "x.x.x.x", "port" => 80 ) # real backend http server ip and port
        )
)
proxy.worked-with-mod-cache = "enable"

#cache.programs-ext = (".php") # uncomment this if mod_fastcgi was loaded on this lighttpd server

Config example for lighttpd 1.5 series

FOR STATIC WEB PAGE SERVER:

server.modules = (
#		....,  other modules 
	"mod_cache", # make sure mod_cache loaded before mod_proxy_core
	"mod_proxy_core",
	"mod_proxy_backend_http"
)
cache.support-queries = "enable" #ignore '?' in url
cache.bases = ("/data/cache") #write cached files in /data/cache directory
cache.refresh-pattern = (
	"\.(?i)(flv)$" => "0 fetchall-for-range-request flv-streaming", # to work with mod_flv_streaming for flv files
	"\.(?i)(js|css|xml)$" => "240", # update js/css/xml every 4 hours and on refresh requests
	"\.(?i)(htm|html|shtml)$" => "30", # update html/htm/shtml every 30 minutes and on refresh requests
	"\.(?i)(jpg|bmp|jpeg|gif|png)$" => "2880", # update graphics files every 2 days
	"\.(?i)(rar|zip|wmv|avi|mp3|ape|rm|mpeg|mpg|wma|asf|rmvb|flv)$" => "0 fetchall-for-range-request", # cache media file forever
	"." => "30 update-on-refresh" # default to update every 30 minutes and on refresh requests
)
#mod_proxy_core setting, config your backend servers here
proxy-core.backends = ( "x.x.x.x:80", "y.y.y.y:80")
proxy-core.balancer = "round-robin" # or "sqf" or "carp"
proxy-core.protocol = "http"
#it's important to enable proxy-core.worked-with-modcache or mod_proxy_core will not cooperate with modcache
proxy-core.worked-with-modcache = "enable"

FOR BBS AND FORUM SERVER (V1.6.0 SUPPORTED):

server.modules = (
#		....,  other modules 
	"mod_cache", # make sure mod_cache loaded before mod_proxy_core
	"mod_proxy_core",
	"mod_proxy_backend_http"
)
cache.support-queries = "enable" #ignore '?' in url
cache.dynamic-mode = "enable"
cache.bases = ("/data/cache") #write cached files in /data/cache directory
cache.refresh-pattern = (
	"\.(?i)(flv)$" => "0 fetchall-for-range-request flv-streaming", # to work with mod_flv_streaming for flv files
	"\.(?i)(js|css|xml)$" => "240", # update js/css/xml every 4 hours and on refresh requests
	"\.(?i)(htm|html|shtml)$" => "30", # update html/htm/shtml every 30 minutes and on refresh requests
	"\.(?i)(jpg|bmp|jpeg|gif|png)$" => "2880", # update graphics files every 2 days
	"\.(?i)(rar|zip|wmv|avi|mp3|ape|rm|mpeg|mpg|wma|asf|rmvb|flv)$" => "0 fetchall-for-range-request", # cache media file forever
	".(?i)php$" => "5", # update php request every 5 minutes
	"." => "30 update-on-refresh" # default to update every 30 minutes and on refresh requests
)
#mod_proxy_core setting, config your backend servers here
proxy-core.backends = ( "x.x.x.x:80", "y.y.y.y:80")
proxy-core.balancer = "round-robin" # or "sqf" or "carp"
proxy-core.protocol = "http"
#it's important to enable proxy-core.worked-with-modcache or mod_proxy_core will not cooperate with modcache
proxy-core.worked-with-modcache = "enable"

#cache.programs-ext = (".php") # uncomment this if mod_proxy_backend_fastcgi was loaded on this lighttpd server

Downloads

Stable version 1.8.0, released on Jun 06, 2009

Changelog

Stable Version 1.8.0, 06/06/2009

Stable Version 1.7.0, 04/30/2009

Stable Version 1.6.3, 02/18/2009

Stable Version 1.6.2, 02/17/2009

Stable Version 1.6.0/1.6.1, 09/01/2008

Stable Version 1.4.4, 04/09/2008

Stable Version 1.4.2/1.4.3, 02/29/2008

Stable Version 1.4.1, 09/23/2007

Stable Version 1.4, 05/03/2007

Stable Version 1.3.2, 02/08/2007

Stable Version 1.3.1, 01/29/2007

Stable Version 1.3, 01/23/2007

Stable Version 1.2, 11/28/2006

Stable Version 1.1, 11/17/2006

Stable Version 1.0, 10/27/2006

TODO

Discussion Group

Please visit ModCache group hosted on google-groups. Feedback are welcomed!

ModCache released under BSD License, Copyright (c) 2006, 2009 QUE Hongyu