当前位置 博文首页 > leirainy的专栏:高负载高并发网站架构分析

    leirainy的专栏:高负载高并发网站架构分析

    作者:[db:作者] 时间:2021-08-13 22:12

    由于自己正在做一个高性能大用户量的论坛程序,对高性能高并发服务器架构比较感兴趣,于是在网上收集了不少这方面的资料和大家分享。希望能和大家交流
    msn: defender_ios@hotmail.com
    ———————————————————————————————————————
    ? 初创网站与开源软件 6
    ? 谈谈大型高负载网站服务器的优化心得! 8
    ? Lighttpd+Squid+Apache搭建高效率Web服务器 9
    ? 浏览量比较大的网站应该从哪几个方面入手? 17
    ? 用负载均衡技术建设高负载站点 20
    ? 大型网站的架构设计问题 25
    ? 开源平台的高并发集群思考 26
    ? 大型、高负载网站架构和应用初探 时间:30-45分钟 27
    ? 说说大型高并发高负载网站的系统架构 28
    ? mixi技术架构 51
    mixi.jp:使用开源软件搭建的可扩展SNS网站 51
    总概关键点: 51
    1,Mysql 切分,采用Innodb运行 52
    2,动态Cache 服务器 -- 52
    美国Facebok.com,中国Yeejee.com,日本mixi.jp均采用开源分布式缓存服务器Memcache 52
    3,图片缓存和加 52
    ? memcached+squid+apache deflate解决网站大访问量问题 52
    ? FeedBurner:基于MySQL和JAVA的可扩展Web应用 53
    ? YouTube 的架构扩展 55
    ? 了解一下 Technorati 的后台数据库架构 57
    ? Myspace架构历程 58
    ? eBay 的数据量 64
    ? eBay 的应用服务器规模 67
    ? eBay 的数据库分布扩展架构 68
    ? 从LiveJournal后台发展看大规模网站性能优化方法 70
    一、LiveJournal发展历程 70
    二、LiveJournal架构现状概况 70
    三、从LiveJournal发展中学习 71
    1、一台服务器 71
    2、两台服务器 72
    3、四台服务器 73
    4、五台服务器 73
    5、更多服务器 74
    6、现在我们在哪里: 75
    7、现在我们在哪里 78
    8、现在我们在哪里 79
    9、缓存 80
    10、Web访问负载均衡 80
    11、MogileFS 81
    ? Craigslist 的数据库架构 81
    ? Second Life 的数据拾零 82
    ? eBay架构的思想金矿 84
    ? 一天十亿次的访问-eBay架构(一) 85
    ? 七种缓存使用武器 为网站应用和访问加速发布时间: 92
    ? 可缓存的CMS系统设计 93
    ? 开发大型高负载类网站应用的几个要点[nightsailer] 105
    ? Memcached和Lucene笔记 110
    ? 使用开源软件,设计高性能可扩展网站 110
    ? 面向高负载的架构Lighttpd+PHP(FastCGI)+Memcached+Squid 113
    ? 思考高并发高负载网站的系统架构 113
    ? "我在SOHU这几年做的一些门户级别的程序系统(C/C++开发)" 115
    ? 中国顶级门户网站架构分析1 116
    ? 中国顶级门户网站架构分析 2 118
    ? 服务器的大用户量的承载方案 120
    ? YouTube Scalability Talk 121
    ? High Performance Web Sites by Nate Koechley 123
    One dozen rules for faster pages 123
    Why talk about performance? 123
    Case Studies 124
    Conclusion 124
    ? Rules for High Performance Web Sites 124
    ? 对于应用高并发,DB千万级数量该如何设计系统哪? 125
    ? 高性能服务器设计 130
    ? 优势与应用:再谈CDN镜像加速技术 131
    ? 除了程序设计优化,zend+ eacc(memcached)外,有什么办法能提高服务器的负载能力呢? 135
    ? 如何规划您的大型JAVA多并发服务器程序 139
    ? 如何架构一个“Just so so”的网站? 148
    ? 最便宜的高负载网站架构 152
    ? 负载均衡技术全攻略 154
    ? 海量数据处理分析 164
    ? 一个很有意义的SQL的优化过程(一个电子化支局中的大数据量的统计SQL) 166
    ? 如何优化大数据量模糊查询(架构,数据库设置,SQL..) 168
    ? 求助:海量数据处理方法 169
    # re: 求助:海量数据处理方法 回复 更多评论 169
    ? 海量数据库查询方略 169
    ? SQL Server 2005对海量数据处理 170
    ? 分表处理设计思想和实现 174
    ? Linux系统高负载 MySQL数据库彻底优化(1) 179
    ? 大型数据库的设计与编程技巧 本人最近开发一个访问统计系统,日志非常的大,都保存在数据库里面。 我现在按照常规的设计方法对表进行设计,已经出现了查询非常缓慢地情形。 大家对于这种情况如何来设计数据库呢?把一个表分成多个表么?那么查询和插入数据库又有什么技巧呢? 谢谢,村里面的兄弟们! 183
    ? 方案探讨,关于工程中数据库的问题. [已结贴] 184
    ? web软件设计时考虑你的性能解决方案 190
    ? 大型Java Web系统服务器选型问题探讨 193
    ? 高并发高流量网站架构 210
    1.1 互联网的发展 210
    1.2 互联网网站建设的新趋势 210
    1.3 新浪播客的简介 211
    2.1 镜像网站技术 211
    2.2 CDN内容分发网络 213
    2.3 应用层分布式设计 214
    2.4 网络层架构小结 214
    3.1 第四层交换简介 214
    3.2 硬件实现 215
    3.3 软件实现 215
    ? 网站架构的高性能和可扩展性 233
    ? 资料收集:高并发 高性能 高扩展性 Web 2.0 站点架构设计及优化策略 243
    ? CommunityServer性能问题浅析 250
    鸡肋式的多站点支持 250
    内容数据的集中式存储 250
    过于依赖缓存 250
    CCS的雪上加霜 250
    如何解决? 251
    ? Digg PHP's Scalability and Performance 251
    ? YouTube Architecture 253
    Information Sources 254
    Platform 254
    What's Inside? 254
    The Stats 254
    Recipe for handling rapid growth 255
    Web Servers 255
    Video Serving 256
    Serving Video Key Points 257
    Serving Thumbnails 257
    Databases 258
    Data Center Strategy 259
    Lessons Learned 260
    1. Jesse ? Comments (78) ? April 10th 261
    Library 266
    Friendster Architecture 273
    Information Sources 274
    Platform 274
    What's Inside? 274
    Lessons Learned 274
    ? Feedblendr Architecture - Using EC2 to Scale 275
    The Platform 276
    The Stats 276
    The Architecture 276
    Lesson Learned 277
    Related Articles 278
    Comments 279
    Re: Feedblendr Architecture - Using EC2 to Scale 279
    Re: Feedblendr Architecture - Using EC2 to Scale 279
    Re: Feedblendr Architecture - Using EC2 to Scale 280
    ? PlentyOfFish Architecture 281
    Information Sources 282
    The Platform 282
    The Stats 282
    What's Inside 283
    Lessons Learned 286
    ? Wikimedia architecture 288
    Information Sources 288
    Platform 288
    The Stats 289
    The Architecture 289
    Lessons Learned 291
    ? Scaling Early Stage Startups 292
    Information Sources 293
    The Platform 293
    The Architecture 293
    Lessons Learned 294
    ? Database parallelism choices greatly impact scalability 295
    ? Introduction to Distributed System Design 297
    Table of Contents 297
    Audience and Pre-Requisites 298
    The Basics 298
    So How Is It Done? 301
    Remote Procedure Calls 305
    Some Distributed Design Principles 307
    Exercises 308
    References 309
    ? Flickr Architecture 309
    Information Sources 309
    Platform 310
    The Stats 310
    The Architecture 311
    Lessons Learned 316
    Comments 318
    How to store images? 318
    RE: How to store images? 318
    ? Amazon Architecture 319
    Information Sources 319
    Platform 320
    The Stats 320
    The Architecture 320
    Lessons Learned 324
    Comments 329
    Jeff.. Bazos? 329
    Werner Vogels, the CTO of 329
    Re: Amazon Architecture 330
    Re: Amazon Architecture 330
    Re: Amazon Architecture 330
    It's WSDL 330
    Re: It's WSDL 331
    Re: Amazon Architecture 331
    ? Scaling Twitter: Making Twitter 10000 Percent Faster 331
    Information Sources 332
    The Platform 332
    The Stats 333
    The Architecture 333
    Lessons Learned 336
    Related Articles 337
    Comments 338
    Re: Scaling Twitter: Making Twitter 10000 Percent Faster 338
    Re: Scaling Twitter: Making Twitter 10000 Percent Faster 338
    Re: Scaling Twitter: Making Twitter 10000 Percent Faster 338
    Re: Scaling Twitter: Making Twitter 10000 Percent Faster 339
    Re: Scaling Twitter: Making Twitter 10000 Percent Faster 339
    Re: Scaling Twitter: Making Twitter 10000 Percent Faster 339
    They could have been 20% better? 340
    Re: Scaling Twitter: Making Twitter 10000 Percent Faster 340
    Re: Scaling Twitter: Making Twitter 10000 Percent Faster 341
    ? Google Architecture 341
    Information Sources 342
    Platform 342
    What's Inside? 342
    The Stats 342
    The Stack 343
    Reliable Storage Mechanism with GFS (Google File System) 343
    Do Something With the Data Using MapReduce 344
    Storing Structured Data in BigTable 346
    Hardware 347
    Misc 347
    Future Directions for Google 348
    Lessons Learned 348

    不管怎么样,先要找出瓶颈在哪个部分:是CPU负荷太高(经常100%),还是内存不够用(大量使用虚拟内存),还是磁盘I/O性能跟不上(硬盘指示灯狂闪)?这几个都是可以通过升级硬件来解决或者改善的(使用更高等级的CPU,更快速和更大容量的内存,配置硬件磁盘阵列并使用更多数量的高速SCSI硬盘),但这需要较大的投入。
    软件方面,如果使用了更大容量的内存和改善的I/O性能,已经能够大幅提高数据库的运行效率,还可以配置查询缓存和进一步优化数据库结构和查询语句,就能让数据库的性能再进一大步。
    如果在服务器硬件投入上有困难,那就尽量生成静态页面。
    作 者: BBSADM
    标 题: 目前的web系统架构
    时 间: Fri Apr 6 20:15:56 2007
    点 击: 100

    ------ nginx ---------
    | | |
    Squid fastcgi proxy
    | (逐步迁移) |
    静态文件 Njuwebbsd
    (逐步迁移到fastcgi上)

    最大好处是静态文件加速。
    以后准备把帖子内容也静态化,实现最低负荷

    而且用 nginx做前台便于负载均衡,测试机可以拿来做静态文件的负载均衡
    ? 初创网站与开源软件
    前面有一篇文章中提到过开源软件,不过主要是在系统运维的角度去讲的,主要分析一些系统级的开源软件(例如bind,memcached),这里我们讨论的是用于搭建初创网站应用的开源软件(例如phpbb,phparticle),运行在Linux,MySQL,Apache,PHP,Java等下面。
    创业期的网站往往采用比较简单的系统架构,或者是直接使用比较成熟的开源软件。使用开源软件的好处是搭建速度快,基本不需要开发,买个空间域名,下个软件一搭建,用个半天就搞定了,一个崭新的网站就开张了,在前期可以极大程度的节约时间成本和开发成本。
    当然使用开源软件搭建应用也存在一些局限性,这是我们要重点研究的,而研究的目的就是如何在开源软件选型时以及接下来的维护过程中尽量避免。
    一方面是开源软件一般只有在比较成熟的领域才有,如果是一些创新型的项目很难找到合适的开源软件,这个时候没什么好的解决办法,如果非要用开源的话一般会找一个最相似的改一下。实际上目前开源的项目也比较多了,在sf.net上可以找到各种各样的开源项目。选型的时候尽量应该选取一个程序架构比较简单的,不一定越简单越好,但一定要简单,一目了然,别用什么太高级的特性,互联网应用项目不需要太复杂的框架。原因有两个,一个是框架复杂无非是为了实现更好的可扩展性和更清晰的层次,而我们正在做的互联网应用范围一般会比开源软件设计时所考虑的范围小的多,所以有的应用会显得设计过度,另外追求完美的层次划分导致的太复杂的继承派生关系也会影响到整个系统维护的工作量。建议应用只需要包含三个层就可以了,数据(实体)层,业务逻辑层,表现层。太复杂的设计容易降低开发效率,提高维护成本,在出现性能问题或者突发事件的时候也不容易找到原因。
    另外一个问题是开源软件的后期维护和继续开发可能会存在问题,这一点不是绝对的,取决于开源软件的架构是否清晰合理,扩展性好,如果是较小的改动可能一般不会存在什么问题,例如添加一项用户属性或者文章属性,但有些需求可能就不是很容易实现了。例如网站发展到一定阶段后可能会考虑扩展产品线,原来只提供一个论坛加上cms,现在要再加上商城,那用户系统就会有问题,如何解决这个问题已经不仅仅是改一下论坛或者cms就可以解决了,这个时候我们需要上升到更高的层次来考虑问题,是否需要建立针对整个网站的用户认证系统,实现单点登录,用户可以在产品间无缝切换而且保持登录状态。由于网站初始的用户数据可能大部分都存放在论坛里,这个时候我们需要把用户数据独立出来就会碰到麻烦,如何既能把用户数据独立出来又不影响论坛原有系统的继续运行会是件很头痛的事情。经过一段时间的运行,除非是特别好的设计以及比较好的维护,一般都会在论坛里存在各种各样乱七八糟的对用户信息的调用,而且是直接针对数据库的,这样如果要将用户数据移走的话要修改代码的工作量将不容忽视,而另外一个解决办法是复制一份用户数据出来,以新的用户数据库为主,论坛里的用户数据通过同步或异步的机制实现同步。最好的解决办法就是在选型时选一个数据层封装的比较好的,sql代码不要到处飞的软件,然后在维护的时候保持系统原有的优良风格,把所有涉及到数据库的操作都放到数据层或者实体层里,这样无论对数据进行什么扩展,代码修改起来都比较方便,基本不会对上层的代码产生影响。
    网站访问速度问题对初创网站来说一般考虑的比较少,买个空间或者托管服务器,搭建好应用后基本上就开始运转了,只有到真正面临极大的速度访问瓶颈后才会真正对这个问题产生重视。实际上在从网站的开始阶段开始,速度问题就会一直存在,并且会随着网站的发展也不断演进。一个网站最基本的要求,就是有比较快的访问速度,没有速度,再好的内容或服务也出不来。所以,访问速度在网站初创的时候就需要考虑,无论是采用开源软件还是自己开发都需要注意,数据层尽量能够正确,高效的使用SQL。SQL包含的语法比较复杂,实现同样一个效果如果考虑到应用层的的不同实现方法,可能有好几种方法,但里面只有一种是最高效的,而通常情况下,高效的SQL一般是那个最简单的SQL。在初期这个问题可能不是特别明显,当访问量大起来以后,这个可能成为最主要的性能瓶颈,各种杂乱无章的SQL会让人看的疯掉。当然前期没注意的话后期也有解决办法,只不过可能不会解决的特别彻底,但还是要吧非常有效的提升性能。看MySQL的SlowQuery Log是一个最为简便的方法,把执行时间超过1秒的查询记录下来,然后分析,把该加的索引加上,该简单的SQL简化。另外也可以通过Showprocesslist查看当前数据库服务器的死锁进程,从而锁定导致问题的SQL语句。另外在数据库配置文件上可以做一些优化,也可以很好的提升性能,这些文章在网站也比较多,这里就不展开。
    这些工作都做了以后,下面数据库如果再出现性能问题就需要考虑多台服务器了,一台服务器已经解决不了问题了,我以前的文章中也提到过,这里也不再展开。
    其它解决速度问题的办法就不仅仅是在应用里面就可以实现的了,需要从更高的高度去设计系统,考虑到服务器,网络的架构,以及各种系统级应用软件的配合,这里也不再展开。
    良好设计并实现的应用+中间件+良好的分布式设计的数据库+良好的系统配置+良好的服务器/网络结构,就可以支撑起一个较大规模的网站了,加上前面的几篇文章,一个小网站发展到大网站的过程基本上就齐了。这个过程会是一个充满艰辛和乐趣的过程,也是一个可以逐渐过渡的过程,主动出击,提前考虑,减少救火可以让这个过程轻松一些。

    ? 谈谈大型高负载网站服务器的优化心得!
    因为工作的关系,我做过几个大型网站(书库、证券)的相关优化工作,一般是在世界排行1000-4000以内的~~
    这些网站使用的程序各不一样,配置也不尽相同,但是它们有一个共同的特点,就是使用的是FREEBSD系统,高配置高负载,PV值非常高,都是需要用两台以上独立主机来支持的网站~
    我在优化及跟踪的过程中,开始效果也差强人意,也不太理想,后来通过阅读大量资料才慢慢理清了一些思路,写出来希望给大家有所帮助。
    WEB服务器配置是DUAL XEON 2.4G以上,2G内存以上,SCSI硬盘一块以上,FREEBSD 5.X以上~~
    数据库服务器与WEB服务器类似~~
    书库程序是使用的jieqi的,论坛是使用的Discuz!的
    apache 2.x + php 4.x + mysql 4.0.x + zend + 100M光纤独享带宽

    1、一定要重新编译内核,根据自己对内核认识的程度和服务器的具体配置来优化,记住打开SMP,也可以使用ULE调度。
    2、要优化系统的值,一般是添加入/etc/sysctl.conf里面,要加大内核文件并发数量及其他优化等值。
    3、APACHE 2使用perwork工作模式就可以了,我试过worker模式,实在是差强人意呀。修改httpd.conf里面的值,加大并发数量和关闭不需要的模块。因为apache非常消耗内存,尽量轻装上阵~~ 可以适当的使用长连接。关闭日志。
    4、PHP编译的时候,注意要尽量以实用为目的加入参数,没有用到的坚决不加,以免浪费系统资源。
    5、ZEND要使用较小的优化等级,15就足够了,1023级别只会加重服务器负载~
    6、MYSQL要尽量少使用长连接,限制为2-3秒即可~
    7、要全部采用手工编译方式,不要用ports安装,因为它会带上很多你不需要的模块,切记。
    8、对于这类高负载高在线人数的大站,所有优化的思路就是把尽可能多的系统资源,提供给WEB和MYSQL服务,并且让这些服务单个进程可以占用尽可能少的系统资源。如果系统一开始大量使用SWAP,对于这些服务器来说,服务器状态将会极剧恶化。
    9、长时间观察跟踪调试,有什么问题尽快解决~~

    就想到这些东东,欢迎大家补充~~

    梦飞
    http://onlinecq.com
    2006/4/25
    P.S. 补充我的几点优化:
    1、编译Apache PHP MySQL时使用GCC参数传递对特定CPU进行优化;
    2、如果网站小文件很多,可以考虑使用reiserfs磁盘系统,提升读写性能;
    3、如不需要 .htaccess ,则将 <Files .htaccess> 设置为 None
    对于apache服务器繁忙,加大内存可以解决不少问题。
    纯交互站点,mysql性能会是一个瓶颈。需要长期跟踪更改参数。
    ? Lighttpd+Squid+Apache搭建高效率Web服务器
    davies 发表于 2006-9-9 01:06 | 分类: Tech :: Web ::


    架构原理
    Apache通常是开源界的首选Web服务器,因为它的强大和可靠,已经具有了品牌效应,可以适用于绝大部分的应用场合。但是它的强大有时候却显得笨重,配置文件得让人望而生畏,高并发情况下效率不太高。而轻量级的Web服务器Lighttpd却是后起之秀,其静态文件的响应能力远高于Apache,据说是Apache的2-3倍。Lighttpd的高性能和易用性,足以打动我们,在它能够胜任的领域,尽量用它。Lighttpd对PHP的支持也很好,还可以通过Fastcgi方式支持其他的语言,比如Python。
    毕竟Lighttpd是轻量级的服务器,功能上不能跟Apache比,某些应用无法胜任。比如Lighttpd还不支持缓存,而现在的绝大部分站点都是用程序生成动态内容,没有缓存的话即使程序的效率再高也很难满足大访问量的需求,而且让程序不停的去做同一件事情也实在没有意义。首先,Web程序是需要做缓存处理的,即把反复使用的数据做缓存。即使这样也还不够,单单是启动Web处理程序的代价就不少,缓存最后生成的静态页面是必不可少的。而做这个是 Squid的强项,它本是做代理的,支持高效的缓存,可以用来给站点做反向代理加速。把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容,而Web应用程序只需要适当地设置页面实效时间即可。
    即使是大部分内容动态生成的网站,仍免不了会有一些静态元素,比如图片、JS脚本、CSS等等,将Squid放在Apache或者Lighttp前端后,反而会使性能下降,毕竟处理HTTP请求是Web服务器的强项。而且已经存在于文件系统中的静态内容再在Squid中缓存一下,浪费内存和硬盘空间。因此可以考虑将Lighttpd再放在Squid的前面,构成 Lighttpd+Squid+Apache的一条处理链,Lighttpd在最前面,专门用来处理静态内容的请求,把动态内容请求通过proxy模块转发给Squid,如果Squid中有该请求的内容且没有过期,则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中Web程序来处理。经过Lighttpd和Squid的两级过滤,Apache需要处理的请求将大大减少,减少了Web应用程序的压力。同时这样的构架,便于把不同的处理分散到多台计算机上进行,由Lighttpd在前面统一把关。
    在这种架构下,每一级都是可以进行单独优化的,比如Lighttpd可以采用异步IO方式,Squid可以启用内存来缓存,Apache可以启用MPM 等,并且每一级都可以使用多台机器来均衡负载,伸缩性很好。
    实例讲解
    下面以daviesliu.net和rainbud.net域下面的几个站点为例来介绍一下此方案的具体做法。daviesliu.net域下有几个用 mod_python实现的blog站点,几个php的站点,一个mod_python的小程序,以后可能还会架设几个PHP和Django的站点。而服务器非常弱,CPU为Celeron 500,内存为PC 100 384M,因此比较关注Web服务器的效率。这几个站点都是采用虚拟主机方式,开在同一台机器的同一个端口上。
    Lighttpd服务于80端口,Squid运行在3128端口,Apache运行在81端口。
    Lighttpd的配置
    多个域名采用/var/www/domain/subdomain 的目录结构,用evhost模块配置document-root如下:
    evhost.path-pattern = var.basedir + "/%0/%3/"
    FtpSearch中有Perl脚本,需要启用CGI支持,它是用来做ftp站内搜索的,缓存的意义不大,直接由lighttpd的mod_cgi处理:
    $HTTP["url"] =~ "^/cgi-bin/" { # only allow cgi's in this directory
    dir-listing.activate = "disable" # disable directory listings
    cgi.assign = ( ".pl" => "/usr/bin/perl", ".cgi" => "/usr/bin/perl" )
    }
    bbs使用的是phpBB,访问量不大,可以放在lighttpd(fastcgi)或者apache(mod_php)下,暂时使用 lighttpd,设置所有.php的页面请求有fastcgi处理:
    fastcgi.server = ( ".php" => ( ( "host" => "127.0.0.1", "port"=> 1026, "bin-path" => "/usr/bin/php-cgi" ) ) )
    blog.daviesliu.net 和 blog.rainbud.net 是用mod_python编写的blogxp程序,所有静态内容都有扩展名,而动态内容没有扩展名。blogxp是用python程序生成XML格式的数据再交由mod_xslt转换成HTML页面,只能放在Apache下运行。该站点采用典型Lighttpd+Squid+Apache方式处理:
    $HTTP["host"] =~ "^blog" {
    $HTTP["url"] !~ "\." {
    proxy.server = ( "" => ( "localhost" => ( "host"=> "127.0.0.1", "port"=> 3128 ) ) ) #3128端口为
    }
    }
    share中有静态页面,也有用mod_python处理的请求,在/cgi/下:
    $HTTP["host"] =~ "^share" {
    proxy.server = (
    "/cgi" => ( "localhost" => ( "host"=> "127.0.0.1", "port"=> 3128 ) )
    )
    }
    Squid的配置
    只允许本地访问:
    http_port 3128
    http_access allow localhost
    http_access deny all
    启用反向代理:
    httpd_accel_host 127.0.0.1
    httpd_accel_port 81 #apache的端口
    httpd_accel_single_host on
    httpd_accel_with_proxy on #启用缓存
    httpd_accel_uses_host_header on #启用虚拟主机支持
    此方向代理支持该主机上的所有域名。
    Apache的配置
    配置/etc/conf.d/apache2,让其加载mod_python、mod_xslt、mod_php模块:
    APACHE2_OPTS="-D PYTHON -D XSLT -D PHP5"
    所有网站的根目录:
    <Directory "/var/www">
    AllowOverride All #允许.htaccess覆盖
    Order allow,deny
    Allow from all
    </Directory>
    基于域名的虚拟主机:
    <VirtualHost *:81>
    ServerName blog.daviesliu.net
    DocumentRoot /var/www/daviesliu.net/blog
    </VirtualHost>
    这里明显没有lighttpd的evhost配置方便。
    blog.daviesliu.net下的.htaccess设置(便于开发,不用重启Apache):
    SetHandler mod_python
    PythonHandler blogxp.publisher
    PythonDebug On
    PythonAutoReload On

    <FilesMatch "\.">
    SetHandler None #静态文件直接由Apache处理
    </FilesMatch>

    <IfModule mod_xslt.c>
    AddType text/xsl .xsl #防止对xsl文件进行转化
    AddOutputFilterByType mod_xslt text/xml
    XSLTCache off
    XSLTProcess on
    </IfModule>
    Header set Pragma "cache"
    Header set Cache-Control "cache"
    在blogxp.publisher里面,还需要设置返回的文档类型和过期时间:
    req.content_type = "text/xml"
    req.headers_out['Expires'] = formatdate( time.time() + 60 * 5 )
    经过这样的配置,所有站点都可以通过80、3128、81三个端口进行正常访问,80端口用作对外的访问,以减少负荷。81端口可以用作开发时的调试,没有缓存的困扰。
    性能测试
    由于时间和精力有限,下面只用ab2做一个并不规范的性能对比测试(每项都测多次取平均),评价指标为每秒钟的请求数。
    测试命令,以测试lighttpd上并发10个请求 scripts/prototype.js 为例:
    ab2 -n 1000 -c 10 http://blog.daviesliu.net:80/scripts/prototype.js
    静态内容:prototype.js (27kB)
    Con Lighttpd(:80) Squid(:3128) Apache(:81)
    1 380 210 240
    10 410 215 240
    100 380 160 230

    可见在静态内容上,Lighttpd表现强劲,而Squid在没有配内存缓存的情况下比另两个Web服务器的性能要差些。

    动态页面:/rss (31kB)
    Con Lighttpd(:80) Squid(:3128) Apache(:81)
    1 103 210 6.17
    10 110 200 6.04
    100 100 100 6.24

    在动态内容上,Squid的作用非常明显,而Lighttpd受限于Squid的效率,并且还要低一大截。如果是有多台Squid来做均衡的话,Lighttpd的功效才能发挥出来。
    在单机且静态内容很少的情况下,可以不用Lighttpd而将Squid置于最前面。
    14 Comments ?
    1. Re:Lighttpd+Squid+Apache搭建高效率Web服务器
    这种搭配倒是可以 不过正文描述有些地方有问题
    light 可以自己加上cache支持 但从性能只考虑cache看比squid还好一点(平均每秒3000+线上实际数据)
    squid 那块说的不太对 处理静态优化到99.99%以上的hitratio后 基本上作用非常大
    对整体结构也很有好处
    light+squid+apache的结构过渡时期实际在线也跑过 当时是后端没做压缩支持
    实际上每一块都可以根据自己需要patch 没有最好 只有更合适 可管理性很重要
    由 windtear 发表于 Wed Sep 13 13:38:15 2006
    2. Re:Lighttpd+Squid+Apache搭建高效率Web服务器
    lighttpd + php 访问量大的话经常会导致 php 死掉,然后 500

    不管是 local 还是 remote 方式

    无奈,换 zeus 了,很坚挺,商业的就是商业的。
    由 soff 发表于 Wed Sep 13 13:39:01 2006
    3. Re:Lighttpd+Squid+Apache搭建高效率Web服务器
    His result looks weird, as a result, his conclusion is wrong.

    Squid does not boost dynamic page at all, the speed gain in his test is because his client is requesting the same page in paralell, and squid will return the same page for the concurrent requests. I also guess that he did not configure expire time for static content in his web server, Squid will try to refetch the file with If-Modified-Since header for each request. That's why squid performs poor in the static test.
    由 kxn 发表于 Wed Sep 13 13:41:24 2006
    4. Re:Lighttpd+Squid+Apache搭建高效率Web服务器
    不太同意这一点,对Squid而言,动态页面和静态页面是一样的,只要设置好HTTP头,
    如果设置Expires,是没有缓存效果的
    如果不能Cache动态页面的话,那怎么起到加速效果?
    由 davies 发表于 Wed Sep 13 13:42:00 2006
    5. Re:Lighttpd+Squid+Apache搭建高效率Web服务器
    不好意思,英语不好,误导你了,上午在单位的机器没法输入中文
    动态页面除非正确设置HTTP的过期时间头,否则就是没有加速效果的.反过来说,静态页面也需要设置过期时间头才对.

    我说的设置 expire 时间是指的把过期时间设置到几分钟后或者几小时后,这样页面就在这段时间内完全缓冲在squid里面.

    你实际测试动态页面有性能提升,这有几种可能,一是你的测试用的是并发请求同一个页面,squid对并发的同页面请求,如果拿到的结果里面没有 non cache 头,会把这一个结果同时发回给所有请求,相当于有一个非常短时间的cache,测试结果看起来会好很多,但是实际因为请求同一页面的机会不是很多,所以基本没有啥改进,另一种情况是你用的动态页面程序是支持if-modified-since头的,他如果判断这个时间以后么有修改过,就直接返回not modified,速度也会加快很多.

    所以其实squid在实际生产中大部分时间都是用于缓冲静态页面的,动态页面不是不能缓冲,但是需要页面程序里面做很多配合,才能达到比较好的效果

    newsmth的 www 高峰时候是 600qps ,squid端还是比较轻松,瓶颈在后端.
    由 kxn 发表于 Wed Sep 13 13:43:55 2006
    6. Re:Lighttpd+Squid+Apache搭建高效率Web服务器
    多谢你的详细解答!

    我文章中写了,每个请求都会添加 Expires 头为当前时间的后5分钟,即每个页面的有效期为5分钟,Squid似乎会根据这个时间来判断是否刷新缓存,无需服务器支持If-modified-since
    这个5分钟是根据页面的一般更新频率来确定的.

    如果是访问量很大的Web应用,比如newsmth的www,如果将php页面的失效时间设置为1-2秒,则这段时间内的请求都会用缓存来回应,即使在这段缓存时间内数据更新了,但并不影响用户的使用,1-2秒钟的滞后效应对用户的体验影响并不大,但换取的是更快的服务器响应尤其是访问量大但更新并不频繁的blog部分,这样做可能很有效

    当然,如果实现了If-modified-since接口,将更有效,但工作量太大
    由 davies 发表于 Wed Sep 13 13:45:27 2006
    7. Re:Lighttpd+Squid+Apache搭建高效率Web服务器
    看来是我没有仔细看你文章了, 确实没有注意到你文章里面提了 expire 头
    静态页面也可以设置 expire 头的,用 web server 的一个模块就可以
    这样基本就是全部用 squid 缓冲了.

    没有 expire 头的时候,squid就会每个请求都用 if modified since 去刷.

    smthwww的php 页面expire时间是 5 分钟还是 10 分钟来着,我忘记了.
    由 kxn 发表于 Wed Sep 13 13:46:46 2006
    8. Re:Lighttpd+Squid+Apache搭建高效率Web服务器
    总的感觉多此一举阿,如果没有非常巨大的访问量,squid的解决方案就足够了。

    如果真用了lighttpd, 基本上没有什么必要要apache了,
    除非是非常特别的应用, lighttpd基本上都能支持的.

    单机折腾这么多层,是不会有什么性能收益的.
    由 scaner 发表于 Wed Sep 13 13:48:44 2006
    9. Re:Lighttpd+Squid+Apache搭建高效率Web服务器
    其实lighttpd的缓存功能很强大,你可以看看他的cml文档,能很好的解决动态内容的缓存问题。而且如果是单机服务器的话在架个squid意义不大。当然除非你要缓存的东西实在太多,squid的Bloom Filter还是非常有效的。
    由 Wei Litao [email] 发表于 Sat Sep 16 13:19:38 2006
    10. Re: Lighttpd+Squid+Apache搭建高效率Web服务器
    lighttpd有bug,内存泄漏比较严重。我现在用nginx,正在lilybbs上测试效果。其实把动态内容静态化才是最终出路。那些点击量真想去掉。