ãã®èšäºã§ã¯ãFastCGIãããã³ã«ãšãã®æäœæ¹æ³ã«ã€ããŠã話ããããšæããŸãã ãããã³ã«èªäœãšãã®å®è£ ã¯1996幎ã«ç»å Žãããšããäºå®ã«ããããããããã®ãããã³ã«ã®è©³çŽ°ãªããã¥ã¢ã«ã¯ãããŸãããéçºè ã¯ç¬èªã®ã©ã€ãã©ãªãžã®åç §ãäœæããŠããŸããã ãããã2幎åããã®ãããã³ã«ã䜿ãå§ããã°ããã®ãšããããã®ã©ã€ãã©ãªã®äœ¿ãæ¹ãããããããªãããšãããã¬ãŒãºãããèŠãããŸããã ç§ãä¿®æ£ãããã®ã¯ãã®æ¬ ç¹ã§ãããã«ãã¹ã¬ããããã°ã©ã ã§ã®ãã®ãããã³ã«ã®äœ¿çšã«é¢ãã詳现ãªã¬ã€ããšã誰ãã䜿çšã§ããããŸããŸãªãã©ã¡ãŒã¿ãŒãéžæããããã®æšå¥šäºé ãæžãããšã§ãã
è¯ããã¥ãŒã¹ã¯ãFastCGIãšCGIã§ã®ããŒã¿ã®ãšã³ã³ãŒãæ¹æ³ã¯åãã§ãããéä¿¡æ¹æ³ã®ã¿ãå€æŽãããããšã§ããCGIããã°ã©ã ãæšæºã®I / Oã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããå ŽåãFastCGIããã°ã©ã ã¯ãœã±ããã䜿çšããŸãã èšãæãããšãFastCGIãæäœããããã«ã©ã€ãã©ãªã®ããã€ãã®æ©èœãåŠçããã ãã§ãCGIããã°ã©ã ãäœæããçµéšã掻çšããã ãã§ã幞ããªããšã«ãå€ãã®äŸããããŸãã
ãã®ããããã®èšäºã§ã¯æ¬¡ã®ããšãæ€èšããŸãã
-FastCGIãšã¯äœã§ãããCGIãããã³ã«ãšã¯ã©ã®ããã«éããŸãã
-Webéçºçšã«ãã§ã«å€ãã®èšèªãããå Žåã«FastCGIãå¿ èŠãªçç±
-FastCGIãããã³ã«ã®å®è£ ã¯äœã§ãã
-ãœã±ãããšã¯
-FastCGIã©ã€ãã©ãªã®æ©èœã®èª¬æ
-ãã«ãã¹ã¬ããFastCGIããã°ã©ã ã®ç°¡åãªäŸ
-ã·ã³ãã«ãªNginxã®æ§æäŸ
æ®å¿µãªãããåå¿è ã«ãåçã«ç解ã§ããçµéšè±å¯ãªããã©ã³ã«ãšã£ãŠãèå³æ·±ãèšäºãæžãããšã¯éåžžã«é£ããã®ã§ãå¯èœãªéã詳现ã«ãã¹ãŠã®ãã€ã³ããã«ããŒããããã«ããŸããããªããèå³ã®ãªãã»ã¯ã·ã§ã³ãåã«ã¹ãããããããšãã§ããŸãã
FastCGIãšã¯äœã§ããïŒ
Wikipedia㧠FastCGIã«ã€ããŠèªãããšãã§ããŸãã äžèšã§èšãã°ãããã¯ã«ãŒãã§å®è¡ãããCGIããã°ã©ã ã§ãã æ°ãããªã¯ãšã¹ãããšã«éåžžã®CGIããã°ã©ã ãåèµ·åããããšãFastCGIããã°ã©ã ã¯é çªã«åŠçããããªã¯ãšã¹ãã®ãã¥ãŒã䜿çšããŸãã ä»ãæ³åããŠã¿ãŠãã ããïŒ300ãã500ã®åæãªã¯ãšã¹ãã4-8ã³ã¢ãµãŒããŒã«å°çããŸããã ãããã®åã300ã500åãå®è¡ããéåžžã®CGIããã°ã©ã ãèµ·åãããŸãã æããã«ãããã»ã¹ãå€ããã-ãµãŒããŒã¯ç©ççã«äžåºŠã«ãã¹ãŠãåŠçããããšã¯ã§ããŸããã ãã®ãããããã»ããµæéã®éãåŸ ã€ããã»ã¹ã®ãã¥ãŒãååŸããŸãã éåžžãã¹ã±ãžã¥ãŒã©ã¯ããã»ããµãåçã«åæ£ããŸãïŒãã®å Žåããã¹ãŠã®ããã»ã¹ã®åªå é äœã¯åãã§ãïŒãã€ãŸãããªã¯ãšã¹ãã«å¯ŸããŠ300ã500ã®ãã»ãŒæºåå®äºãã®å¿çããããŸãã ã©ããã楜芳çã§ã¯ãªãããã«èãããŸããïŒ FastCGIããã°ã©ã ã§ã¯ããããã®åé¡ã¯ãã¹ãŠåçŽãªèŠæ±ãã¥ãŒã«ãã£ãŠè§£æ±ºãããŸãïŒã€ãŸããèŠæ±ã®å€éåãé©çšãããŸãïŒã
PHPãRubyãPythonãPerlãªã©ããã§ã«ååšããã®ã«ããªãFastCGIãå¿ èŠãªã®ã§ããïŒ
ããããäž»ãªçç±ã¯ãã³ã³ãã€ã«ãããããã°ã©ã ã解éãããããã°ã©ã ãããéãå®è¡ãããããšã§ãã ããšãã°ãPHPã®å ŽåãAPCãeAcceleratorãXCacheãªã©ãã³ãŒãã®è§£éæéãççž®ããäžé£ã®ã¢ã¯ã»ã©ã¬ãŒã¿ãŒããããŸãã ããããC / C ++ã®å Žåãããã¯åã«å¿ èŠã§ã¯ãããŸããã
2ã€ç®ã®çæç¹ã¯ãåçåä»ããšã¬ããŒãžã³ã¬ã¯ã¿ãŒãå€ãã®ãªãœãŒã¹ãæ¶è²»ããããšã§ãã æã ããããã ããšãã°ãPHPã®æŽæ°é å㯠ãåãéã®ããŒã¿ã«å¯ŸããŠC / C ++ãããçŽ18åã®ã¡ã¢ãª ïŒããŸããŸãªPHPã³ã³ãã€ã«ãªãã·ã§ã³ã«å¿ããŠæ倧35åïŒãå æãããããæ¯èŒç倧ããªããŒã¿æ§é ã®ãªãŒããŒããããèæ ®ããŠãã ããã
第äžã«ãFastCGIããã°ã©ã ã¯ãç°ãªãèŠæ±ã«å ±éã®ããŒã¿ãä¿åã§ããŸãã ããšãã°ãPHPãæ¯åãªã¯ãšã¹ããæåããåŠçããå ŽåãFastCGIããã°ã©ã ã¯ãã¡ã¢ãªã®å²ãåœãŠãé »ç¹ã«äœ¿çšãããããŒã¿ã®ããŒããªã©ãæåã®ãªã¯ãšã¹ããå°çããåã§ãå€ãã®æºåã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãã -æããã«ãããã¯ãã¹ãŠãã·ã¹ãã å šäœã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
4ã€ç®ã¯ã¹ã±ãŒã©ããªãã£ã§ãã mod_phpãApache WebãµãŒããŒãšPHPãåããã·ã³äžã«ãããšæ³å®ããŠããå ŽåãFastCGIã¢ããªã±ãŒã·ã§ã³ã¯TCPãœã±ããã䜿çšã§ããŸãã ã€ãŸãããããã¯ãŒã¯ãä»ããŠéä¿¡ããè€æ°ã®ãã·ã³ã®ã¯ã©ã¹ã¿å šäœãäœæã§ããŸãã åæã«ãFastCGIã¯Unixãã¡ã€ã³ãœã±ããããµããŒãããŠãããããå¿ èŠã«å¿ããŠåããã·ã³ã§FastCGIã¢ããªã±ãŒã·ã§ã³ãšWebãµãŒããŒãå¹ççã«å®è¡ã§ããŸãã
5çªç®ã¯ã»ãã¥ãªãã£ã§ãã ä¿¡ããããªããããããŸããããApacheã§ã¯ããã©ã«ãã®èšå®ã§äžçäžã®ãã¹ãŠã®ããšãã§ããŸãã ããšãã°ãæ»æè ãæªæã®ããexploit.php.jpgã¹ã¯ãªããããç¡å®ã®ç»åããè£ ã£ãŠãµã€ãã«ã¢ããããŒãããããããã©ãŠã¶ã§éããšãApacheã¯æªæã®ããphpã³ãŒãããæ£çŽã«ãå®è¡ããŸãã ããããå¯äžã®ä¿¡é Œã§ãã解決çã¯ãããŠã³ããŒãããããã¡ã€ã«ã®ååïŒãã®å Žåã¯phpãphp4ãphp5ãphtmlãªã©ïŒããæœåšçã«å±éºãªæ¡åŒµåããã¹ãŠåé€ãŸãã¯å€æŽããããšã§ãã ãã®ãããªææ³ã¯ãããšãã°Drupalã§äœ¿çšãããŸããã¢ã³ããŒã¹ã³ã¢ããã¹ãŠã®ãè¿œå ãæ¡åŒµæ©èœã«è¿œå ãããexploit.php_.jpgãååŸãããŸãã 確ãã«ãã·ã¹ãã 管çè ã¯è¿œå ã®ãã¡ã€ã«æ¡åŒµåãphpãã³ãã©ãšããŠè¿œå ã§ããããã.htmlãçªç¶ã²ã©ãã»ãã¥ãªãã£ããŒã«ã«ãªãå¯èœæ§ãããããšã«æ³šæããå¿ èŠããããŸãã顧客ã奜ãã§ã¯ãªãã£ãã ããã§ã¯ãFastCGIã¯ã»ãã¥ãªãã£ã«é¢ããŠäœãæäŸããŸããïŒ ãŸããApacheã®ä»£ããã«Nginx WebãµãŒããŒã䜿çšãããšãéçãã¡ã€ã«ãç°¡åã«é åžãããŸãã ãã€ã³ãã èšãæãããšãexploit.php.jpgãã¡ã€ã«ã¯ãµãŒããŒåŽã§äœãåŠçããã«ãçŸç¶ã®ãŸãŸãæäŸããããããæªæã®ããã¹ã¯ãªãããèµ·åããŠãæ©èœããŸããã 第äºã«ãFastCGIããã°ã©ã ãšWebãµãŒããŒã¯ç°ãªããŠãŒã¶ãŒããåäœããããšãã§ããŸããã€ãŸãããã¡ã€ã«ãšãã©ã«ããŒã«å¯Ÿããç°ãªãæš©éãæã¡ãŸãã ããšãã°ãWebãµãŒããŒã¯ããŠã³ããŒãããããã¡ã€ã«ã®ã¿ãèªã¿åãããšãã§ããŸã-ããã¯éçããŒã¿ãè¿ãã®ã«ååã§ãããFastCGIããã°ã©ã ã¯ããŠã³ããŒãããããã¡ã€ã«ãå«ããã©ã«ããŒã®å 容ãèªã¿åãããã³å€æŽããã ãã§ãã€ãŸããæªæã®ããã³ãŒããå®è¡ã§ããªãããšãæå³ããŸãã 3çªç®ã«ãFastCGIããã°ã©ã ã¯ãWebãµãŒããŒã®chroot以å€ã®chrootã§å®è¡ã§ããŸãã chrootïŒã«ãŒããã£ã¬ã¯ããªã®å€æŽïŒèªäœã«ãããããã°ã©ã ã®æš©éãå³ããå¶éã§ããŸããã€ãŸããããã°ã©ã ã¯æå®ããããã£ã¬ã¯ããªå€ã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããªããããã·ã¹ãã ã®å šäœçãªã»ãã¥ãªãã£ã匷åã§ããŸãã
FastCGIããµããŒãããWebãµãŒããŒã¯ã©ããéžæããã®ãé©åã§ããïŒ
èŠããã«ãç§ã¯Nginxã䜿çšããŠããŸãã äžè¬ã«ãåçšãµãŒããŒãå«ããFastCGIããµããŒããããµãŒããŒã¯ããªããããŸãã®ã§ãããã€ãã®ä»£æ¿æ¡ãèããŠã¿ãŸãããã
Apacheã¯ããããæåã«æãæµ®ãã¶ãã®ã§ãããNginxãããå€ãã®ãªãœãŒã¹ãæ¶è²»ããŸãã ããšãã°ã10,000ã®éã¢ã¯ãã£ããªHTTPããŒãã¢ã©ã€ãæ¥ç¶ã®å ŽåãNginxã¯çŽ2.5Mã®ã¡ã¢ãªãæ¶è²»ããŸãããããã¯æ¯èŒç匱ããã·ã³ã§ãéåžžã«çŸå®çã§ãããApacheã¯æ°ããæ¥ç¶ããšã«æ°ããã¹ã¬ãããäœæããããšãäœåãªããããããã10,000ã¹ã¬ããã¯çŽ æŽãããã§ãã
Lighttpd-ãã®WebãµãŒããŒã®äž»ãªæ¬ ç¹ã¯ããã¹ãŠã®èŠæ±ãåäžã®ã¹ã¬ããã§åŠçããããšã§ãã ããã¯ãã¹ã±ãŒã©ããªãã£ã«åé¡ãããå¯èœæ§ãããããšãæå³ããŸããææ°ã®ããã»ããµã®4ã8ã³ã¢ãã¹ãŠã䜿çšããããšã¯ã§ããŸããã 2çªç®-äœããã®çç±ã§WebãµãŒããŒãããŒããã³ã°ããå ŽåïŒããšãã°ãããŒããã£ã¹ã¯ããã®å¿çãé·æéåŸ æ©ããããïŒããµãŒããŒå šäœã "ãã³ã°"ããŸãã èšãæããã°ãä»ã®ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã¯ã1ã€ã®é ãèŠæ±ã®ããã«å¿çã®åä¿¡ãåæ¢ããŸãã
å¥ã®åè£ã¯ãã§ãããŒã§ãã éçºè ã«ãããšãå Žåã«ãã£ãŠã¯NginxãLighttpdãããé«éã§ãã
FastCGIãããã³ã«ã®å®è£ ãšã¯äœã§ããïŒ
çŸåšãFastCGIãããã³ã«ã«ã¯2ã€ã®å®è£ ããããŸããFastCGIãããã³ã«ã®äœæè ãäœæããlibfcgi.libã©ã€ãã©ãªãšã Fastcgi ++ -C ++ã¯ã©ã¹ã©ã€ãã©ãªã§ãã Libfcgiã¯1996幎ããéçºãããŠãããå ¬éåžå Žã«ãããšéåžžã«å®å®ããŠãããããã«äžè¬çã§ããããããã®èšäºã§äœ¿çšããŸãã ã©ã€ãã©ãªã¯Cã§èšè¿°ãããŠãããããC ++ã®çµã¿èŸŒã¿ãã©ãããŒãã¯é«ã¬ãã«ãšã¯èšããªããããCã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŸãã
ã©ã€ãã©ãªèªäœã®ã€ã³ã¹ããŒã«ãåæ¢ããŠãæå³ããªããšæããŸããã¡ã€ã¯ãã¡ã€ã«ãå«ãŸããŠããã®ã§ãåé¡ã¯ãªãã¯ãã§ãã ããã«ãäžè¬çãªãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã¯ããã®ã©ã€ãã©ãªã¯ããã±ãŒãžããå ¥æã§ããŸãã
ãœã±ãããšã¯äœã§ããïŒ
ãœã±ããã®äžè¬çãªæŠå¿µã¯ã Wikipediaã§å ¥æã§ããŸãã äžèšã§èšãã°ããœã±ããã¯ããã»ã¹ééä¿¡ã®æ¹æ³ã§ãã
ç§ãã¡ãæãåºãããã«ãçŸä»£ã®ãã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¯ãåããã»ã¹ã¯ç¬èªã®ã¢ãã¬ã¹ç©ºéã䜿çšããŸãã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã«ãŒãã«ã¯ãRAMãžã®çŽæ¥ã¢ã¯ã»ã¹ãæ åœããããã°ã©ã ãååšããªãïŒãã®ããã°ã©ã ã®ã³ã³ããã¹ãå ã®ïŒã¡ã¢ãªã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ãããšãã«ãŒãã«ã¯ã»ã°ã¡ã³ããŒã·ã§ã³ãšã©ãŒïŒã»ã°ã¡ã³ããŒã·ã§ã³ãšã©ãŒïŒãè¿ããããã°ã©ã ãéããŸãã ããã¯ãã°ãããããšã§ããçŸåšãããããã°ã©ã ã®ãšã©ãŒã¯ä»ã®ããã°ã©ã ã«å®³ãåãŒãããšã¯ã§ããŸããã ããããããã°ã©ã ã«ã¯ç°ãªãã¢ãã¬ã¹ç©ºéããããããå ±æããŒã¿ããã®ããŒã¿äº€æãããŒã¿äº€æãã§ããŸããã ããããã°ã©ã ããå¥ã®ããã°ã©ã ã«ããŒã¿ãæ¬åœã«è»¢éããå¿ èŠãããå Žåã¯ãã©ãããã°ããã§ããïŒ å®éããã®åé¡ã解決ããããã«ããœã±ãããéçºãããŸããã2ã€ä»¥äžã®ããã»ã¹ïŒèªã¿åãïŒããã°ã©ã ïŒãåããœã±ããã«æ¥ç¶ããããŒã¿äº€æãéå§ããŸãã ããã¯å¥ã®äžçãžã®äžçš®ã®ãçªãã§ããããšãããããŸã-ãããéããŠãããªãã¯ä»ã®ã¹ããªãŒã ã«ããŒã¿ãéåä¿¡ã§ããŸãã
æ¥ç¶ã®äœ¿çšã¿ã€ãã«å¿ããŠããœã±ããã¯ç°ãªããŸãã ããšãã°ãTCPãœã±ããããããŸããéåžžã®ãããã¯ãŒã¯ã䜿çšããŠããŒã¿ã亀æããŸããã€ãŸããããã°ã©ã ã¯ç°ãªãã³ã³ãã¥ãŒã¿ãŒã§å®è¡ã§ããŸãã 2çªç®ã«äžè¬çãªãªãã·ã§ã³-Unixãã¡ã€ã³ãœã±ããïŒUnixãã¡ã€ã³ãœã±ããïŒ-ã¯ãåããã·ã³å ã§ã®ã¿ããŒã¿äº€æã«é©ããŠããããã¡ã€ã«ã·ã¹ãã ã®éåžžã®ãã¹ã®ããã«èŠããŸãããå®éã®ããŒããã©ã€ãã¯äœ¿çšãããŸãã-ãã¹ãŠã®ããŒã¿äº€æã¯RAMã§è¡ãããŸãã ãããã¯ãŒã¯ã¹ã¿ãã¯ã䜿çšããå¿ èŠããªããšããäºå®ã«ãããTCPãœã±ãããããå€å°éãïŒçŽ10ïŒ ïŒåäœããŸãã Windowsã®å Žåããã®ãœã±ãããªãã·ã§ã³ã¯ååä»ããã€ããšåŒã°ããŸãã
GNU / Linuxã®ãœã±ããã®äœ¿çšäŸã¯ã ãã®èšäºã«èšèŒãããŠããŸã ã ãœã±ããããŸã 䜿çšããŠããªãå Žåã¯ããœã±ãããããç解ããããšããå§ãããŸããããã¯å¿ é ã§ã¯ãããŸããããããã§èª¬æããäºé ã®ç解ãæ·±ããããšãã§ããŸãã
libfcgiã©ã€ãã©ãªã®äœ¿çšæ¹æ³ã¯ïŒ
ããã§ããã«ãã¹ã¬ããFastCGIã¢ããªã±ãŒã·ã§ã³ãäœæãããã®ã§ãæãéèŠãªæ©èœã®ããã€ãã説æããŸãã
ãŸããã©ã€ãã©ãªãåæåããå¿ èŠããããŸãã
int FCGX_Init(void);
泚æïŒ ãã®é¢æ°ã¯ããã®ã©ã€ãã©ãªã®ä»ã®é¢æ°ã®åã«äžåºŠã ãåŒã³åºãå¿ èŠããããŸãïŒä»»æã®æ°ã®ã¹ã¬ããã«å¯ŸããŠäžåºŠã ãïŒã
次ã«ããªã¹ãã³ã°ãœã±ãããéãå¿ èŠããããŸãã
int FCGX_OpenSocket(const char *path, int backlog);
ãã¹å€æ°ã«ã¯ããœã±ããæ¥ç¶æååãå«ãŸããŠããŸãã Unixãã¡ã€ã³ãœã±ãããšTCPãœã±ããã®äž¡æ¹ããµããŒããããŠãããã©ã€ãã©ãªã¯ãã©ã¡ãŒã¿ã®æºåãšé¢æ°èªäœã®åŒã³åºãã«å¿ èŠãªãã¹ãŠã®äœæ¥ãè¡ããŸãã
Unixãã¡ã€ã³ãœã±ããã®æ¥ç¶æååã®äŸïŒ
"/tmp/fastcgi/mysocket" "/tmp/fcgi_example.bare.sock"
ããã§ã¯ãã¹ãŠãæ確ã ãšæããŸãïŒãœã±ãããšããåããããã¹ãŠã®ããã»ã¹ãããã«ã¢ã¯ã»ã¹ã§ããå¿ èŠããããŸãããæååã®åœ¢ã§äžæã®ãã¹ãæž¡ãã ãã§ãã ç¹°ãè¿ããŸããããã®æ¹æ³ã¯1å°ã®ã³ã³ãã¥ãŒã¿ãŒã®ãã¬ãŒã ã¯ãŒã¯å ã§ã®ã¿æ©èœããŸãããTCPãœã±ãããããå€å°é«éã§ãã
TCPãœã±ããã®æ¥ç¶æååã®äŸïŒ
":5000" ":9000"
ãã®å Žåãæå®ãããããŒãïŒãã®å Žåã¯ãããã5000ãŸãã¯9000ïŒã§TCPãœã±ãããéããããã¹ãŠã®IPã¢ãã¬ã¹ããèŠæ±ãåãå ¥ããããŸãã 泚æïŒ ãã®æ¹æ³ã¯æœåšçã«å®å šã§ã¯ãããŸããããµãŒããŒãã€ã³ã¿ãŒãããã«æ¥ç¶ãããŠããå ŽåãFastCGIããã°ã©ã ã¯ä»ã®ã³ã³ãã¥ãŒã¿ãŒããã®èŠæ±ãåãå ¥ããŸãã ããã¯ãæ»æè ããã¹ããã±ãŒãžãFastCGIããã°ã©ã ã«éä¿¡ã§ããããšãæå³ããŸãã ãã¡ãããããã«ã¯è¯ãããšã¯äœããããŸãã-æè¯ã®å Žåãããã°ã©ã ã¯åã«ã¯ã©ãã·ã¥ãããµãŒãã¹æåŠïŒå¿ èŠã«å¿ããŠDoSæ»æïŒãææªã®å Žåããªã¢ãŒãã³ãŒãå®è¡ïŒããããŸã£ãã幞éã§ãªãå ŽåïŒã«ãªãå¯èœæ§ããããããåžžã«å¶éããŸããã¡ã€ã¢ãŠã©ãŒã«ïŒãã¡ã€ã¢ãŠã©ãŒã«ïŒã䜿çšããŠãã®ãããªããŒãã«ã¢ã¯ã»ã¹ããFastCGIããã°ã©ã ã®éåžžã®æäœäžã«å®éã«äœ¿çšãããIPã¢ãã¬ã¹ã«ã®ã¿ã¢ã¯ã»ã¹ãèš±å¯ããå¿ èŠããããŸãïŒãæ瀺çã«èš±å¯ãããŠããªããã¹ãŠãçŠæ¢ããšããååïŒã
次ã®æ¥ç¶æååã®äŸïŒ
"*:5000" "*:9000"
ãã®æ¹æ³ã¯ä»¥åã®æ¹æ³ãšãŸã£ããåãã§ããTCPãœã±ããã¯ä»»æã®IPã¢ãã¬ã¹ããã®æ¥ç¶ã§éãããããããã®å Žåã¯ãã¡ã€ã¢ãŠã©ãŒã«ãæ éã«æ§æããå¿ èŠããããŸãã ãã®æ¥ç¶æååããã®å¯äžã®ãã©ã¹ã¯çŽç²ã«ç®¡çè ã§ã-æ§æãã¡ã€ã«ãèªã¿åãããã°ã©ããŒãŸãã¯ã·ã¹ãã 管çè ã¯ãããã°ã©ã ãä»»æã®IPã¢ãã¬ã¹ããã®æ¥ç¶ãåãå ¥ããããšãç解ãããããä»ã®ãã¹ãŠãçããå Žåã¯ãåã®ããŒãžã§ã³ãããããŒã¿ãåªå ããããšããå§ãããŸãã
ããå®å šãªãªãã·ã§ã³ã¯ãæ¥ç¶æååã§IPã¢ãã¬ã¹ãæ瀺çã«æå®ããããšã§ãã
"5.5.5.5:5000" "127.0.0.1:9000"
ãã®å Žåãæå®ãããIPã¢ãã¬ã¹ïŒãã®å Žåããããã5.5.5.5ãŸãã¯127.0.0.1ïŒããã®ã¿èŠæ±ãåãå ¥ããããä»ã®ãã¹ãŠã®IPã¢ãã¬ã¹ïŒãã®å Žåããããã5000ãŸãã¯9000ïŒã¯éããããŸãã ããã«ãããã·ã¹ãã ã®å šäœçãªã»ãã¥ãªãã£ãåäžãããããå¯èœãªå Žåã¯åžžã«ãã®åœ¢åŒã®æååãTCPãœã±ãããžã®æ¥ç¶ã«äœ¿çšããŸããã·ã¹ãã 管çè ããã¡ã€ã¢ãŠã©ãŒã«ã®èšå®ããå¿ãããå Žåã¯ã©ããªããŸããïŒ 2çªç®ã®äŸã«æ³šæããŠãã ãããåããã·ã³ïŒlocalhostïŒã®ã¢ãã¬ã¹ã衚瀺ãããŸãã ããã«ãããäœããã®çç±ã§Unixãã¡ã€ã³ãœã±ããã䜿çšã§ããªãå Žåã«ãåããã·ã³äžã«TCPãœã±ãããäœæã§ããŸãïŒããšãã°ãchroot WebãµãŒããŒãšchroot FastCGIããã°ã©ã ã¯ç°ãªããã©ã«ããŒã«ãããå ±éã®ãã¡ã€ã«ãã¹ããªãããïŒ ïŒ æ®å¿µãªããã2ã€ä»¥äžã®ç°ãªãIPã¢ãã¬ã¹ãæå®ããããšã¯ã§ããŸããããããã£ãŠãç°ãªãã³ã³ãã¥ãŒã¿ãŒã«ããè€æ°ã®WebãµãŒããŒããã®èŠæ±ãæ¬åœã«åãå ¥ããå¿ èŠãããå Žåã¯ãããŒããå®å šã«éããŠïŒåã®æ¹æ³ãåç §ïŒãèšå®ã«äŸåããå¿ èŠããããŸããã¡ã€ã¢ãŠã©ãŒã«ããŸãã¯ç°ãªãããŒãã§è€æ°ã®ãœã±ããã䜿çšããŸãã ãŸããlibfcgiã©ã€ãã©ãªã¯IPv6ã¢ãã¬ã¹ããµããŒãããŠããŸããã1996幎ã«ãã®æšæºãçãŸããã°ãããªã®ã§ãé£æ¬²ãéåžžã®IPv4ã¢ãã¬ã¹ã«å¶éããå¿ èŠããããŸãã 確ãã«ãæ¬åœã«IPv6ãµããŒããå¿ èŠãªå Žåã¯ãFCGX_OpenSocketé¢æ°ã«ããããé©çšããããšã§æ¯èŒçç°¡åã«è¿œå ã§ããŸããã©ã€ãã©ãªã©ã€ã»ã³ã¹ã§ã¯ãããèš±å¯ãããŠããŸãã
泚æïŒ ãœã±ãããäœæãããšãã«IPã¢ãã¬ã¹ãæå®ããæ©èœã䜿çšããŠãååãªä¿è·ã§ã¯ãããŸãã-IPã¹ããŒãã£ã³ã°æ»æãå¯èœïŒãã±ããã®éä¿¡è ã®IPã¢ãã¬ã¹ãã¹ããŒãã£ã³ã°ïŒããããããã¡ã€ã¢ãŠã©ãŒã«ã®èšå®ãå¿ èŠã§ãã éåžžãIPã¹ããŒãã£ã³ã°ã«å¯Ÿããä¿è·ãšããŠããã¡ã€ã¢ãŠã©ãŒã«ã¯ãããŒã«ã«ãããã¯ãŒã¯äžã®ãã¹ãŠã®ãã¹ãïŒããæ£ç¢ºã«ã¯ããã¹ããšã®ãããŒããã£ã¹ããã¡ã€ã³ïŒã®ãã±ããã®IPã¢ãã¬ã¹ãšãããã¯ãŒã¯ã«ãŒãã®MACã¢ãã¬ã¹éã®å¯Ÿå¿ããã§ãã¯ãããªã¿ãŒã³ã¢ãã¬ã¹ãæã€ã€ã³ã¿ãŒãããããã®ãã¹ãŠã®ãã±ãããç Žæ£ããŸããã©ã€ããŒãIPã¢ãã¬ã¹ã®ãŸãŒã³ãŸãã¯ããŒã«ã«ãã¹ãïŒãã¹ã¯10.0.0.0/8ã172.16.0.0/12ã192.168.0.0/16ãfc00 :: / 7ã127.0.0.0 / 8ããã³:: 1/128ïŒã«ãããŸãã ããã§ããã©ã€ãã©ãªã®ãã®æ©èœã䜿çšããããšã¯ãªãè¯ãã§ã-ãã¡ã€ã¢ãŠã©ãŒã«ãæ£ããæ§æãããŠããªãå ŽåãTCPãããã³ã«ã«ã¯IPã¹ããŒãã£ã³ã°ã«å¯Ÿããä¿è·ãçµã¿èŸŒãŸããŠãããããåœé IPã¢ãã¬ã¹ãããæ»ã®ãã±ããããéä¿¡ããããšã¯èª°ãããã¯ããã«å°é£ã§ãã
æ¥ç¶æååã®æåŸã®çš®é¡ã¯ããã¹ããã¡ã€ã³åã䜿çšããããšã§ãã
"example.com:5000" "localhost:9000"
ãã®å Žåãæå®ãããã¹ãã®ãã¡ã€ã³åã«åºã¥ããŠIPã¢ãã¬ã¹ãèªåçã«ååŸãããŸãã å¶éã¯åãã§ã-ãã¹ãã«ã¯1ã€ã®IPv4ã¢ãã¬ã¹ãå¿ èŠã§ããããã§ãªãå Žåããšã©ãŒãçºçããŸãã ãã ããFastCGIã®æäœã®æåã«ãœã±ãããäžåºŠäœæããããšããã®æ¹æ³ã¯ããŸã圹ã«ç«ã¡ãŸãã-IPã¢ãã¬ã¹ãåçã«å€æŽããããšã¯ã§ããŸããïŒããæ£ç¢ºã«ã¯ãIPã¢ãã¬ã¹ãå€æŽãããã³ã«FastCGIããã°ã©ã ãåèµ·åããå¿ èŠããããŸãïŒã äžæ¹ãæ¯èŒç倧èŠæš¡ãªãããã¯ãŒã¯ã§ã¯äŸ¿å©ãªå ŽåããããŸãããã¡ã€ã³åãèŠããŠããããšã¯ãIPã¢ãã¬ã¹ãããç°¡åã§ãã
ããã¯ãã°é¢æ°ã®2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ããœã±ããèŠæ±ãã¥ãŒã®é·ãã決å®ããŸãã ç¹å¥ãªå€0ïŒãŒãïŒã¯ããã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ããã©ã«ãã®ãã¥ãŒã®é·ããæå³ããŸãã
WebãµãŒããŒããèŠæ±ãæ¥ããã³ã«ãFastCGIããã°ã©ã ã«ããåŠçãåŸ æ©ããŠããéããã®æ¥ç¶ã«æ°ããæ¥ç¶ã眮ãããŸãã ãã¥ãŒãå®å šã«ãã£ã±ãã®å ŽåãåŸç¶ã®æ¥ç¶èŠæ±ã¯ãã¹ãŠå€±æããŸããWebãµãŒããŒã¯ãæ¥ç¶æåŠå¿çãåä¿¡ããŸãïŒæ¥ç¶ã¯æåŠãããŸãïŒã ååãšããŠãããã«ã¯äœãåé¡ã¯ãããŸãã-Nginx WebãµãŒããŒã«ã¯ç¬èªã®èŠæ±ãã¥ãŒãããã空ããªãœãŒã¹ããªãå Žåãæ°ããèŠæ±ã¯WebãµãŒããŒãã¥ãŒã§æ¢ã«åŠçãããŠããé çªãåŸ ã¡ãŸãïŒå°ãªããšãã¿ã€ã ã¢ãŠãïŒã ããã«ãFastCGIããã°ã©ã ãå®è¡ããŠãããµãŒããŒãè€æ°ããå ŽåãNginxã¯ãã®ãããªèŠæ±ãè² è·ã®å°ãªããµãŒããŒã«è»¢éã§ããŸãã
ããã§ã¯ãã©ã®ãã¥ãŒã®é·ããæé©ããèããŠã¿ãŸãããã äžè¬ã«ãã¹ãã¬ã¹ãã¹ãã®ããŒã¿ã«åºã¥ããŠãã®ãã©ã¡ãŒã¿ãŒãåå¥ã«æ§æããããšããå§ãããŸããããã®å€ã«æé©ãªç¯å²ãè©äŸ¡ããããšããŸãã æåã«ç¥ã£ãŠããã¹ãããšã¯ããã¥ãŒã®æ倧é·ãå¶éãããŠããããšã§ãïŒãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã«ãŒãã«èšå®ãéåžžã¯1024æ¥ç¶ä»¥äžã§æ±ºå®ãããŸãïŒã 2çªç®-ãã¥ãŒã¯ãªãœãŒã¹ãæ¶è²»ããŸãããå®äŸ¡ã§ãããããã§ããªãœãŒã¹ãªã®ã§ãäžåœã«é·ããã䟡å€ã¯ãããŸããã ããã«ãFastCGIããã°ã©ã ã«ã¯8ã€ã®ã¯ãŒã¯ãããŒãããïŒææ°ã®4-8ã³ã¢ããã»ããµã«ãšã£ãŠã¯éåžžã«çŸå®çïŒãåã¹ã¬ããã«ã¯ç¬èªã®æ¥ç¶ãå¿ èŠã§ãããã¿ã¹ã¯ã¯äžŠåã«åŠçãããŸãã ãããã£ãŠãçæ³çã«ã¯ãWebãµãŒããŒããæ¢ã«8ã€ã®ãªã¯ãšã¹ãããããäžèŠãªé 延ãªãã«ãã¹ãŠã®ã¹ã¬ãããæ©èœããããšãä¿èšŒããå¿ èŠããããŸãã ã€ãŸããæå°ãªã¯ãšã¹ããã¥ãŒãµã€ãºã¯ãFastCGIããã°ã©ã ã®ã¯ãŒã¯ã¹ã¬ããã®æ°ã§ãã ãããã¯ãŒã¯äžã§ã®ããŒã¿è»¢éæéã¯æéã§ããããããã®å€ã50ïŒ -100ïŒ å¢ãããŠãèªã¿èŸŒã¿ã®ããã®ããŒãžã³ã確ä¿ããããšãã§ããŸãã
次ã«ããã®æ°éã®äžéãå®çŸ©ããŸãããã ããã§ã¯ãå®éã«åŠçã§ãããªã¯ãšã¹ãã®æ°ãææ¡ãããªã¯ãšã¹ãã®ãã¥ãŒããã®å€ã«å¶éããå¿ èŠããããŸãã ãã®ãã¥ãŒã倧ããããããŠã顧客ãé çªãåŸ ã€ã®ã«é£œã飜ãããçããåŸ ããã«ãµã€ããé¢ããã ãã ãšæ³åããŠãã ããã æããã«ãããã«ã¯äœãè¯ãããšã¯ãããŸãã-WebãµãŒããŒã¯æ¥ç¶ãéãèŠæ±ãéä¿¡ããå¿ èŠããããŸããããããã¯ããèªäœãé«äŸ¡ã§ãããFastCGIããã°ã©ã ããã®èŠæ±ãåŠçããã®ã«ååãªæéãæã£ãŠããªãã£ãããã ãã«ãã®æ¥ç¶ãéããŸã äžèšã§èšãã°ãCPUæéã浪費ããŠããã ãã§ãããããã ãã§ã¯ååã§ã¯ãããŸããã ããããããã¯ææªã®ããšã§ã¯ãããŸãããã¯ã©ã€ã¢ã³ããããªã¯ãšã¹ãã®åŠçãéå§ããããã®ãã£ãŒã«ãã§ãããµã€ãããã®æ å ±ã®åä¿¡ãæåŠããå Žåãããã«æªåããŸãã æ¬è³ªçã«äžå¿ èŠãªèŠæ±ãå®å šã«åŠçããå¿ èŠãããããšãããããŸãããããã¯ç¶æ³ãæªåãããã ãã§ãã çè«çã«ã¯ãã»ãšãã©ã®ã¯ã©ã€ã¢ã³ããããã»ããµã®100ïŒ ã®è² è·ã§å¿çãåŸ ããªãå Žåã«ç¶æ³ãçºçããå¯èœæ§ããããŸãã è¯ããªã
ãããã£ãŠã300ããªç§ïŒã€ãŸã0.3ç§ïŒã§åŠçã§ãã1ã€ã®èŠæ±ããããšããŸãã ããã«ãWebããŒãžã30ç§ä»¥äžèªã¿èŸŒãŸãããšã蚪åè ã®å¹³å50ïŒ ããªãœãŒã¹ãé¢ããããšãããããŸãã æããã«ãäžæºãæã£ãŠãã人ã®50ïŒ ãå€ããããããæ倧ããŒãžèªã¿èŸŒã¿æéã5ç§ã«å¶éããŸãã ããã¯ãã«ã¹ã±ãŒãã¹ã¿ã€ã«ã·ãŒããé©çšããŠJavaScriptãå®è¡ããåŸã®å®å šã«å®æããWebããŒãžãæå³ããŸããå¹³åçãªãµã€ãã§ã®ãã®æ®µéã¯ãWebããŒãžã®åèšèªã¿èŸŒã¿æéã®70ïŒ ãå ããããšããããŸãã ãããã£ãŠããããã¯ãŒã¯çµç±ã§ããŒã¿ãããŠã³ããŒãããããã«æ®ãããã®ã¯5 * 0.3 = 1.5ç§ä»¥äžã§ãã ããã«ãhtmlã³ãŒããã¹ã¿ã€ã«ã·ãŒããã¹ã¯ãªãããããã³ã°ã©ãã£ãã¯ã¹ã¯ç°ãªããã¡ã€ã«ã§éä¿¡ãããæåã«htmlã³ãŒããéä¿¡ããã次ã«ãã¹ãŠãéä¿¡ãããããšã«æ³šæããŠãã ããã ãã ããhtmlã³ãŒããåä¿¡ããåŸããã©ãŠã¶ãŒã¯æ®ãã®ãªãœãŒã¹ã®ãªã¯ãšã¹ãã䞊è¡ããŠéå§ãããããhtmlã³ãŒãã®èªã¿èŸŒã¿æéã¯ããŒã¿ãåä¿¡ããåèšæéã®50ïŒ ãšèŠç©ããããšãã§ããŸãã ãããã£ãŠã1ã€ã®ãªã¯ãšã¹ããåŠçããã®ã«1.5 * 0.5 = 0.75ç§ä»¥äžããæ®ã£ãŠããŸããã å¹³åããŠ1ã€ã®ã¹ã¬ããã0.3ç§ã§ãªã¯ãšã¹ããåŠçããå Žåããã¥ãŒã«ã¯ã¹ã¬ããããã0.75 / 0.3 = 2.5ã®ãªã¯ãšã¹ããå¿ èŠã§ãã 8ã€ã®ã¯ãŒã¯ãããŒããããããçµæã®ãã¥ãŒãµã€ãºã¯2.5 * 8 = 20ãªã¯ãšã¹ãã«ãªããŸãã äžèšã®èšç®ã®èŠåã«æ³šæããŠãã ãã-ç¹å®ã®ãµã€ããããå Žåãèšç®ã§äœ¿çšãããå€ã¯ããæ£ç¢ºã«æ±ºå®ã§ããŸãããããã§ãããæé©ãªããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®åºçºç¹ãšãªããŸãã
ãã®ããããœã±ããèšè¿°åãååŸããŸããããã®åŸããªã¯ãšã¹ãæ§é ã«ã¡ã¢ãªãå²ãåœãŠãå¿ èŠããããŸãã ãã®æ§é ã®èª¬æã¯æ¬¡ã®ãšããã§ãã
typedef struct FCGX_Request { int requestId; int role; FCGX_Stream *in; FCGX_Stream *out; FCGX_Stream *err; char **envp; struct Params *paramsPtr; int ipcFd; int isBeginProcessed; int keepConnection; int appStatus; int nWriters; int flags; int listen_sock; int detached; } FCGX_Request;
泚æïŒ æ°ãããªã¯ãšã¹ããåä¿¡ãããšã以åã®ããŒã¿ã¯ãã¹ãŠå€±ããããããããŒã¿ã®é·æä¿åãå¿ èŠãªå Žåã¯ããã£ãŒãã³ããŒã䜿çšããŸãïŒããŒã¿ãžã®ãã€ã³ã¿ãŒã§ã¯ãªããããŒã¿èªäœãã³ããŒããŸãïŒã
ãã®æ§é ã«ã€ããŠæ¬¡ã®ããšãç¥ã£ãŠããå¿ èŠããããŸãã
-å€æ°inãoutãããã³errã¯ãããããå ¥åãåºåãããã³ãšã©ãŒãããŒã®åœ¹å²ãæãããŸãã å ¥åã¹ããªãŒã ã«ã¯POSTèŠæ±ã®ããŒã¿ãå«ãŸããFastCGIããã°ã©ã ã®å¿çïŒããšãã°ãWebããŒãžã®http-headersããã³html-codeïŒã¯åºåã¹ããªãŒã ã«éä¿¡ããå¿ èŠãããããšã©ãŒã¹ããªãŒã ã¯åã«WebãµãŒããŒããšã©ãŒãã°ã«è¿œå ããŸãã åæã«ããšã©ãŒã¹ããªãŒã ããŸã£ãã䜿çšããå¿ èŠã¯ãããŸããããšã©ãŒããã°ã«èšé²ããå¿ èŠãããå Žåã¯ãããããå¥ã®ãã¡ã€ã«ã䜿çšããããšããå§ãããŸãããããã¯ãŒã¯çµç±ã®ããŒã¿è»¢éãšWebãµãŒããŒã«ããåŸç¶ã®åŠçã¯è¿œå ã®ãªãœãŒã¹ãæ¶è²»ããŸãã
-envpå€æ°ã«ã¯ãããšãã°ãSERVER_PROTOCOLãREQUEST_METHODãREQUEST_URIãQUERY_STRINGãCONTENT_LENGTHãHTTP_USER_AGENTãHTTP_COOKIEãHTTP_REFERERãªã©ãWebãµãŒããŒãšhttpããããŒã«ãã£ãŠèšå®ãããç°å¢å€æ°ã®å€ãå«ãŸããŸãã ãããã®ããããŒã¯ãããããCGIããã³HTTPãããã³ã«æšæºã«ãã£ãŠå®çŸ©ãããŠããŸã;ãããã®äœ¿çšäŸã¯ãCGIããã°ã©ã ã§èŠã€ããããšãã§ããŸãã ããŒã¿èªäœã¯æååã®é åã«æ ŒçŽãããé åã®æåŸã®èŠçŽ ã«ã¯ãé åã®çµããã瀺ããã«ãã€ã³ã¿ãŒïŒNULLïŒãå«ãŸããŸãã åè¡ïŒæååé åã®åèŠçŽ ïŒã«ã¯ãTITLE_VARIABLE = VALUEã®åœ¢åŒã®å€æ°å€ã1ã€å«ãŸããŠããŸããããšãã°ãCONTENT_LENGTH = 0ïŒãã®å Žåããã®ãªã¯ãšã¹ãã®é·ãã¯ãŒãã§ãããããPOSTããŒã¿ã¯ãããŸããïŒã envpæååé åã«å¿ èŠãªããããŒããªãå Žåãæž¡ãããŠããŸããã FastCGIããã°ã©ã ã«æž¡ãããå€æ°ã®ãã¹ãŠã®å€ãååŸããå Žåã¯ãNULLãžã®ãã€ã³ã¿ãŒãèŠã€ãããŸã§ãã«ãŒãå ã®envpé åã®ãã¹ãŠã®è¡ãèªã¿åããŸãã
å®éããã®æ§é ã®èª¬æã§ãããçµäºããŸãããä»ã®ãã¹ãŠã®å€æ°ã¯å¿ èŠãããŸããã
ã¡ã¢ãªãå²ãåœãŠãããã®ã§ãèŠæ±æ§é ãåæåããå¿ èŠããããŸãã
int FCGX_InitRequest(FCGX_Request *request, int sock, int flags);
é¢æ°ãã©ã¡ãŒã¿ãŒã¯æ¬¡ã®ãšããã§ãã
request-åæåãããããŒã¿æ§é ãžã®ãã€ã³ã¿
sockã¯ãFCGX_OpenSocketé¢æ°ãåŒã³åºããåŸã«åãåã£ããœã±ããèšè¿°åã§ãã æ¢è£œã®èšè¿°åã®ä»£ããã«ã0ïŒãŒãïŒãæž¡ããŠããã©ã«ãèšå®ã§ãœã±ãããååŸã§ããŸããããã®æ¹æ³ã¯ãŸã£ããé¢çœããªãããšã«æ³šæããŠãã ãã-ãœã±ããã¯ã©ã³ãã ãªç©ºãããŒãã§éããããããWebãé©åã«æ§æã§ããŸãã-server-ããŒã¿ã®éä¿¡å ãæ£ç¢ºã«äºåã«ç¥ããŸããã
ãã©ã°-ãã©ã°ã å®éããã®é¢æ°ã«æž¡ãããšãã§ãããã©ã°ã¯1ã€ã ãã§ã-FCGI_FAIL_ACCEPT_ON_INTR-äžææã«FCGX_Accept_rãåŒã³åºããªãã§ãã ããã
ãã®åŸãæ°ãããªã¯ãšã¹ããååŸããå¿ èŠããããŸãã
int FCGX_Accept_r(FCGX_Request *request);
ãã®äžã§ãæåŸã®æ®µéã§ãã§ã«åæåãããŠãããªã¯ãšã¹ãæ§é ã転éããå¿ èŠããããŸãã 泚æïŒ ãã«ãã¹ã¬ããããã°ã©ã ã§ã¯ããã®é¢æ°ãåŒã³åºããšãã«åæã䜿çšããå¿ èŠããããŸãã
å®éããã®é¢æ°ã¯ããœã±ããã®åŠçã«é¢ãããã¹ãŠã®äœæ¥ãè¡ããŸããæåã«ã以åã®èŠæ±ïŒååšããå ŽåïŒã§WebãµãŒããŒã«å¿çãéä¿¡ãã以åã®ããŒã¿è»¢éãã£ãã«ãéããŠãããã«é¢é£ãããã¹ãŠã®ãªãœãŒã¹ïŒèŠæ±æ§é å€æ°ãå«ãïŒã解æŸããŸãã次ã«ãæ°ããèŠæ±ãåä¿¡ããæ°ããããŒã¿éä¿¡ãã£ãã«ãéããåŸç¶ã®åŠçã®ããã«èŠæ±æ§é ã«æ°ããããŒã¿ãæºåããŸãã æ°ãããªã¯ãšã¹ãã®åä¿¡ã§ãšã©ãŒãçºçããå Žåãé¢æ°ã¯ãŒãæªæºã®ãšã©ãŒã³ãŒããè¿ããŸãã
次ã«ãããããç°å¢å€æ°ãååŸããå¿ èŠããããŸãããã®ããã«ã¯ãrequest-> envpé åãåå¥ã«åŠçããããé¢æ°ã䜿çšããŸã
char *FCGX_GetParam(const char *name, FCGX_ParamArray envp);
nameã¯ãå€ãåãåãããç°å¢å€æ°ãŸãã¯http-headerã®ååãå«ãæååã§ãã
envp-request-> envpå€æ°ã«å«ãŸããç°å¢å€æ°ã®é å
ãã®é¢æ°ã¯ãå¿ èŠãªç°å¢å€æ°ã®å€ãæååãšããŠè¿ããŸãã 泚ææ·±ãèªè ãchar **ãšFCGX_ParamArrayã®åã®äžäžèŽãæããªãããã«ããŠãã ãã-ãããã®åã¯å矩èªãšããŠå®£èšãããŠããŸãïŒtypedef char ** FCGX_ParamArrayïŒã
ããã«ãããããWebãµãŒããŒã«å¿çãéä¿¡ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãrequest-> outåºåã¹ããªãŒã ãšé¢æ°ã䜿çšããŸã
int FCGX_PutStr(const char *str, int n, FCGX_Stream *stream);
strã¯ãåºåçšã®ããŒã¿ãå«ããããã¡ã§ãçµç«¯ãŒãã¯å«ãŸããŸããïŒã€ãŸãããããã¡ã«ã¯ãã€ããªããŒã¿ãå«ãŸããå ŽåããããŸãïŒã
n-ãã€ãåäœã®ãããã¡é·ã
stream-ããŒã¿ãåºåããã¹ããªãŒã ïŒrequest-> outãŸãã¯request-> errïŒã
çµç«¯ã®ãŒãã§Cã¹ããªã³ã°æšæºã䜿çšããå Žåãé¢æ°ã䜿çšããæ¹ã䟿å©ã§ãã
int FCGX_PutS(const char *str, FCGX_Stream *stream);
strlenïŒstrïŒé¢æ°ã䜿çšããŠæååã®é·ãã決å®ããåã®é¢æ°ãåŒã³åºããŸãã ãããã£ãŠãæååã®é·ããäºåã«ç¥ã£ãŠããå ŽåïŒããšãã°ãC ++ std ::æååæååã䜿çšããå ŽåïŒãå¹çäžã®çç±ããåã®é¢æ°ã䜿çšããããšããå§ãããŸãã
ãããã®é¢æ°ã¯UTF-8æååã§æ£åžžã«æ©èœãããããå€èšèªWebã¢ããªã±ãŒã·ã§ã³ã§åé¡ãçºçããããšã¯ãããŸããã
åããªã¯ãšã¹ãã®åŠçäžã«ãããã®é¢æ°ãè€æ°ååŒã³åºãããšãã§ããŸããããã«ãããããã©ãŒãã³ã¹ãåäžããå ŽåããããŸãã ããšãã°ã倧ããªãã¡ã€ã«ãéä¿¡ããå¿ èŠããããŸãã ããŒããã©ã€ããããã¡ã€ã«å šäœãããŠã³ããŒãããŠããã1ããŒã¹ãã§éä¿¡ãã代ããã«ãããã«ããŒã¿ã®éä¿¡ãéå§ã§ããŸãã ãã®çµæããã©ãŠã¶ã®çœãç»é¢ã®ä»£ããã«ã¯ã©ã€ã¢ã³ãã¯èå³ã®ããããŒã¿ãåä¿¡ãå§ããŸããããã¯çŽç²ã«å¿ççã«åœŒãããå°ãé·ãåŸ ãããŸãã èšãæããã°ãããŒãžãããŒãããæéãããããåã£ãŠããããã§ãã ãŸããã»ãšãã©ã®ãªãœãŒã¹ïŒã«ã¹ã±ãŒãã¹ã¿ã€ã«ã·ãŒããJavaScriptãªã©ïŒã¯WebããŒãžã®å é ã«ç€ºãããŠããŸããã€ãŸãããã©ãŠã¶ãŒã¯htmlã³ãŒãã®äžéšãåæãããããã®ãªãœãŒã¹ãããæ©ãèªã¿èŸŒãããšãã§ããŸã-ããŒã¿ã衚瀺ãããã1ã€ã®çç±éšåçã«ã
次ã«å¿ èŠã«ãªãã®ã¯ãPOSTãªã¯ãšã¹ãã®åŠçã§ãã å€ãååŸããã«ã¯ãé¢æ°ã䜿çšããŠã¹ããªãŒã ã®ãªã¯ãšã¹ãããããŒã¿ãèªã¿åãå¿ èŠããããŸã
int FCGX_GetStr(char * str, int n, FCGX_Stream *stream);
strã¯ãããã¡ãžã®ãã€ã³ã¿ã§ãã
nã¯ããã€ãåäœã®ãããã¡ã®ãµã€ãºã§ãã
stream-ããŒã¿ã®èªã¿åãå ã®ã¹ããªãŒã ã
POSTèŠæ±ã§éä¿¡ãããããŒã¿ã®ãµã€ãºïŒãã€ãåäœïŒã¯ãç°å¢å€æ°CONTENT_LENGTHã䜿çšããŠæ±ºå®ã§ããŸãããã®å€ã¯ãæãåºãããã«ãFCGX_GetParamé¢æ°ã䜿çšããŠååŸã§ããŸãã 泚æïŒ CONTENT_LENGTHå€æ°ã®å€ã«åºã¥ããŠå¶éãªãã§strãããã¡ãŒãäœæããããšã¯éåžžã«æªãèãã§ããæ»æè ã¯ä»»æã®å€§ããªPOSTãªã¯ãšã¹ããéä¿¡ã§ãããµãŒããŒã¯åã«ç©ºãRAMã䜿ãæããå¯èœæ§ããããŸãïŒå¿ èŠã«å¿ããŠDoSæ»æãåããŸãïŒã 代ããã«ããããã¡ãŒã®ãµã€ãºãé©åãªéïŒæ°ãããã€ãããæ°ã¡ã¬ãã€ãïŒã«å¶éããFCGX_GetStré¢æ°ãæ°ååŒã³åºãããšããå§ãããŸãã
æåŸã®éèŠãªé¢æ°ã¯ãåºåã¹ããªãŒã ãšãšã©ãŒã¹ããªãŒã ããã©ãã·ã¥ãïŒãŸã éä¿¡ãããŠããªãã¯ã©ã€ã¢ã³ãããŒã¿ãéä¿¡ããŸãããããåºåã¹ããªãŒã ãšãšã©ãŒã¹ããªãŒã ã«å ¥ããããšãã§ããŸãïŒãæ¥ç¶ãéããŸãã
void FCGX_Finish_r(FCGX_Request *request);
ãã®é¢æ°ã¯ãªãã·ã§ã³ã§ããããšã匷調ããããšæããŸããFCGX_Accept_ré¢æ°ã¯ãã¯ã©ã€ã¢ã³ãã«ããŒã¿ãéä¿¡ããæ°ããèŠæ±ãåä¿¡ããåã«çŸåšã®æ¥ç¶ãéããŸãã åé¡ã¯ããªããããå¿ èŠãªã®ããšããããšã§ããå¿ èŠãªãã¹ãŠã®ããŒã¿ãã¯ã©ã€ã¢ã³ãã«ãã§ã«éä¿¡ããæçµçãªæäœãå®è¡ããå¿ èŠãããããšãæ³åããŠãã ãããããŒã¿ããŒã¹ãžã®çµ±èšã®æžã蟌ã¿ããã°ãã¡ã€ã«ãžã®ãšã©ãŒã®æžã蟌ã¿ãªã©ãæããã«ãã¯ã©ã€ã¢ã³ããšã®æ¥ç¶ã¯ãã¯ãå¿ èŠã§ã¯ãããŸããããã¯ã©ã€ã¢ã³ãã¯ïŒãã©ãŠã¶ã®æå³ã§ïŒãŸã ç§ãã¡ããã®æ å ±ãåŸ ã£ãŠããŸããäºåã«FCGX_Accept_rãåŒã³åºãããšãã§ããªãããšã¯æããã§ãããã®åŸã次ã®ãªã¯ãšã¹ãã®åŠçãéå§ããå¿ èŠããããŸãããã®å ŽåãFCGX_Finish_ré¢æ°ãå¿ èŠã«ãªããŸã-æ°ãããªã¯ãšã¹ããåä¿¡ããåã«çŸåšã®æ¥ç¶ãéããããšãã§ããŸããã¯ãããã®æ©èœã䜿çšããªãå Žåãšåãåäœæéãããã®ãªã¯ãšã¹ãæ°ãåŠçã§ããŸãããã¯ã©ã€ã¢ã³ãã¯ããæ©ãåçãåãåããŸã-æçµæäœãçµäºãããŸã§åŸ ã€å¿ èŠã¯ãããŸãããFastCGIã䜿çšããã®ã¯ãèŠæ±ã®åŠçé床ãéãããã§ãã
ããã«ãããå®éã«ã¯ãã©ã€ãã©ãªãŒé¢æ°ã®èšè¿°ãçµäºããåä¿¡ããŒã¿ã®åŠçãéå§ãããŸãã
ãã«ãã¹ã¬ããFastCGIããã°ã©ã ã®ç°¡åãªäŸ
ãã®äŸã§ã¯ãã¹ãŠãæããã«ãªããšæããŸããå¯äžã®ããšã¯ããããã°ã¡ãã»ãŒãžã®å°å·ãšã¯ãŒã¯ãããŒã®ãç ãã«èœã¡ããããšã¯ããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ã¿ãç®çãšããŠè¡ãããããšã§ããããã°ã©ã ãã³ã³ãã€ã«ãããšãã¯ãlibfcgiããã³libpthreadã©ã€ãã©ãªïŒgccã³ã³ãã€ã©ãªãã·ã§ã³ïŒ-lfcgiããã³-lpthreadïŒãå«ããããã«ããŠãã ããã
#include <pthread.h> #include <sys/types.h> #include <stdio.h> #include "fcgi_config.h" #include "fcgiapp.h" #define THREAD_COUNT 8 #define SOCKET_PATH "127.0.0.1:9000" // static int socketId; static void *doit(void *a) { int rc, i; FCGX_Request request; char *server_name; if(FCGX_InitRequest(&request, socketId, 0) != 0) { // printf("Can not init request\n"); return NULL; } printf("Request is inited\n"); for(;;) { static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER; // printf("Try to accept new request\n"); pthread_mutex_lock(&accept_mutex); rc = FCGX_Accept_r(&request); pthread_mutex_unlock(&accept_mutex); if(rc < 0) { // printf("Can not accept new request\n"); break; } printf("request is accepted\n"); // server_name = FCGX_GetParam("SERVER_NAME", request.envp); // HTTP- ( ) FCGX_PutS("Content-type: text/html\r\n", request.out); // FCGX_PutS("\r\n", request.out); // ( - html- -) FCGX_PutS("<html>\r\n", request.out); FCGX_PutS("<head>\r\n", request.out); FCGX_PutS("<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>\r\n", request.out); FCGX_PutS("</head>\r\n", request.out); FCGX_PutS("<body>\r\n", request.out); FCGX_PutS("<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>\r\n", request.out); FCGX_PutS("<p>Request accepted from host <i>", request.out); FCGX_PutS(server_name ? server_name : "?", request.out); FCGX_PutS("</i></p>\r\n", request.out); FCGX_PutS("</body>\r\n", request.out); FCGX_PutS("</html>\r\n", request.out); //"" - sleep(2); // FCGX_Finish_r(&request); // - , .. } return NULL; } int main(void) { int i; pthread_t id[THREAD_COUNT]; // FCGX_Init(); printf("Lib is inited\n"); // socketId = FCGX_OpenSocket(SOCKET_PATH, 20); if(socketId < 0) { // return 1; } printf("Socket is opened\n"); // for(i = 0; i < THREAD_COUNT; i++) { pthread_create(&id[i], NULL, doit, NULL); } // for(i = 0; i < THREAD_COUNT; i++) { pthread_join(id[i], NULL); } return 0; }
ç°¡åãªNginxã®æ§æäŸ
å®éãèšå®ã®æãåçŽãªäŸã¯æ¬¡ã®ããã«ãªããŸãã
ãµãŒããŒ{ server_name localhost; å Žæ/ { fastcgi_pass 127.0.0.1:9000; #fastcgi_pass unixïŒ/ tmp / fastcgi / mysocket; #fastcgi_pass localhostïŒ9000; fastcgi_paramsãå«ããŸãã } }
ãã®å ŽåãFastCGIããã°ã©ã ãæ£ããåäœãããã«ã¯ããã®æ§æã§ååã§ããã³ã¡ã³ããããè¡ã¯ãããããUnixãã¡ã€ã³ãœã±ããã§åäœããIPã¢ãã¬ã¹ã®ä»£ããã«ãã¹ããã¡ã€ã³åãæå®ããäŸã§ãã
ããã°ã©ã ãã³ã³ãã€ã«ããŠå®è¡ããNginxãæ§æããåŸãããŒã«ã«ãã¹ãã§
FastCGI HelloïŒïŒãã«ãã¹ã¬ããCãfcgiappã©ã€ãã©ãªïŒ
æåŸãŸã§èªãã§ããããã¹ãŠã®äººã«æè¬ããŸãã