ʵս FastCGI
×÷ Õߣº ÐíÃ÷Ñå
Abstract: µ±ÍøÕ¾ÈÕÒæ×ߺ죬Áª»úÈËÊýÖ±ÏßÉÏÉý¶øÐÄÖаµ×ÔÇÔϲ֮ʱ£¬Í»È»¿Í·þÖÐÐÄÓ¿À´´óÅú·´Ó¦µç»°£º¡ºÍøÕ¾Á¬²»ÉÏÈ¥¡»¡¢¡º°´ÏÂÈ¥µÈºÃ¾Ã»Ãæ²Å³öÀ´¡»¡¢¡ºÒ»Ö±³öÏÖ Server Too Busy...¡»£®£®£®¡£¿´À´ÓÖÒª°ÑÓ²¼þÉý¼¶ÁË£¬µ«ÊÇÔÙ¼Ó¸ü¶àµÄÄڴ棬¸ü¶à CPU¡¢»»¸ü¹óµÄ»úÆ÷ÕæµÄÄܽâ¾öÎÊÌâÂð£¿ÓÐûÓбȽÏʡǮµÄ·½·¨ÄØ£¿±¾ÎĽ«½éÉÜÈçºÎÔÚ°¢ÅÁÆõ·þÎñÆ÷Éϰ²×° FastCGI µÄÄ£¿é£¬ÈçºÎÉ趨¼°Ê¹Óà FastCGI ÍøÕ¾Ó¦ÓóÌÐò£¬ÈÃÄãµÄÍøÕ¾³ÌÐòÔÚÏÖÓеļܹ¹ÉÏÒÔÈ«ËÙÖ´ÐС£ ----------------------------------------------------------------------------
1. ¿Ë·þ CGI µÄÆ¿¾± 1.1 ÁîÈËÍ·Í´µÄЧÂÊÎÊÌâ 1.2 һЩ½â¾öÖ®µÀ 1.3 ¸üºÃµÄ·½·¨ - FastCGI 2. °²×° FastCGI 2.1 ÔÚ°¢ÅÁÆõ·þÎñÆ÷Éϰ²×° FastCGI Ä£¿é 2.1.1 ±ê×¼°²×° (ÀûÓà APACI) 2.1.2 ½« mod_fastcgi °²×°³ÉÒ»¸ö DSO 2.2 ¼ÓÈëʹÓà mod_fastcgi µÄÏà¹ØÉ趨 2.3 °²×° FastCGI ¿ª·¢Ì×¼þ 2.4 ²âÊÔ FastCGI 2.5 °²×° FCGI Ä£¿é for Perl 3. ׫д FastCGI Ó¦ÓóÌÐò 3.1 ³ÌÐò¼Ü¹¹ 3.2 ÒýÈë fcgi_stdio.h ±êÍ·µµ 3.3 FastCGI ´¦ÀíÑ»· 3.4 Á¶½á libfcgi.a º¯Ê½¿â 3.5 ׫д FastCGI ³ÌÐòµÄ×¢ÒâÊÂÏî 4. FastCGI Óжà¿ì£¿ 4.1 ÆÀ±È¹¤¾ß - ApacheBench 4.2 CGI vs. FastCGI 4.3 ÕÒ³ö Memory Leak 5. ²Î¿¼ About this document ...
----------------------------------------------------------------------------
1. ¿Ë·þ CGI µÄÆ¿¾±
1.1 ÁîÈËÍ·Í´µÄЧÂÊÎÊÌâ °Ý CGI Ö®´Í£¬ÍøÕ¾²»ÔÙÖ»Óй̶¨²»±äµÄͼÐκÍÎÄ×Ö£¬½åÓɳÌÐò¶¯Ì¬²úÉúµÄÍøÒ³¿ÉÒÔÈÃÍøÕ¾ºÃÏ󡺻ÁËÆðÀ´¡£Ð¡´Ó¼òµ¥µÄÍøÒ³¼ÆÊýÆ÷£¬ÁôÑ԰棬´óÖÁ´¦ÀíÖÚ¶à×ÊÁϵÄËÑѰÒýÇæ£¬¿É×öÏßÉÏʵʱ½»Ò׵ĵç×ÓÉÌÎñ¡¢ÍøÂçϵ¥µÈ¡£CGI ¼òµ¥¡¢¿ª·Å¡¢¿çƽ̨¡¢Óë³ÌÐòÓïÑÔ¶ÀÁ¢µÄÌØÐÔ£¬Ê¹µÃ×«Ð´ÍøÕ¾Ó¦ÓóÌÐò±äµÃºÜÈÝÒס£
µ«Ëæ×ÅÍøÕ¾Ê¹ÓÃÁ¿ÈÕÔö£¬ÕâЩ CGI ³ÌÐò´ÓÔ±¾¶¯Ì¬ÍøÒ³µÄ¹¦³¼£¬Í»È»³ÉÁËÍøÕ¾Ð§ÂʵÄÍ·ºÅɱÊÖ¡£ÓÉÓÚ CGI ÏÈÌìµÄÏÞÖÆ1£¬Í»È»Ó¿Èë´óÁ¿µÄÁª»úÇëÇó (request) £¬³£»áÔì³ÉÍøÕ¾Ö÷»ú˲¼ä×ÊÔ´±»Õ¼Óã¬áݷ𡺵±»ú¡»Ò»Ñù£¬»òÊÇ´¦ÀíËٶȱäµÃºÜÂý¡£
ÁíÒ»¸ö³£Óöµ½µÄÏÞÖÆÊǺÍÊý¾Ý¿âÁª»úµÄÎÊÌ⣬Èç¹û CGI ³ÌÐòºó¶ËÐèÒªÁª»úÖÁÊý¾Ý¿âÖ´ÐÐÖ¸ÁîÔÙÈ¡µÃ½á¹û£¬Í»È»´óÁ¿µÄÁª»úÇëÇó¿ÉÄܻᳬ¹ýÊý¾Ý¿âϵͳÈÝÐíÁª»úµÄÉÏÏÞ (ÀýÈçÊý¾Ý¿âϵͳʹÓÃÕßÊýÄ¿µÄÏÞÖÆ)¡£
Òò´Ë¶ÔÒ»¸öÖ÷ÒªÒÔʹÓà CGI ³ÌÐòÖÆ×÷¶¯Ì¬ÍøÕ¾µÄ¿ª·¢Õß¶øÑÔ£¬½â¾ö CGI Ö´ÐÐЧÂÊÆ¿¾±³ÉÁËÒ»¸öÍ·Í´µÄÎÊÌâ¡£ÒÔÒ»¸ö¹ÉÊÐʵʱÐÐÇ鱨¼ÛµÄÍøÕ¾ÎªÀý£¬Ã¿ÌìµÄÁª»úÇëÇ󽫽ü°Ë³É¼¯ÖÐÔÚ¹ÉÊпªÅ̵ļâ·åʱ¶ÎÄÚ£¬¸üÊǶÔÍøÕ¾Ó¦ÓóÌÐò¼«´óµÄ¿¼Ñé¡£
1.2 һЩ½â¾öÖ®µÀ ÏÖÔÚÒѾÓÐÐí¶à·½°¸±»Ìá³öÀ´ÒÔ½â¾ö CGI Ö´ÐÐЧÂÊÉÏµÄÆ¿¾±£¬ÔÚ¡ºÓà FastCGI ¼ÓËÙÄãµÄÍøÕ¾¡»Ò»ÎÄÖÐÒ²Óмòµ¥µÄ˵Ã÷£¬ÕâÀï½ö¾Í±ÊÕßÔÚ¿ª·¢¹ÉÊÐʵʱ±¨¼ÛµÄÍøÕ¾Ó¦ÓóÌÐòʱ£¬Ëù³¢ÊÔ¹ýµÄһЩ·½·¨Ìá³ö¸öÈ˵ľÑéºÍÒâ¼û¡£ÒÔ±ÊÕߵݸÀý¶øÑÔ£¬Ô±¾µÄ CGI ³ÌÐòÊÇÒÔ C ÓïÑÔдµÄ£¬²¢ÇÒÓÃÁËÆäËüµÄ C º¯Ê½¿âËùÒÔÏÂÁеķ½·¨Ö÷ÒªÊÇÒÔÌṩ C ÓïÑÔ¿ª·¢»·¾³µÄ·½°¸ÎªÖ÷¡£
NSAPI ÓÉÓÚÔÏÈÍøÕ¾ÊÇÔÚ Unix ϵͳÉÏ£¬ÍøÕ¾·þÎñÆ÷ʹÓÃÍø¾° Enterprise Server£¬ËùÒÔ×îÔçÏëµ½ÊÇÓà NSAPI À´¸ÄÐ´ÍøÕ¾Ó¦ÓóÌÐò¡£ÔÚÍø¾°µÄÍøÕ¾ÉÏÓзdz£ÏêϸµÄ NSAPI ʹÓÃÊֲᣬ²»ÐÒµÄÊÇûÓÐÖÐÎÄÊֲᡣҪÓà NSAPI ¸ÄÐ´ÍøÕ¾Ó¦ÓóÌÐò×îÂé·³µÄÊÇÄãÒª°ÑËùÓгÌÐò±àÒë³É¶¯Ì¬º¯Ê½¿â (share library)£¬ÒÔ¹© Enterprise Server ÔÚ run-time ʱÆÚ¿ÉÒÔ¶¯Ì¬ºô½ÐÕâЩ³ÌÐò¡£ÓÉÓÚÀûÓà NSAPI ËùдµÄ³ÌÐòÊÇÖ±½Ó´Ó Web Server µÄÖ´ÐпռäÄÚ±»ºô½Ð£¬ËùÒÔËÙ¶È×î¿ì£¬µ«ÊdzÌÐò±ØÐë×ñÑ Enterprise Server µÄ׫д¹æÔò£¬¶øÇÒÒ»µ©³ÌÐò·¢Éú´íÎó£¬ Web Server Ò²»áÊÜÓ°Ïì¡£
ISAPI Ïà½ÏÓÚ NSAPI £¬ÔÚ Microsoft NT IIS (Internet Information Server) ƽ̨¾ÍÊÇ ISAPI ÁË¡£ÀàËÆ NSAPI £¬ÀûÓà ISAPI ×«Ð´ÍøÕ¾Ó¦ÓóÌÐò£¬±ØÐë°ÑÓ¦ÓóÌÐò±àÒë³É¶¯Ì¬º¯Ê½¿â£¬Ò²¾ÍÊÇ DLL ™n¡£ËüµÄÖ´ÐÐËÙ¶ÈÒ²ºÜ¿ì£¬µ«Òª×ñÑ ISAPI µÄ׫д¹æÔòºÍÊý¾Ý½á¹¹£¬³ÌÐò·¢Éú´íÎóʱҲ»áÓ°Ïì IIS Server µÄÕý³£ÔË×÷¡£ ×Û¹ÛÒÔÉÏÁ½ÖÖÒÔ Web Server API ΪÖ÷µÄ·½°¸ (Æäʵ Apache Ò²ÓÐÏà¶ÔÓ¦µÄ Server API£¬Ö»ÊÇÓõÄÈË¿ÉÄܸüÉÙ) £¬ËüÃǵÄÖ´ÐÐËٶȶ¼ºÜ¿ì£¬¾Í²úÉú¶¯Ì¬ÍøÒ³¶øÑÔ±È CGI ¿ìÉϺü¸±¶¡£µ«ÊǾͳÌÐò¿ª·¢ÕߵĽǶÈ2À´¿´£¬ËüÃÇÓÐһЩȱµã£º
1. NSAPI ¼° ISAPI ÓëÍøÕ¾Æ½Ì¨ÏàÒÀÐÔÌ«¸ß (Platform dependency)£¬Ò²¾ÍÊÇ˵ʹÓÃÁË NSAPI »ò ISAPI ºó£¬Ó¦ÓóÌÐò¾ÍÍêÈ«ÊÜÏÞÓÚËùʹÓõÄÍøÕ¾·þÎñÆ÷ƽ̨£¬²»Äܱ任ËùʹÓõÄÍøÕ¾·þÎñÆ÷¡£²»Ïñ CGI ÍêÈ«²»ÊÜÍøÕ¾Æ½Ì¨µÄÏÞÖÆ£¬¿ÉÒÔÔÚÈκÎÍøÕ¾·þÎñÆ÷ (Netscape, Microsoft IIS, Apache, NCSA)ÉÏÖ´ÐС£ÁíÍâÏñ ISAPI ¸üÖ»ÄÜÏÞÖÆÔÚ Windows NT ƽ̨ÉÏʹÓᣠ2. NSAPI ¼° ISAPI Ö»Ìṩ C ³ÌÐòÓïÑԵĽçÃæ£¬Ò༴¿ª·¢ÕßÒ»¶¨ÒªÊ¹Óà C ÓïÑÔ¿ª·¢¡£²»Ïñ CGI ÊÇÓ뿪·¢ÕßËùʹÓõijÌÐòÓïÑÔÍêÈ«Î޹أ¬³ýÁË C Ö®Í⣬³£ÓõϹÓÐ Perl£¬TclµÈ¡£ 3. Netscape Enterprise Server ºÍ Microsoft IIS ¶¼ÊÇÒÔ¶àÖ´ÐÐÐ÷ (Multi-Threads) µÄ·½Ê½´¦Àí NSAPI ¼° ISAPI µÄ³ÌÐò£¬ËùÓÐÖ´ÐÐÐ÷¹²Ïíͬһ¿é±äÁ¿¿Õ¼ä£¬Òò´ËÔÚ±äÁ¿Êý¾ÝµÄ´¦ÀíÉÏÒªÌØ±ðСÐÄ£¬ÒÔÈ·±£Ã¿Ò»¸öÖ´ÐÐÐ÷ÄڵıäÁ¿×ÊÁϵݲȫ£¬²»»á»¥ÏàÓ°Ïì¡£ 4. NSAPI ºÍ ISAPI Ó¦ÓóÌÐò¶¼ÊÇÖ±½ÓÔÚ·þÎñÆ÷µÄÖ´ÐÐÐÐ³Ì (process) ÄÚ±»ºô½Ð£¬Èç¹û³ÌÐòµ±µôÁË£¬Õû¸öÍøÕ¾·þÎñÆ÷¶¼»á±»Ó°Ïì¡£CGI µ±µô·þÎñÆ÷»áÏìÓ¦ Internal Server Error µÄѶϢ£¬·þÎñÆ÷±¾Éí²»ÊÜÓ°Ïì¡£ 5. NSAPI ºÍ ISAPI Ó¦ÓóÌÐò±ØÐë±»·þÎñÆ÷ºô½Ð²Å»á±»Ö´ÐУ¬Õì´í (debug) Ï൱²»ÈÝÒס£
1.3 ¸üºÃµÄ·½·¨ - FastCGI Èç¹ûÄãÕý±¥ÊÜ CGI ЧÂʲ»¼ÑÖ®¿à£¬ÓÖ²»ÏëÊÜÏÞÓÚ NSAPI ¼° ISAPI £¬Ò²Ã»Óдó±ÊÒø×ÓÈ¥Âò°º¹óµÄ Application Server£¬ÎÒ½¨ÒéÄãÊÔÊÔ¿´ FastCGI¡£
²»Í¬ÓÚ NSAPI ¼° ISAPI ÒÔ¼°ÆäËüµÄÍøÒ³·þÎñÆ÷ÓïÑÔ (Èç ASP, PHP3, mod_perl)£¬FastCGI ±È½ÏÀàËÆ CGI£¬ËüÖ»ÊÇÒ»¸öÍøÕ¾Ó¦ÓóÌÐòÉè¼ÆµÄ¹æ¸ñ£¬Òò´ËÏÈÌìÉϲ»ÊÜÈκÎÍøÕ¾·þÎñÆ÷ƽ̨£¬²Ù×÷ϵͳƽ̨£¬ÒÔ¼°¿ª·¢ÓïÑÔµÄÏÞÖÆ£¬µ«ÓÖÄÜ´ó·ù¸ÄÉÆ CGI ЧÂʲ»Á¼µÄÎÊÌâ¡£FastCGI µÄÌØÉ«ÈçÏ£º
1. FastCGI ÏñÊÇÒ»¸ö³£×¤ (long-live) Ð굀 CGI£¬Ëü¿ÉÒÔÒ»Ö±Ö´ÐÐ×Å£¬Ö»Òª¼¤»îºó£¬²»»áÿ´Î¶¼Òª»¨·Ñʱ¼äÈ¥ fork Ò»´Î (ÕâÊÇ CGI ×îΪÈËÚ¸²¡µÄ fork-and-execute ģʽ)¡£ 2. FastCGI ¿ÉÔÚÈÎºÎÆ½Ì¨ÉÏʹÓã¬Netscape Enterprise ¼° IIS ¶¼ÓÐ FastCGI µÄÄ£¿é¿É¹©Ê¹Ó㬰¢ÅÁÆõ (Apache£¬ÒÔ¼°ÀûÓà Apache ÑÜÉú³ö×öµÄ·þÎñÆ÷) ÉÏÒ²ÓÐ mod_fastcgi ¿ÉÓᣠ3. FastCGI Ö§³Ö C/C++£¬Perl£¬Tcl£¬Java£¬Python µÈ³ÌÐòÓïÑÔ¡£ 4. FastCGI µÄÓ¦ÓóÌÐòÒà¼æÈÝÓÚ CGI¡£¼´ FastCGI µÄÓ¦ÓóÌÐòÒ²¿ÉÒÔµ±³É CGI À´Ö´ÐС£ 5. ÏÖÓÐµÄ CGI ³ÌÐòÒª¸Äд³É FastCGI ·Ç³£¼òµ¥£¬×îÉÙ¿ÉÄÜÖ»ÐèÒª¶à¼ÓÈëÈýÐгÌÐò´úÂë¡£ 6. FastCGI µÄÕì´í·½Ê½Óë CGI ´óͬСÒ죬ֻҪ´øÈë³ÌÐòËùÐèµÄ»·¾³±äÁ¿¼°²ÎÊý£¬¼´¿ÉÔÚÃüÁîÁÐģʽִÐлòÕì´í¡£ 7. FastCGI Ó¦ÓóÌÐòµÄд×÷·½Ê½Óë CGI ÀàËÆ£¬³ýÁ˼¸ÏîÔÔòÒªÌØ±ð×¢ÒâÍ⣬FastCGI µÄд×÷·½Ê½¸ú CGI ¼¸ºõÒ»Ñù£¬Óëѧϰ Web Server API ±È½ÏÆðÀ´£¬ FastCGI ¼òµ¥¶àÁË¡£ 8. FastCGI Ö§ÊÚ·Ö²¼Ê½ÔËËã (distributed computing)£¬¼´ FastCGI ³ÌÐò¿ÉÒÔÔÚÍøÕ¾·þÎñÆ÷ÒÔÍâµÄÖ÷»úÉÏÖ´Ðв¢ÇÒ½ÓÊÜÀ´×ÔÆäËüÍøÕ¾·þÎñÆ÷À´µÄÇëÇó¡£
¿´µ½ FastCGI ÕâÐ©ÌØÉ«ºó£¬ÊÇ·ñÔ¾Ô¾ÓûÊÔÄØ¡£ÏÂÒ»Õ½«½éÉÜÈçºÎÔÚ Apache ·þÎñÆ÷Éϰ²×° FastCGI µÄ²½Öè¡£
----------------------------------------------------------------------------
2. °²×° FastCGI
ҪʹÓà FastCGI Äã±ØÐèÓÐÒ»¸ö¿É¹© FastCGI ³ÌÐòÖ´ÐеĻ·¾³ (run-time environment)£¬ÒÔ¼° ׫д FastCGI ³ÌÐòµÄ¿ª·¢»·¾³¡£ÒÔϾÍÒÔ°¢ÅÁÆõ·þÎñÆ÷ (Apache Web Server) ×öΪ FastCGI µÄÖ´ÐÐÆ½Ì¨£¬¼òÊöÈçºÎÔÚ°¢ÅÁÆõ·þÎñÆ÷ʹÓà FastCGI¡£
ÓÉÓÚ°¢ÅÁÆõ·þÎñÆ÷×ÔÓÉ¡¢¿ª·Å¡¢¿çƽ̨µÄÌØÐÔ£¬ÏÖ½ñÐí¶àϵͳ»ò·¢ÐÐÌ×¼þ (distribution) ¶¼ÄÚº¬°¢ÅÁÆõ·þÎñÆ÷£¬Èç¹ûÄãÖ±½ÓÓÃÔ¤ÏȱàÒëºÃµÄ°¢ÅÁÆõ³ÌÐò£¬Çë×ÔÐÐÕÒ³ö·ûºÏ¸ÃϵͳÉ趨¹æÔòµÄ°²×°Â·¾¶¡£ÒÔÏÂÁгöһЩ°¢ÅÁÆõ·þÎñÆ÷Ïà¹ØµÄ·¾¶É趨¹æÔò£¬ºóÃæµÄ·¶Àý½«ÒÔ°¢ÅÁÆõÄÚ¶¨ÖµÎªÖ÷£¬ÆäËüµÄϵͳÇë×ÔÐвο¼£º
ϵͳ Ö´ÐÐÎļþ·¾¶ É趨Îļþ·¾¶ °¢ÅÁÆõÄÚ¶¨Öµ /usr/local/apache/bin /usr/local/apache/etc FreeBSD /usr/local/sbin /usr/local/etc/apache Red Hat Linux /usr/sbin /usr/etc
2.1 ÔÚ°¢ÅÁÆõ·þÎñÆ÷Éϰ²×° FastCGI Ä£¿é °²×° mod_fastcgi Õâ¸öÄ£¿é£¬¿ÉÒÔÈÃÄãµÄ°¢ÅÁÆõ·þÎñÆ÷Ö§³Ö FastCGI ÐÒé¡£mod_fastcgi ÏÖÔÚ×îа汾Ϊ 2.2.2 °æ£¬´Ë°æÖ÷ÒªÊÊÓÃÓÚ Apache 1.3 °æÒÔÉÏ¡£Èç¹ûÄãµÄ Apache »¹ÊÇ 1.2 °æ£¬ÇëÅäºÏ mod_fastcgi 2.0.18 °æÊ¹Óá£ÒÔÏÂÉ趨ÒÔ Apache 1.3.6 ¼° mod_fast 2.2.2 Ϊʾ·¶¡£
2.1.1 ±ê×¼°²×° (ÀûÓà APACI)
1. Ê×ÏÈÏÂÔØ apache_1.3.6.tar.gz ¼° mod_fastcgi_2.2.2.tar.gz £¬½â¿ª£º $ gunzip -c apache_1.3.6.tar.gz | tar xvf - $ gunzip -c mod_fastcgi_2.2.2.tar.gz | tar xvf - 2. °Ñ mod_fastcgi µÄÔʼÂë¸´ÖÆµ½ Apache µÄĿ¼Ï£º $ cp -rp mod_fastcgi_2.2.2 apache_1.3.6/src/modules/fastcgi 3. É趨 Apache ¼ÓÈë mod_fastcgi Ä£¿é£º $ cd apache_1.3.6 $ ./configure \ -activate-module=src/modules/fastcgi/libfastcgi.a \ -enable-module=info -enable-shared=info \ [ more APACI options ] 4. ±àÒë¼°°²×° $ make $ make install 5. ¿´Ò»Ï±àÒë³öÀ´µÄÖ´ÐÐÎļþÊÇ·ñº¬ÓÐ mod_fastcgi Ä£¿é£º $ /usr/local/apache/sbin/httpd -l Compiled-in modules: http_core.c ... mod_fastcgi.c ...
2.1.2 ½« mod_fastcgi °²×°³ÉÒ»¸ö DSO ¼ÙÉèÄãÒѾÔÚϵͳÉϰ²×°ºÃ Apache 1.3 °æÒÔÉÏ£¬²¢ÇÒÄãµÄƽ̨֧³Ö DSO (Dynamic Shared Object) µÄ·½Ê½¶¯Ì¬¼ÓÈëÄ£¿é£¬ÄÇôÄã¿ÉÒÔ͸¹ý apxs (APache eXtenSion tool) ½« mod_fastcgi °²×°³ÉÒ»¸ö DSO Ä£¿é¡£
1. ÏÂÔØ mod_fastcgi_2.2.2.tar.gz ²¢Çҽ⿪£º $ gunzip -c mod_fastcgi_2.2.2.tar.gz | tar xvf - 2. ±àÒë mod_fastcgi Ä£¿é³É DSO£º $ cd mod_fastcgi_2.2.2 $ /usr/local/apache/sbin/apxs -o mod_fastcgi.so -c *.c 3. °²×° $ /usr/local/apache/sbin/apxs -i -a -n fastcgi mod_fastcgi.so
2.2 ¼ÓÈëʹÓà mod_fastcgi µÄÏà¹ØÉ趨 ΪÁËÈà Apache Çø·Ö³öÄÇһЩÁª»úÇëÇóÊôÓÚ FastCGI À´´¦ÀíµÄ£¬ÎÒÃDZØÐèÔÚ°¢ÅÁÆõµÄÉ趨µµÄÚ¼ÓÈëÈà Apache ¿ÉÒÔ±æ±ð FastCGI µÄÉ趨¡£
1. mod_fastcgi Ä£¿é»áÏò Apache µÇ¼ÇÒ»¸ö fastcgi-script µÄ´¦ÀíÀàÐÍ (handler type)£¬ÎÒÃÇ¿ÉÒÔÉ趨ËùÓÐÒÔ fcg ÒÔ¼° fpl (for perl) ΪÀ©Õ¹ÃûµÄ³ÌÐò¶¼ÊÇ·ûºÏ FastCGI ÐÒéµÄÓ¦ÓóÌÐò£º AddHandler fastcgi-script .fcg .fpl 2. ½ÓÏÂÀ´ÎÒÃǶ¨Òå /usr/local/www/fcgi-bin Õâ¸öĿ¼ÓÃÀ´´æ·ÅÒѾдºÃµÄ FastCGI ³ÌÐò£º ScriptAlias /fcgi-bin/ /usr/local/www/fcgi-bin/ 3. ¼ì²éÉ趨µµÎÄ·¨ÊÇ·ñÕýÈ·£º $ /usr/local/apache/sbin/apachectl configtest Syntax OK 4. ÖØÐ¼¤»î°¢ÅÁÆõ·þÎñÆ÷£¬ÈÃÐÂÉ趨ÉúЧ£º $ /usr/local/apache/sbin/apachectl graceful /usr/local/apache/bin/apachectl graceful: httpd gracefully restarted
Apache 1.3.4 °æÖ®ºó½«Ô±¾µÄ httpd.conf ¡¢srm.conf¡¢access.conf ºÏ²¢³ÉÒ»¸öµµ°¸¡£ËùÒÔÄãËùʹÓÃµÄ Apache Èç¹ûÊÇ 1.3.4 °æÖ®ºó£¬ÇëÖ±½ÓÐÞ¸Ä httpd.conf3 Õâ¸öµµ£¬Èç¹ûÊÇ 1.3.3 °æÖ®Ç°£¬ÎÒ½¨Òé°Ñ mod_fastcgi Ä£¿éÏà¹ØÉ趨¼ÓÔÚ srm.conf Õâ¸öµµÀïÍ·¡£Êµ¼ÊµÄÉ趨Îļþ·¾¶ºÍÉ趨ÎļþÎļþÃû¿ÉÄÜÒÀÿ¸öÈ˵Ļ·¾³²»Í¬¶øÓвîÒ죬Çë¸ù¾ÝÄú×Ô¼ºµÄ»·¾³×öÊʵ±µÄµ÷Õû¡£
2.3 °²×° FastCGI ¿ª·¢Ì×¼þ
1. ÏÂÔØ fcgi-devkit-2.1.tar.gz ²¢Çҽ⿪£º $ gunzip -c fcgi-devkit-2.1.tar.gz | tar xvf - 2. ±àÒë $ cd fcgi-devkit-2.1 $ ./configure $ make 3. ½« C µÄ±êÍ·µµ (header file) ¼°º¯Ê½¿â (library) °²×°ÖÁϵͳ£º $ cp -rp include /usr/local/include/fastcgi $ cp libfcgi/libfcgi.a /usr/local/lib
2.4 ²âÊÔ FastCGI ÔÚ fcgi-devkit Ì×¼þÖÐÄÚº¬Ò»¸ö¼òµ¥µÄ FastCGI ·¶Àý³ÌÐò - echo.c£¬ÎÒÃÇÓÃËüÀ´×ö²âÊÔϵͳÊÇ·ñ°²×°ÕýÈ·¡£Ö±½Ó°ÑÒѾ±àÒëºÃµÄ echo.fcg ¸´ÖƵ½Ô¤Éè·ÅÖà FastCGI ³ÌÐòµÄĿ¼Ï£º
$ cd fcgi-devkit-2.1/example $ cp echo.fcg /usr/local/www/fcgi-bin
ÏÖÔڸϿìÓÃä¯ÀÀÆ÷Á¬µ½ http://localhost/fcgi-bin/echo.fcg ¿´¿´£¬Èç¹û¿´µ½ÒÔϽá¹û±íʾÄú´ó¹¦¸æ³ÉÀ²£º
FastCGIecho Requestnumber1,ProcessID:1013
Nodatafromstandardinput.
Requestenvironment: FCGI_ROLE=RESPONDER DOCUMENT_ROOT=/usr/local/apache/htdocs HTTP_ACCEPT=text/html,text/plain,application/applefile,application/x-metamai l-patch,sun-deskset-message,mail-file,default,postscript-file,audio-file, x-sun-attachment,text/enriched,text/richtext,application/andrew-inset,x-be2 ,application/postscript,message/external-body,message/partial,application/p gp,application/pgp,video/mpeg,video/*,image/*,audio/*,audio/mod,text/sgm l,video/mpeg,image/jpeg,image/tiff,image/x-rgb,image/png,image/x-xbitmap, image/x-xbm,image/gif,application/postscript,*/*;q=0.01 HTTP_ACCEPT_ENCODING=gzip,compress HTTP_ACCEPT_LANGUAGE=en HTTP_HOST=localhost HTTP_NEGOTIATE=trans HTTP_USER_AGENT=Lynx/2.8.1pre.9libwww-FM/2.14 PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/home/m yhsu/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/usr/X11R6/bin:/usr/sbin:/opt/kd e/bin REMOTE_ADDR=127.0.0.1 REMOTE_PORT=1024 SCRIPT_FILENAME=/usr/local/www/fcgi-bin/echo.fcg SERVER_ADMIN=myhsu@localhost.localdomain SERVER_NAME=localhost.localdomain SERVER_PORT=80 SERVER_SIGNATURE=
Apache/1.3.6Serveratlocalhost.localdomainPort80
SERVER_SOFTWARE=Apache/1.3.6(Unix)mod_fastcgi/2.2.2 UNIQUE_ID=N1ptln8AAAEAAAPdDRkGATEWAY_INTERFACE=CGI/1.1 SERVER_PROTOCOL=HTTP/1.0REQUEST_METHOD=GETQUERY_STRING= REQUEST_URI=/fcgi-bin/echo.fcgSCRIPT_NAME=/fcgi-bin/echo.fcg
Initialenvironment:
Çë×¢ÒâÔÚÒÔÉϳÌÐòËùÏÔʾµÄ Request number ºÍ Process ID ÕâÁ½¸ö±äÁ¿£¬µ±ÎÒÃǼÌÐøÖØÐ¼ÓÔØÕâÖ§³ÌÐòʱ£¬Request number »áÒ»Ö±ÀÛ¼Ó¶ø Process ID µÄÖµ¶¼²»»á¸Ä±ä¡£Õâ±íʾÕâÖ§³ÌÐòÔÚµÚÒ»´Î¼¤»îÖ®ºó¾ÍÒ»Ö±Ö´ÐÐ×ÅûÓнáÊø£¬¶øÇÒÔÚÿ´ÎÁª»úÇëÇóÖÐËù²ÎÕÕµ½µÄ±äÁ¿¿Õ¼äÊÇÏàͬµÄ (ËùÒÔ Request number »á²»¶Ï¼ÓÒ»)¡£ µ½´ËΪֹ£¬ÎÒÃÇÒѾ³É¹¦½¨Á¢ÆðÒ»¸ö¿É¹©·¢Õ¹ FastCGI Ó¦ÓóÌÐòµÄ»·¾³¼°Ö´ÐÐ FastCGI Ó¦ÓóÌÐòµÄÍøÕ¾Ö´ÐÐÆ½Ì¨¡£
2.5 °²×° FCGI Ä£¿é for Perl Èç¹ûҪʹÓà Perl À´×«Ð´ FastCGI µÄ³ÌÐò£¬±ØÐë°²×° FCGI.pm Õâ¸öÄ£¿é£¬°²×°µÄ·½·¨ÈçÏ£º
1. ÏÂÔØ FCGI-0.45.tar.gz ²¢Çҽ⿪ $ gunzip -c FCGI-0.45.tar.gz | tar xvf - 2. ±àÒë¼°°²×° $ perl Makefile.PL $ make $ make install 3. ²âÊÔ $ cp echo.fpl /usr/local/www/fcgi-bin $ lynx http://localhost/fcgi-bin/echo.fpl Èç¹û˳ÀûµÄ»°£¬Ó¦¸Ã»á¿´µ½ÈçϵĽá¹û£º FastCGI echo (Perl) Request number 1 No data from standard input. Request environment:
DOCUMENT_ROOT=/usr/local/apache/htdocs FCGI_ROLE=RESPONDER GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=text/html, text/plain, application/applefile, application/x-metamai l-patch, sun-deskset-message, mail-file, default, postscript-file, audio-file, x-sun-attachment, text/enriched, text/richtext, application/andrew-inset, x-be2 , application/postscript, message/external-body, message/partial, application/p gp, application/pgp, video/mpeg, video/*, image/*, audio/*, audio/mod, text/sgm l, video/mpeg, image/jpeg, image/tiff, image/x-rgb, image/png, image/x-xbitmap, image/x-xbm, image/gif, application/postscript, */*;q=0.01 HTTP_ACCEPT_ENCODING=gzip, compress HTTP_ACCEPT_LANGUAGE=en HTTP_HOST=localhost HTTP_NEGOTIATE=trans HTTP_USER_AGENT=Lynx/2.8.1pre.9 libwww-FM/2.14 PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/home/m yhsu/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/usr/X11R6/bin:/usr/sbin:/opt/kd e/bin QUERY_STRING= REMOTE_ADDR=127.0.0.1 REMOTE_PORT=1427 REQUEST_METHOD=GET REQUEST_URI=/fcgi-bin/echo.fpl SCRIPT_FILENAME=/usr/local/www/fcgi-bin/echo.fpl SCRIPT_NAME=/fcgi-bin/echo.fpl SERVER_ADMIN=myhsu@localhost.localdomain SERVER_NAME=localhost.localdomain SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SIGNATURE=
Apache/1.3.6 Server at localhost.localdomain Port 80 SERVER_SOFTWARE=Apache/1.3.6 (Unix) mod_fastcgi/2.2.2 UNIQUE_ID=N1VIbX8AAAEAAAQnKKo More on its way ... wait a few seconds Initial environment:
ͬÑùµÄ£¬Èç¹û³ÖÐøÁ¬½á http://localhost/fcgi-bin/echo.fpl ¿ÉÒÔ¿´µ½ Request Number ²»¶ÏÔö¼Ó£¬±íʾ echo.fpl ÒѾ±»¼¤»î¶øÇÒ³ÖÐøÖ´ÐÐ×Å¡£
ÖÁ´Ë£¬Ò»¸ö¿É¹©Ö´ÐÐ FastCGI ³ÌÐòµÄÍøÕ¾·þÎñÆ÷ÒÔ¼°×«Ð´ FastCGI ³ÌÐòµÄ¿ª·¢»·¾³ÒѾ½¨ÖÃÍê³É£¬½ÓÏÂÀ´¾ÍÖ»µÈ×ÅеijÌÐò·ÅÉÏÈ¥†ª¡£
----------------------------------------------------------------------------
3. ׫д FastCGI Ó¦ÓóÌÐò
׫дȫÐ嵀 FastCGI Ó¦ÓóÌÐò£¬»òÊǽ«¾ÉÓÐµÄ CGI ³ÌÐò¸Äд³É FastCGI Ó¦ÓóÌÐò¶¼·Ç³£µÄ¼òµ¥£¬Ö»ÒªÊ¹Óà fcgi-devkit Ëù¸½µÄ fcgi_stdio º¯Ê½¿â¼´¿É¡£
»ù±¾ÉÏ£¬fcgi_stdio º¯Ê½¿âÒѱ»Éè¼Æ³ÉÈÿª·¢ÈËԱ׫д FastCGI Ó¦ÓóÌÐò¾ÍÏñдһ°ã CGI ³ÌÐòÒ»Ñù£¬Í¬Ê±×öµ½³ÌÐò±£ÓÐºÍ CGI ×î´óµÄ¼æÈݶȣ¬ÓÖÄÜÏíÊܵ½ FastCGI Ëù´øÀ´µÄÓŵ㡣ʹÓà fcgi_stdio º¯Ê½¿âµÄÁíÒ»ÏîºÃ´¦ÊÇ£¬±àÒë³öÀ´µÄÖ´Ðеµ¿ÉͬʱÒÔ CGI ÒÔ¼° FastCGI µÄ·½Ê½Ö´ÐС£
3.1 ³ÌÐò¼Ü¹¹ ¶Ô CGI ³ÌÐò¶øÑÔ£¬ÆäÉúÃüÆÚ¾ÍÊÇ´ÓÒ»¸öÁª»úÇëÇó (request) ¿ªÊ¼µ½Áª»ú½áÊø¡£¶ø FastCGI ³ÌÐò¾ÍÏñÊDZȽϡº³¤Ãü¡»µÄ CGI ³ÌÐò£¬ÆäÉúÃüÆÚºá¿ç²»Í¬µÄÁª»úÇëÇó£¬¿É´Ó Web ·þÎñÆ÷¼¤»î¿ªÊ¼µ½ Web ·þÎñÆ÷Í£Ö¹¡£
ÓÉÓÚ FastCGI ³ÌÐò³¤ÃüµÄÌØÐÔ£¬ËüºÍÒ»°ã CGI ³ÌÐòÖ÷ÒªµÄ²îÒì¾ÍÔÚÓڰѳõʼ»¯ (initialization) µÄ²¿·ÝºÍ´¦ÀíÁª»úÇëÇóµÄ²¿·ÝÇø·Ö¿ªÀ´£¬³ÌÐòµÄ¼Ü¹¹ÈçÏÂËùʾ£º
Initialization Code Start of response loop
body of response loop End of response loop
Initialization Code µÄ²¿·ÝÖ»»áÔÚ FastCGI ³ÌÐò¼¤»îʱִÐÐÒ»´Î£¬³ÌÐò³õʼ»¯µÄ²¿·ÝÏñÊÇÄÚ´æµÄÅäÖ㬽¨Á¢ºÍÊý¾Ý¿âµÄÁª»úµÈ¶¼¿ÉÒÔдÔÚÕâÀï¡£
¶ø Start of response loop µ½ End of response loop Ö®¼äµÄ³ÌÐòÔÚÿ´Î·¢ÉúÁª»úÇëÇóʱ¾Í»áÖ´ÐУ¬Õⲿ·ÝµÄ³ÌÐò²ÅÊÇÕæÕý´¦Àíÿ´ÎÁª»úÇëÇóÒª×öµÄÊÂÇé¡£ÀýÈç½ÓÊÜʹÓÃÕßÊäÈëµÄ²ÎÊý£¬´ÓÊý¾Ý¿âÈ¡³ö×ÊÁÏ£¬Ö´ÐÐÔËË㶯×÷£¬»Ø¸´½á¹û¸øÊ¹ÓÃÕߵȵȡ£
Ò»¸ö¼òµ¥µÄ FastCGI ³ÌÐòÈçÏ (tiny-fcgi.c)
#include "fcgi_stdio.h" #include <stdlib.h> void main(void) { /* Initialization Code */ int count = 0; /* Start of response loop */ while(FCGI_Accept() >= 0) { /* body of response loop */ printf("Content-type: text/html\r\n" "\r\n" "<title>FastCGI Hello! (C, fcgi_stdio library)</title>" "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>" "Request number %d running on host <i>%s</i> " "Process ID: %d\n", ++count, getenv("SERVER_NAME"), getpid()); } /* End of response loop */ }
3.2 ÒýÈë fcgi_stdio.h ±êÍ·µµ ¿ªÊ¼×«Ð´Ò»¸öÐ嵀 FastCGI Ó¦ÓóÌÐòʱ£¬±ØÐëÒýÈë fcgi_stdio.h Õâ¸ö±êÍ·µµ£º
#include ``fcgi_stdio.h' Èç¹ûÒª¸Äд¾ÉÓÐµÄ CGI ³ÌÐò³É FastCGI ³ÌÐò£¬Çë°ÑÔ±¾ÒýÈë stdio.h µÄ²¿·Ý»»µô£º
#ifndef FASTCGI #include <stdio.h> #else #include ``fcgi_stdio.h' #endif
ÉÏÃæµÄд·¨ÊÇÀûÓà C µÄǰÖñàÒëÆ÷×ö´¦Àí£¬Èç¹ûÔÚ±àÒëʱ¼ÓÈë -DFASTCGI µÄ²ÎÊýÔòÒýÈë fcgi_stdio.h £¬·´Ö®Ôò·ñ¡£¼ÙÉèÎÒÃÇ°Ñ fcgi_stdio.h ±êÍ·Îļþ·ÅÔÚ /usr/local/include/fastcgi Õâ¸öĿ¼ÏµĻ°£¬ÎªÁËÔÚ±àÒëʱÒýÈë fcgi_stdio.h ±êÍ·µµ£¬Çë¼ÓÈë -I/usr/local/include/fastcgi µÄ²ÎÊý¡£
$ cc -I/usr/local/include/fastcgi -c program.c
×¢Òâ Èç¹ûÄãµÄ³ÌÐòʹÓõ½ÆäËüµÄº¯Ê½¿â£¬ÇëÎñ±Ø¼ì²éÕâЩº¯Ê½¿âÊÇ·ñÓÐʹÓõ½ stdio.h Õâ¸öµµ£¬Èç¹ûÓеϰ±ØÐëÒ»²¢»»³É fcgi_stdio.h¡£¾ÙÀýÀ´Ëµ£¬¼ÙÈçÄãµÄ³ÌÐòÓõ½ GD º¯Ê½¿â4À´²úÉú GIF ͼÐΣ¬Çë¼ÇµÃ°Ñ gd.h ÖÐÒýÈë stdio.h µÄ²¿·Ý»»³É fcgi_stdio.h£¬·ñÔòÓöµ½ IO µÄº¯Ê½Ê±»á·¢Éú´íÎó (Core Dump)¡£
3.3 FastCGI ´¦ÀíÑ»· ÔÚ FastCGI ³ÌÐòÖиºÔð´¦ÀíÁª»úÇëÇóµÄ³ÌÐò£¬±ØÐëÓÃÒ»¸ö while Ñ»·°üÆðÀ´£¬ÀûÓà fcgi_stdio º¯Ê½¿âÖÐµÄ FCGI_Accept() º¯Ê½¿âÀ´ÅжÏÊÇ·ñÓÐеÄÁª»úÇëÇó·¢Éú¡£
FastCGI ³ÌÐò±»¼¤»îºó£¬Ê×ÏȽøÐгõʼ»¯µÄ¶¯×÷£¬Èç±äÁ¿Ðû¸æ¡¢ÄÚ´æÅäÖᢻòÊÇÓëÊý¾Ý¿â½¨Á¢Áª»úµÈ¡£Ö´Ðе½ FCGI_Accept() ʱ³ÌÐò¾Í»áÔÝÍ££¬µÈµ½µ±Ä³Ò»¸öÁª»úÇëÇó·¢Éúʱ£¬FCGI_Accept() »á´«»Ø´óÓÚÁãµÄÖµ£¬³ÌÐò¼´¿Ì½øÈëÑ»·µÄÖ÷Ì壬¿ÉÄÜÊÇÖ´ÐÐ SQL Ö¸ÁÔËËãÒÔ¼°²úÉú HTML µÄÊä³ö¡£´¦ÀíÍêºóÓֻص½ FCGI_Accept() Ñ»·µÄ¿ªÊ¼£¬µÈ´ýÏÂÒ»¸öÁª»úÇëÇó¡£
Óɴ˿ɼû£¬ FastCGI ¼¤»îÖ®ºó£¬Ê¡È¥Ô±¾ CGI ³ÌÐòÖÐ fork£¬ÄÚ´æÅäÖ㬽¨Á¢Êý¾Ý¿âÁª»úµÈ²½Ö裬´¦Àíÿ¸öÁª»úÇëÇóµÄʱ¼ä¼¸ºõµÈÓÚ FCGI_Accept() Õâ¸öÑ»·ÖÐÔËËãËùÐèµÄʱ¼ä¡£Èç¹ûÍ×ÉÆ½«Ã¿´ÎÁª»úÇëÇóʱһÑùµÄ³ÌÐò´úÂë´Ó FCGI_Accept() Ñ»·³é³öÀ´£¬Ö»±£Áôÿ´Î»á²úÉú²»Í¬½á¹ûµÄ²¿·Ý£¬Ôò³ÌÐò´¦Àíÿ´ÎÁª»úÇëÇóµÄʱ¼ä¿ÉÒÔ¸ü¶Ì£¬Õû¸öÍøÕ¾µÄЧÂÊÒ²¿ÉÒÔ´ó·ùµÄÌáÉý¡£
Á˽â FastCGI ³ÌÐòµÄ»ù±¾¼Ü¹¹ºó£¬¿ÉÒÔ·¢ÏÖÒ»°ãµÄ CGI ³ÌÐò£¬Ö»Òª¼ÓÈë FCGI_Accept() Õâ¸ö while Ñ»·ºó£¬´ó¸Å¾Í¿ÉÒÔ±ä³É FastCGI µÄ³ÌÐòÁË¡£
3.4 Á¶½á libfcgi.a º¯Ê½¿â FastCGI ³ÌÐòÒªÁ¶½áµ½ libfcgi.a º¯Ê½¿â²Å¿ÉÕýÈ·²úÉú³öÖ´Ðеµ£¬¼ÙÉè libfcgi.a µÄλÖÃÔÚ /usr/local/lib Õâ¸öĿ¼Ï£¬ÎÒÃÇÔÚ±àÒë (Á¶½áʱ) Òª¼ÓÈë -L/usr/local/lib -lfcgi µÄ²ÎÊý¡£
$ cc -o program.fcg program.o -L/usr/local/lib -lfcgi
3.5 ׫д FastCGI ³ÌÐòµÄ×¢ÒâÊÂÏî ÓÉÓÚ FastCGI ³ÌÐò±»¼¤»îºó¾Í³£×¤ÔÚÄÚ´æÖ®ÖУ¬¶Ôÿ¸ö FastCGI µÄÖ´ÐÐÐÐ³Ì (running process) ¶øÑÔ£¬Ã¿´ÎÁª»úÇëÇó¹²ÏíµÄ±äÁ¿¿Õ¼äÊÇÏàͬµÄ£¬ÒòЩѡд FastCGI ³ÌÐòÒªÌØ±ðÁôÒâһЩעÒâÊÂÏî¡£
1. ¼Çס£¬¶Ôÿ¸ö FastCGI ³ÌÐò¶øÑÔ£¬Ö»ÓÐ FCGI_Accept() Ñ»·ÄڵijÌÐò²ÅÊÇÕæÕý´¦Àíÿ´ÎÁª»úÇëÇóµÄÖ÷Ì壬¼ÙÉèÔÚ³ÌÐòÖÐÒª¶ÁÈ¡ºÍ CGI ÓйصĻ·¾³±äÁ¿£¬»òÊÇʹÓÃÕß͸¹ý´°Ìå (form) ËùÊäÈëµÄ×ÊÁÏ£¬±ØÐëÔÚ FCGI_Accept() Ñ»·ÄڲŴ¦Àí¡£ 2. ¶Ôÿ´ÎÁª»úÇëÇó»á¸Ä±äµÄ±äÁ¿£¬±ðÍüÁËÔÚ´¦ÀíеÄÁª»úÇëÇóǰ°Ñ±äÁ¿³õʼ»¯ (³ý·ÇÊÇÓÐÌØÊâÓÃ;) £¬ÒÔ±ÜÃâ±äÁ¿ÖµÔÚ²»Í¬µÄÁª»úÇëÇóÖ®¼ä»¥ÏàÓ°Ïì¡£ 3. ÔÚ FCGI_Accept() Ñ»·ÖÐÅäÖà (allocate) µÄÄÚ´æ±ðÍüÁËÊÍ·Å (free)¡£ÔÚÒ»°ãµÄ CGI ³ÌÐòÖУ¬ Memory Leak ²»ËãÊÇÌ«´óµÄÎÊÌ⣬ÒòΪÿ´¦ÀíÍêÒ»´ÎÁª»úÇëÇó£¬ËùÓÐÓõ½µÄÄÚ´æËæ×Å CGI ³ÌÐòµÄ½áÊøÒ²±»ÊÍ·Å¡£µ«ÊÇ FastCGI ³ÌÐò»áÒ»Ö±³£×¤ÔÚÄÚ´æÖУ¬Èç¹ûÔÚ FCGI_Accept() ÖÐÓÐÅäÖöîÍâµÄÄڴ棬ÔÚÑ»·½áÊøÇ°Ã»ÓÐÊͷŵô£¬Ôòÿ´¦ÀíÒ»´ÎÁª»úÇëÇó¾Í³ÔµôһЩϵͳµÄÄڴ棬¶àÅܼ¸´ÎÏÂÀ´£¬ÏµÍ³×ÊÔ´´ó¸Å¾Í±»ºÄ¹âÁË¡£Memory leak µÄÎÊÌâÊÇ FastCGI ×î³£¼ûµÄ´íÎó£¬ÒªÌرðСÐÄ´¦Àí¡£ 4. FastCGI ³ÌÐòºÍÆäËùÒªÒýÓõÄ×Ó³ÌÐòÖУ¬Óõ½ stdio.h º¯Ê½µÄ²¿·Ý£¬¼ÇµÃÒª¸Ä³É fcgi_stdio.h ¡£·ñÔòµ±³ÌÐòÔÚÓöµ½ IO µÄ¶¯×÷ʱ¾Í»á·¢Éú Core Dump µÄÇé¿ö¡£ 5. ÔÚ FCGI_Accept() Ñ»·ÖÐʹÓà FCGI_Finish() º¯Ê½ÒÔÈ¡´ú exit() º¯Ê½¡£Ô±¾ CGI ³ÌÐòÖз¢Éú´íÎóʱ£¬¿ÉÄÜÖ±½Óºô½Ð exit() º¯Ê½½áÊø CGI Ðг̣¬FastCGI ³ÌÐòÒ²¿ÉÒÔÈç´Ë£¬ÒòΪ mod_fastcgi Ä£¿éÔÚ FastCGI ³ÌÐò·¢Éú´íÎó¶øÒâÍâ½áÊøÊ±£¬»á×Ô¶¯ÔÙ¼¤»îÁíÒ»¸ö FastCGI µÄÐг̡£µ«±È½ÏºÃµÄ×÷·¨ÊǺô½Ð fcgi_stdio.h ÖÐµÄ FCGI_Finish() º¯Ê½£¬ºô½Ð FCGI_Finish() º¯Ê½»áÌø³öĿǰ³ÌÐòÕýÔÚÔËËãÖеÄÑ»·£¬»Øµ½ FCGI_Accept() µÈ´ýÏÂÒ»¸öÁª»úÇëÇó¡£Èç´Ë¿ÉÒÔÊ¡È¥Ò»Ð©ÍøÕ¾·þÎñÆ÷¼¤»îÐ嵀 FastCGI Ðг̵ĸºµ£¡£
----------------------------------------------------------------------------
4. FastCGI Óжà¿ì£¿
¿´Íê°²×° FastCGI µÄ°¢ÅÁÆõÄ£¿é£¬ÒÔ¼°ÎÞÁĵijÌÐòÉè¼Æ×¢ÒâÊÂÏîºó£¬ÎÒÃÇÀ´¿´¿´Ò»Ð©¿ÉÒÔÈÃÈËÕñ·Ü¾«ÉñµÄÊý¾Ý£¬Ð§ÄÜ±È½Ï (bench mark) ×ÜÊǼÆËã»úÍæ¼ÒµÄ×î°® :-)
4.1 ÆÀ±È¹¤¾ß - ApacheBench ÔÚ°¢ÅÁÆõ·þÎñÆ÷µÄÌ×¼þÖУ¬ÓÐÒ»¸ö½Ð×ö ab (ApacheBench) µÄ¹¤¾ß¡£ApacheBench Ö÷ÒªÊÇÓÃÀ´²âÊÔ°¢ÅÁÆõ·þÎñÆ÷Ö´ÐÐЧÂÊÓõģ¬ÎÒÃǾÍÒÔ ApacheBench ×öΪ CGI vs. FastCGI µÄÆÀ±È¹¤¾ß¡£
ApacheBench ¿ÉÒÔÕë¶Ôij¸öÌØ¶¨µÄ URL ·ÂÕæ³öÁ¬ÐøµÄÁª»úÇëÇó£¬Í¬Ê±»¹¿ÉÒÔ·ÂÕæ³öͬʱ¼äµãÊý¸öÏàͬµÄÁª»úÇëÇó£¬Òò´ËÀûÓà ApacheBench ¿É°ïÖúÎÒÃÇÔÚÍøÕ¾¿ª·¢ÆÚ¼ä·ÂÕæÊµ¼ÊÉÏÏß¿ÉÄܵÄÇé¿ö£¬ÀûÓ÷ÂÕæ³öÀ´µÄÊý¾Ý×öΪµ÷Õû·þÎñÆ÷É趨»ò³ÌÐòµÄÒÀ¾Ý¡£ ApacheBench µÄÓ÷¨ÈçÏ£º
Usage: /usr/local/apache/bin/ab [options] [http://]hostname[:port]/path Options are: -n requests Number of requests to perform -c concurrency Number of multiple requests to make -t timelimit Seconds to max. wait for responses -p postfile File containg data to POST -T content-type Content-type header for POSTing -v verbosity How much troubleshooting info to print -w Print out results in HTML tables -x attributes String to insert as table attributes -y attributes String to insert as tr attributes -z attributes String to insert as td or th attributes -V Print version number and exit -k Use HTTP KeepAlive feature -h Display usage information (this message)
¼ÙÉèÎÒÃÇÒª¶Ô echo.fcg ×ö²âÊÔ£¬·ÂÕæ 1000 ´ÎµÄÁª»úÇëÇ󣬶øÇÒͬһʱ¼äÓÐ 20 ¸ö²¢ÐÐµÄ (concurrent) Áª»úÇëÇóµÄÇé¿ö£¬Ö»ÒªÔÚÃüÁîÁÐģʽÏÂÖ´ÐÐ
$ ab -n 1000 -c 20 http://localhost/fcgi-bin/echo.fcg ÉÔµÈÒ»»á£¬ApacheBench »á°Ñ½á¹ûÐã³öÀ´£¬
This is ApacheBench, Version 1.3 Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright (c) 1998-1999 The Apache Group, http://www.apache.org/
Benchmarking localhost (be patient)... Server Software: Apache/1.3.6 Server Hostname: localhost Server Port: 80 Document Path: /fcgi-bin/echo.fcg Document Length: 995 bytes Concurrency Level: 20 Time taken for tests: 6.859 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 1142000 bytes HTML transferred: 995000 bytes Requests per second: 145.79 Transfer rate: 166.50 kb/s received
Connnection Times (ms) min avg max
Connect: 0 4 61 Processing: 62 128 771 Total: 62 132 832
ÒÔÉϽá¹ûÖ¸³ö£¬ÔÚͬʱ¼ä 20 ¸öÁª»úÇëÇó (Concurrency Level) µÄÇé¿öÏ£¬Íê³É 1000 ´ÎµÄÁª»úÇëÇ󣬹²»¨ÁË 6.859 Ãë (Time taken for tests)£¬Òò´ËÕâ¸ö³ÌÐòÿÃëÆ½¾ù¿ÉÒÔ´¦Àí (Requests per second) 145.79 ¸öÁª»úÇëÇó¡£ ÔÚ½ÓÏÂÀ´µÄÆÀ±È²âÊÔÖУ¬ÎÒÃǾÍÒÔÿÃë¿ÉÒÔ´¦ÀíµÄÁª»úÇëÇóÊýÄ¿À´×öΪЧÄÜÆÀ±ÈµÄÒÀ¾Ý¡£
4.2 CGI vs. FastCGI Ç°ÃæÌá¹ýÀûÓà fcgi_stdio.h º¯Ê½¿â±àÒë³öÀ´µÄ FastCGI ³ÌÐòÒ²¼æÈÝÓÚ CGI ģʽ£¬Òò´ËÎÒÃÇÖ»Òª°Ñ fcgi-devkit-2.1 Ì×¼þ¸½µÄ·¶Àý³ÌÐò echo.fcg ¸´ÖƵ½ /cgi-bin Ŀ¼Ï£¬²¢ÇÒ°ÑÎļþÃû¸Ä³É echo.cgi£¬ÕâÖ§·¶Àý³ÌÐò¾Í¿É·Ö±ðÒÔ CGI ģʽºÍ FastCGI ģʽÀ´Ö´ÐУ¬²¢ÇÒ×ö±È½Ï¡£
Ê×ÏÈ·Ö±ð¶Ô CGIģʽִÐÐµÄ http://localhost/cgi-bin/echo.cgi ÒÔ¼° FastCGI ģʽµÄ http://localhost/fcgi-bin/echo.fcg Á¬ÐøËͳö 10, 100, 1000, 10000 ´ÎµÄÁª»úÇëÇ󣬵õ½µÄƽ¾ùÿÃë¿É´¦ÀíµÄÇëÇó (Requests per second) ½á¹ûΪ£º
Áª»úÊýÄ¿ 10 100 1000 10000 CGI 52.63 53.08 52.24 51.49 FastCGI (static mode) 204.08 224.22 146.78 207.14
½ÓÏÂÀ´ÔÙ·Ö±ðÒÔ Concurrency Level Ϊ 10, 50, 100 µÄÇé¿öÏÂ×ö²âÊÔ£¬µÃµ½ Requests per second ½á¹ûΪ£º
Concurrency Áª»úÊýÄ¿ 10 100 1000 10000 10 CGI 38.31 46.55 53.61 55.09 10 FastCGI 185.19 208.33 162.63 177.14 50 CGI 27.25 33.16 50.72 53.99 50 FastCGI 92.59 176.37 196.58 196.88 100 CGI 17.92 24.84 48.14 52.84 100 FastCGI 86.21 187.27 195.54 193.17
ÓÉÉÏÊöÊý¾Ý¿´À´£¬¶Ôͬһ֧³ÌÐò (echo.c) ¶øÑÔ£¬Ê¹Óà FastCGI ģʽÀ´Ö´ÐУ¬ËÙ¶ÈÌáÉýÁË 3-4 ±¶¡£¿É¼ûµÃ FastCGI ¶ÔÍøÕ¾³ÌÐòµÄЧÄÜÌáÉýÉϾßÓÐÏ൱´óµÄÖúÒæ£¬ÓÈÆäµ±Ê¹ÓÃÁ¿ºÜ´óʱ£¬ÆäÐ§Òæ¸ü¼ÓÃ÷ÏÔ¡£
ÒÔÉϵIJâÊÔÌõ¼þ²¢²»ÊÇÊ®·ÖÑϽ÷£¬Ö÷ÒªÔÚÈÃÄãÁ˽âʹÓà FastCGI Ö®ºó¶ÔÓÚЧÄܼ°ËÙ¶ÈÉÏÒ»¸ö¸ÅÀ¨µÄ±È½Ï£¬Ò²Ìṩһ¸ö¿É¹©ÍøÕ¾¿ª·¢Õß¿ÉÒÔÆÀÁ¿µÄÒÀ¾Ý¡£
ʵ¼ÊÉÏ£¬¶ÔÒ»¸ö³õʼ»¯¶¯×÷¸´ÔÓ£¬ÀýÈçÒªÏȺÍÊý¾Ý¿â½¨Á¢Áª»ú£¬»òÊÇÅäÖÃÄڴ棬×ö±äÁ¿³õʼ»¯µÄ³ÌÐòÀ´Ëµ£¬Ê¹Óà FastCGI ¿ÉÒÔ±ÈÔÏÈ CGI ÔÚЧÄÜÉÏÔö¼Ó¸ü¶à£¬Ëٶȸü¿ì¡£¶ø¶ÔÒ»¸öÓÐÊý¾Ý¿â¿ÉÁª»úÊýÄ¿ÏÞÖÆµÄϵͳÀ´Ëµ£¬Ê¹Óà FastCGI ¾ÍºÃÏóÒ»¸ö Application Server Ò»Ñù£¬²»Óõ£ÐÄ CGI Ò»´Î fork Ì«¶à£¬³¬¹ýÁª»úÊýÄ¿ÉÏÏÞ (FastCGI ¿ÉÒÔÉ趨һ´ÎÅܼ¸Ö§)¡£
4.3 ÕÒ³ö Memory Leak ÉÆÓà ApacheBench Õâ¸ö¹¤¾ß£¬»¹¿ÉÒÔ°ïÖúÍøÕ¾³ÌÐò·¢Õ¹ÈËÔ±ÕÒ³öÔÚ FastCGI ³ÌÐòÖÐÒþ²ØµÄ Memory Leak ³ô³æ¡£
ÿһ֧ FastCGI ³ÌÐòÔÚ´¦ÀíÍêÒ»¸öÁª»úÇëÇóºóµÄ×´¿ö¶¼Ó¦¸ÃÏàͬ£¬ÎÒÃÇÀûÓà ApacheBench ¶ÔÓû²âÊԵijÌÐòËͳöÉϰٴλòÉÏǧ´ÎµÄÁª»úÇëÇóÒÔ·ÂÕæÊµ¼ÊÉÏÏßµÄ×´¿ö£¬Èç¹û·¢ÏÖ³ÌÐòÕ¼ÓõÄÄÚ´æÓúÀ´Óú¶à¶øÇÒ²»»á¼õÉٵϰ£¬±íʾ³ÌÐòÓÐ Memory Leak µÄÎÊÌâ¡£
ËäÈ»¶Ô FastCGI ³ÌÐò¶øÑÔ£¬µ±ËüÒ»Ö±²»¶Ï³Ôµôϵͳ×ÊÔ´µ½×ÊÁϺľ¡ºó»á×Ô¶¯Í˳ö (core dump »òÊÇ exit) £¬ÊÍ·ÅËùÕ¼ÓõÄ×ÊÔ´È»ºóÔÙÖØÐ¼¤»î£¬µ«Õ⽫»áÓ°ÏìϵͳÆäËü¹¦ÄܵÄÕý³£ÔË×÷£¬ËùÒÔ׫д FastCGI ³ÌÐòÒ»¶¨ÌرðСÐÄ¡£
----------------------------------------------------------------------------
5. ²Î¿¼ Èç¹ûÄãÏë¸ü½øÒ»²½Á˽â FastCGI £¬ÔÚ FastCGI µÄÊ×Ò³ÉÏ¿ÉÒÔÕÒµ½Ïà¹ØµÄËùÓÐ×ÊÁÏ£¬°üº¬ FastCGI µÄ·¢Õ¹¹æ¸ñ£¬Èí¼þÏÂÔØ£¬ËµÃ÷ÎļþµÈ¡£FastCGI Ê×Ò³µÄÍøÖ·ÊÇ http://www.fastcgi.com/
FastCGI Ò²ÓÐÒ»¸öÓʼþÌÖÂÛÇø (mailing list)£¬Äã¿ÉÒÔ¼Ä email ÖÁ fastcgi-developers-request@idle.com ÔÚÓʼþµÄÖ÷Ö¼ (Subject) ´¦ÌîÉÏ subscribe ¼´¿É¡£µ«ÊÇÔÚ·¢ÎÊ֮ǰ£¬ÇëÏȰÑ˵Ã÷Îļþ»ò°²×°Îļþ¿´Çå³þ£¬»òÊǵ½ÓʼþÌÖÂÛÇøµÄµµ°¸ (mail archive) ÖÐÏÈÕÒÕÒÎÊÌâÊÇ·ñÒѾÓÐÈËÎʹý¶øÇÒÓÐÈ˻شð¹ýÁË£¬ÒÔÃâÀË·ÑÖØ¸´µÄÍøÂç×ÊÔ´¡£Èç¹ûÄã·¢ÏÖÁË mod_fastcgi Ä£¿é»ò fcgi-devkit ·¢Õ¹Ì×¼þµÄ´íÎó»òÑÏÖØµÄÎÊÌ⣬FastCGI µÄ·¢Õ¹Ð¡×é»áºÜÈÈÐĵİïÄãÏë°ì·¨½â¾ö¡£ FastCGI »¹ÓÐÐí¶à²»Í¬µÄÓ÷¨£¬ÒÔ¼°ÌرðµÄÓ¦Ó㬾ÍÓдýÄúÇ××Ôȥ̽Ë÷ÁË¡£Ï£Íû±¾ÎÄÄܰïÖúÓÐÐÄʹÓà FastCGI µÄÅóÓÑ¿ÉÒÔ˳ÀûµØ°²×° FastCGI Ïà¹ØÄ£¿éºÍ³ÌÐò£¬ÈÃÄãµÄÍøÕ¾¶¼ÄÜÈ«ËÙǰ½ø¡£
|