本站首页    管理页面    写新日志    退出


«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7656741
建立时间:2006年5月29日




[网站架构]Apache rewrite技术实现Apache到lighttpd迁移
软件技术

lhwork 发表于 2006/12/27 15:15:46

毫无疑问Apache是一个优秀的web server,但它也不万能的,在一些特定的环境下,也有Apache力不从心的时候。手上一台server由于瞬间高密度的访问非常多,因此 Apache 1.3.x应付起来有点吃力,表现为响应速度慢,而且非常耗资源,Swap经常都是占满的。有一两次还导致机器负载过高(高达30-40,有个别时刻居然 达到150之巨),感觉要死机的样子。 uX7#: [V  0[S(1S)  为此,必须寻求一个解决之道。分析之下,这台server目前的情况主要是由于运行了大量的fastcgi应用,而且这些应用的并发非常密集,平时白天就有200-300个连接,厉害的时候有近1000个在用进程。apache的运行情况top如下: {%H H0T  0W<3 39W_  25806 nobody 15 0 7224 5888 1652 S 0.0 0.5 0:10 1 httpd b.LP- ,>~  28152 nobody 15 0 6576 5856 1680 S 0.0 0.5 0:01 1 httpd Nv_ up]i~  28686 nobody 15 0 7224 5808 1652 S 0.0 0.5 0:01 1 httpd #gH#;y#+;  `XpG~o,!H  可见每个process的Share 内存就有1.6MB之多,如果是1000个进程就是1.6G了。加上其他开销,实际需要2G的存储空间,机器的内存是1G,交换区是1G,那实际上Swap将全部耗尽。 dc49-XR  J[HiK~^'  如何降低这些开销呢?fastcgi应用程序已经较好的优化了,耗费的资源很少,而且只有少于10个进程在运行,因此问题不在fastcgi。问题在Apache的并发响应能力,以及资源占用上。 bAg\V.'4G  KA'klJ=S!  使 用lighttpd可以较好的解决这个问题,lighttpd基于单进程多路复用技术,因此消耗的资源非常少。而且支持fastcgi,但由于对php的 支持仅限于fastcgi,与机器现有的一些网站并不能很好的兼容,因此考虑前端(80端口)用Apache,后端(2088)用lighttpd,通过 rewrite技术,将fastcgi请求转交(Redirect)给后端的lighttpd处理。  K~ I/1  ;P1F" J  这样原理上就能使apache的进程大幅度减少,并只是负责请求的转发而已,可以充分的利用原来的进程资源。而lighttpd消耗的cpu/memory资源也较低,因此完成同样的任务,Apache+lighttpd的方案就比原来的纯Apache要好得多。 `x4/yR-  1 pMkio/U  实际运行证明,效率要好得多,响应速度提高了一个数量级以上。客户反映良好。 (w?{B" uY  u^5^h[`ah\  Apache rewrite + lighttpd 实现方法 pet4wb8#'  原来负载较高的网站主机名highload.xxx.com ,运行的fastcgi prefix是/fcgi-bin。因此需要对这个虚拟主机进行Rewrite配置。 /+>x}e@g  2Q7'[* I  第一步,编译apache,激活mod_rewrite: ']JN^TVDX   ]R8Xa0t   QUOTE: c@5Mh}  ./configure \ qTe^KTh   --with-layout=Apache --prefix=/usr/local/httpd \ p{'Ad9  --enable-shared=max --enable-module=rewrite \ J {C2H\)x  --enable-shared=rewrite OS.&<'#  Y\- Sm  [XP>6Z 92  安装并加载好之后,配置highload.xxx.com的虚拟主机,在VirtualHost里增加: -Q!~f1%   QUOTE: @4 {%#hx  RewriteEngine on u,V `Rjf  RewriteRule   ^\/fcgi-bin\/(.+)     http://highload.xxx.com:2088/$1 >7,5'q#  yaJSvFc>W  第二步,编译lighttpd,配置fastcgi并使lighttpd监听于2088端口: E! @Xj   QUOTE: |4* A6  ./configure --prefix=/usr/local/lighttpd ]~ Ep*+}uc  ?i2uY9%  i)l3_h.Q  配置: :U5mA;[/   QUOTE: 1ire57y  server.modules         = ( Eo~>uSO[,                      "mod_access", d#?^^&.                      "mod_fastcgi", N(JQ":                      "mod_accesslog" ) =m$ T F>  ^=]N(,v  server.document-root   = "/var/www/vhost/highload/fcgi-bin/" qkU-#!X  server.errorlog         = "/var/log/lighttpd/lighttpd.error.log" jOO% VK  fj?,Qa  server.indexfiles       = ( "index.php", "index.html",  $SY Y                      "index.htm", "default.htm" ) SUrcz0g^  >:{%ZiQ?QF  mimetype.assign         = ( dpNvR  ".pdf"       =>     "application/pdf", tB:_8zP8  ".sig"       =>     "application/pgp-signature", @$SJud2H  ".spl"       =>     "application/futuresplash", 3R ML ra  ".class"     =>     "application/octet-stream", H #t}e\O]  ".ps"       =>     "application/postscript", .qO)UOq@  ".torrent"     =>     "application/x-bittorrent", wH(5{ei`  ".dvi"       =>     "application/x-dvi", =>My W]I  ".gz"       =>     "application/x-gzip", f% 6A{_  ".pac"       =>     "application/x-ns-proxy-autoconfig", m:7F3l R0  ".swf"       =>     "application/x-shockwave-flash", xb I()=P  ".tar.gz"     =>     "application/x-tgz", ?L-A,S|  ".tgz"       =>     "application/x-tgz", /"hfs*9.n*  ".tar"       =>     "application/x-tar", Gn`G|}5  ".zip"       =>     "application/zip", Jm^ B*i  ".mp3"       =>     "audio/mpeg", )su]Xh-  ".m3u"       =>     "audio/x-mpegurl", 6j!\O?|?  ".wma"       =>     "audio/x-ms-wma", f='RqdnKA  ".wax"       =>     "audio/x-ms-wax", c! YR,)  ".ogg"       =>     "audio/x-wav", z j3bo#  ".wav"       =>     "audio/x-wav", FB+O[\fLQ  ".gif"       =>     "image/gif", Z`;kx/Tky  ".jpg"       =>     "image/jpeg", {$ 4<"_.  ".jpeg"       =>     "image/jpeg", }%nC_:)Tm  ".png"       =>     "image/png", nmt[f #n  ".xbm"       =>     "image/x-xbitmap", s>XAbT:M  ".xpm"       =>     "image/x-xpixmap", -$u$.wo"  ".xwd"       =>     "image/x-xwindowdump", Ej%{4-ot  ".css"       =>     "text/css", MRZjgi]  ".html"       =>     "text/html", cs_ $  ".htm"       =>     "text/html", Jkf"(+Ef:  ".js"       =>     "text/javascript", vsWX8HK$y  ".asc"       =>     "text/plain", tR*;fy(,0  ".c"         =>     "text/plain", ~YV"3T\  ".conf"       =>     "text/plain",  \0_^  ".text"       =>     "text/plain", =a.9os ,  ".txt"       =>     "text/plain", "G Dm.o*  ".dtd"       =>     "text/xml", ld]X6gR"s  ".xml"       =>     "text/xml", I@O "o  ".mpeg"       =>     "video/mpeg", l`-ag9FM0  ".mpg"       =>     "video/mpeg", En:<aPJ  ".mov"       =>     "video/quicktime", %8qc|:4L^  ".qt"       =>     "video/quicktime", @?f70 B  ".avi"       =>     "video/x-msvideo", \ gtyjwyH  ".asf"       =>     "video/x-ms-asf", G+gz/<s  ".asx"       =>     "video/x-ms-asf", (Mjp;d<2g  ".wmv"       =>     "video/x-ms-wmv", C_=\ kd  ".bz2"       =>     "application/x-bzip", {id#|7 w  ".tbz"       =>     "application/x-bzip-compressed-tar", w}WG7q  ".tar.bz2"     =>     "application/x-bzip-compressed-tar" $ _o$K<:  ) \298n/,'  6k5Rg  url.access-deny         = ( "~", ".inc" ) -cnD\T]jR  server.port           = 2080 W[us;b|  2koT2!RWd  fastcgi.server         = ( "prog1" => fA"Wd(PCW                      ("prog1" =>("socket" => "/tmp/prog1.socket")), ?H7 C$.-                      "prog2" => l6gZLIkGs                      ("prog2" =>("socket" => "/tmp/prog2.socket")) 6dYP!RwO                    ) d {$:g$%_  s&5O Zu&P3  这样lighttpd将监听于2088端口,访问http://highload.xxx.com:2088/prog1或prog2就可以执行fastcgi应用了。 %W+jjg|'7|  ~&W5 :Ac  注意,由于prog1/prog2等程序是非PHP 的fastcgi程序,由perl/c写成,因此必须用lighttpd的spawn-fcgi程序实现将这些fcgi应用运行,才能启动lighttpd,否则lighttpd会出错。 P,h CcK(  c~zgg;}Z$  进入/usr/local/lighttpd/bin,执行: xR g(   QUOTE: >.I>( { *  ./spawn-fcgi -s /tmp/prog1.socket -f /var/www/vhost/highload/prog1 ]w.Z%B  ./spawn-fcgi -s /tmp/prog2.socket -f /var/www/vhost/highload/prog2 nyp <"!*  F[1lVMMff  执行成功的话,将显示: L! (.L'X$  NJj5e \  spawn-fcgi.c.160: child spawned successfully: PID: 602 : 'lNob  重新启动apache,这样凡是访问http://highload.xxx.com/fcgi-bin/prog1或prog2,将自动定向到http://highload.xxx.com:2080/prog*。 >Fl%K\  ; B{V.  经过这样改进后,平均的Apache进程数从650-700降低到250,其余的400-500个并发就由lighttpd来处理。整机的负载也降低了很多。主要是内存使用大幅度降低了。只有原来的40%用量,swap余量非常足够:-) Z 1 X-w`6 


阅读全文(2599) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 1.547 second(s), page refreshed 144794287 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号