ÉèΪÊ×Ò³
ÁªÏµÕ¾³¤
¼ÓÈëÊÕ²Ø

ÄúµÄλÖ㺡¡Ê×Ò³>>ITÒµ½ç>>»¥ÁªÍø>>ÕýÎÄ
¡¡ÊµÕ½ FastCGI
¡¡ÈÕÆÚ£º2005-7-16 12:08:26  À´Ô´:100down.com
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/htmlrn"
"rn"
"<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: %dn",
++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 ? 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright ? 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 Ïà¹ØÄ£¿éºÍ³ÌÐò£¬ÈÃÄãµÄÍøÕ¾¶¼ÄÜÈ«ËÙǰ½ø¡£

Ïà¹ØÎÄÕÂ

¡¤PERL5ÖÐÔõÑùÕÒµ½Ò»ÄêÖеÄÐÇÆÚºÍÒ»
¡¤½«PerlÎļþµÄÊôÐÔÉè³É777ÊÇʲôÒâ
¡¤CGI±à³ÌµÄ°²È«ÐÔ -- ÎļþÃû
¡¤CGI °²È«ÎÊÌâ
¡¤Perl CGI±à³Ì°²È«µãµÎ
¡¤windowsÏÂPerl¿ª·¢»·¾³µÄ°²×°ºÍÅä
¡¤±¾»úµ÷ÊÔWebÓ¦ÓóÌÐòµÄ¼¸ÖÖ·½·¨
¡¤ÈçºÎ°²×°DBIºÍDBD°ü
¡¤ÈçºÎÔÚWindows NT 4.0ϰ²×°Acti
¡¤WIN9Xϵͳϵ÷ÊÔLINUX²Ù×÷ϵͳÏÂ


ÔĶÁÅÅÐÐ

¡¤Win 2000²»ÄÜ·ÃÎÊWin XPµÄÔ­Òò¼°
¡¤½âÎöWindowsÖеÄÕÊ»§ºÍȨÏÞ¹¦ÄÜ
¡¤ÈçºÎ¹²ÏíWindows XP²Ù×÷ϵͳ
¡¤Windows XP Service Pack 1
¡¤Í¨¹ý Windows XP ×¢²á±í×Ô¶¨ÒåÄú
¡¤Windows 2000 TCP/IPЭÒé¸ÅÊö
¡¤Windows 2000 Server TCP/IPЭÒé
¡¤dos³£ÓÃÃüÁîʹÓÃ˵Ã÷
¡¤Windows±äÂýÔ­Òò·ÖÎö¼°½â¾ö·½·¨(
¡¤Windows±äÂýÔ­Òò·ÖÎö¼°½â¾ö·½·¨(
¡¤WINXPÏÂÇ¿Ðйرա°É±¡±²»Á˵Ľø³Ì
¡¤Windows XPϵͳע²á±íµÄ»Ö¸´

×îÐÂÎĵµ

¡¤´´Òµ¼¤ÇéÐèÀä¾² ÍøÂç´úÀíÑ¡ÔñÓ¦Àí
¡¤ÓòÃû½»Òׯ½Ì¨Ø½Ðè¹æ·¶ Ô¤·ÀÓòÃûÂò
¡¤TravelÂÃÓÎÓòÃû¼´½«Òý·¢ÇÀ×¢³± 
¡¤´ÓÔ­ÀíÉî´¦·ÖÎöÈçºÎÔ¤·Àarp¹¥»÷
¡¤Í»ÆÆ½¨Õ¾±×¶Ë ÆóÒµÍøÂçÓªÏú´óÓпÉ
¡¤ÈçºÎÇø·Ö½ø³ÌºÍ²¡¶¾£¿
¡¤javaµÄ»ù´¡ÖªÊ¶,ÈçºÎѧºÃjava
¡¤Î¢»úÔ­ÀíÓë½Ó¿Ú¼¼Êõ»ù´¡ÖªÊ¶
¡¤ÈçºÎ½â¾öÇàÉÙÄê³ÁÃÔÍøÂçµÄÎÊÌ⣬
¡¤È«Ãæ·ÖÎöÖ÷°åBIOS±¨¾¯ÐźÅ

ÇëÄú×¢Ò⣺
¡¤×ðÖØÍøÉϵÀµÂ£¬×ñÊØÖлªÈËÃñ¹²ºÍ¹úµÄ¸÷ÏîÓйط¨ÂÉ·¨¹æ
¡¤ÄúÔÚ±¾Õ¾·¢±íµÄ×÷Æ·£¬±¾Õ¾ÓÐȨÔÚÍøÕ¾ÄÚ×ªÔØ»òÒýÓÃ
¡¤ÆäËûÍøÕ¾Èç¹ûÐèÒª×ªÔØ ±¾Õ¾ÎÄÕÂÇëÔÚ¹óÕ¾ÖøÃûÀ´Ô´£¬Ð»Ð»ºÏ×÷