lighttpd 负载均衡-反向代理+cache浅谈

Lighttpd有硬盘级别的cache-(mod_cache)和内存级别的cache(mod_mem_cache),内存级别的cache是国人的产品,我喜欢用lighttpd就是因为它具有2种选择的cache,像我的实际需求,由于系统存在很多图片,但是容量不大,一般都少于40k,图片,js,CSS等我都喜欢放到内存里面,毕竟磁盘i/o是一个真正的计算机瓶颈制造者,而一些其他资源cache就放到硬盘级别的cache

1) squid和modcache的对比:squid是个功能全面的系统、但效率不高;modcache是功能不多,但效率高的缓存系统;请求数不多的情况下 (<100 req/s),两者差别不大;请求数超过100 req/s,modcache完胜
2) Linux系统的优化也很重要,比如打开最大文件数等等。不一定非要改linux kernel source,参数调优事半功倍
3)如何用尽多核CPU。首先要用多个进程(server.max-workers=4);用Linux的setaffinity系统调用把CPU0空闲出来,再根据服务情况选择是否把缓存加载到内存中;最后就是给足够大的负载了(大部分时候瓶颈在IO上,而不在CPU上)。
其实lighttpd在请求高(>1k req/s)的情况下,CPU也不忙,比Squid好太多;也就是说lighttpd不属于CPU计算量大的程序,而大部分时间在处理、等待网络IO,磁盘IO
4) keepalive 尽量关闭。lighttpd 1.4.23新加的server.defer-accept选项不错,可设置成server.defer-accept=30
5) 小文件缓存到内存;大文件放硬盘,硬盘没必要用raid
6) 加载 mod_status,设置 status.statistics-url = "/lighttpd_status"。然后访问http://ip/lighttpd_status 可看到modcache 的缓存命中率
7) modcache 使用两级hashmap管理内存缓存,效率不错,支持上千万的项目快速存取
8) 单进程和多线程。单进程适合现代的硬件和软件;多线程的弱势在于锁:一般多线程使用多个全局锁,当请求数量超过一定值后,全局锁会导致性能急剧下降;多线程的扩展性比单进程差不少。
多线程适合不同线程做不同工作,或者请求数量可控、且不高的情况

 

以下是关键配置

#模块的加载-------------------------------------------------------

server.modules              = (   

                              "mod_compress",
                                "mod_access",
                               "mod_status",
                               "mod_mem_cache",  #memcache 内存级的cache
                               "mod_cache",           #disk cache 硬盘级别的cache
                               "mod_proxy"

  #模块的排序是有规则的,如果不合理排序,容易产生问题

#硬盘级别cache的设置----------------------------------------

#模块参数说明:http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModCache

#mod_mem_cache作者的最新主页:http://code.google.com/p/lighttpd-improved/

######## disk cache #########
cache.support-queries = "enable" #cache允许查询 
cache.bases = ("/data/cache")   #cache存放的根目录
cache.refresh-pattern = ( #以下是允许cache的文件类型以及cache的有效期,单位:分)
        "\.(?i)(flv)$" => "0 fetchall-for-range-request flv-streaming",
        "\.(?i)(js|css|xml)$" => "240", # update js/css/xml every 4 hours
        "\.(?i)(htm|html|shtml)$" => "30 update-on-refresh", #update html/htm/shtml every 30 minutes and on refresh requests
        "\.(?i)(jpg|bmp|jpeg|gif|png)$" => "2880",
        "\.(?i)(rar|zip|wmv|avi|mp3|ape|rm|mpeg|mpg|wma|asf|rmvb|flv)$" => "0 fetchall-for-range-request",
        "." => "30 update-on-refresh"
)

#内存级别的cache设置-----------------------------------------------

#模块详细参数说明:http://redmine.lighttpd.net/wiki/1/Docs:ModMemCache
######## memory cache ###############
mem-cache.enable = "enable"
mem-cache.filetypes = ("application/x-javascript", "text/css","text/javascript","image/jpeg","image/gif","image/png")    #定义内存cache的文件类型
mem-cache.max-memory = 64                                      #允许使用的最大内存大少,单位:M
mem-cache.max-file-size = 1024                                   #单个文件大小 ,单位:KB
mem-cache.expire-time = 180                                       #过期时间,默认单位:分

#调度目标的web-server列表

proxy.server  = ( "/" =>
        (
                 ( "host" => "192.168.10.1","port" => 80)

                   ( "host" => "192.168.10.2","port" => 80)

                    ( "host" => "192.168.10.3","port" => 80)

)
)

 

结果测试:用iE装了httpwatch后抓包查看,首先第一次访问proxy_cache后,关掉,接着清空本地cookies,再次打开,速度是几何级别的提升,页面一下子刷出来了,查看http_header时,发现如下关键字:

#硬盘cache的命中

(Status-Line) HTTP/1.1 200 OK
Accept-Ranges bytes
Cache-Control max-age=13873
Content-Length 2974
Content-Type application/x-javascript
Date Thu, 22 Jul 2010 11:26:54 GMT
ETag "0f3b8da1939ca1:4aa7"
Expires Thu, 22 Jul 2010 15:18:07 GMT
Last-Modified Sat, 19 Sep 2009 11:10:54 GMT
Server lighttpd/1.4.26
X-Cache HIT        #命中缓存
X-Powered-By ASP.NET

#内存cache的命中

(Status-Line) HTTP/1.1 200 OK
Cache-Control max-age=172721
Content-Length 13952
Content-Location http://192.168.3.120/uploads/userup/2192/myface.jpg #我的proxy_cache地址
Content-Type image/jpeg
Date Thu, 22 Jul 2010 11:19:29 GMT
ETag "22bc68d74227cb1:4e86"
Expires Sat, 24 Jul 2010 11:18:10 GMT
Last-Modified Mon, 19 Jul 2010 13:03:54 GMT
Server lighttpd/1.4.26
X-Cache TO MEMCACHE   #命中内存
X-Powered-By ASP.NET

小结:这只是一般情况下的案例测试,具体需要涉及实际情况,例如php动态文件,媒体文件等的cache,还有图片网站或者视频网站等设置cache内容,过期时间等均要不同设置才能做到最大限度优化,不能一视同仁。

你可能感兴趣的:(lighttpd)