Apache HTTP Server Version 2.0
¾ÆÆÄÄ¡ 2.0Àº ±â´É°ú Æ÷Æð¡´É¼º°ú ¼º´ÉÀÇ ±ÕÇüÀÌ ¸Âµµ·Ï ¼³°èÇÑ ¹ü¿ë À¥¼¹öÀÌ´Ù. º¥Ä¡¸¶Å© ±â·ÏÀ» ¼¼¿ì±âÀ§ÇØ ¼³°èÇÏÁö ¾Ê¾ÒÁö¸¸ ¾ÆÆÄÄ¡ 2.0Àº ½ÇÁ¦ ¸¹Àº °æ¿ì ³ôÀº ¼º´ÉÀ» ³½´Ù.
¾ÆÆÄÄ¡ 1.3°ú ºñ±³Çؼ 2.0 ¹öÀüÀº 󸮷®°ú È®À强(scalability)À» ³ôÀ̱âÀ§ÇØ ¸¹Àº ÃÖÀûȸ¦ Çß´Ù. ±âº»°ªÀ¸·Î ´ëºÎºÐ ÃÖÀûÈÇÑ °ªÀ» »ç¿ëÇÑ´Ù. ±×·¯³ª ÄÄÆÄÀϽà ȤÀº ½ÇÇà½Ã ¼³Á¤ÀÌ ¼º´É¿¡ Å« ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù. ÀÌ ¹®¼´Â ¾ÆÆÄÄ¡ 2.0ÀÇ ¼º´ÉÀ» Çâ»óÇϱâÀ§ÇØ ¼¹ö °ü¸®ÀÚ°¡ ¼³Á¤ÇÒ ¼ö ÀÖ´Â ¿É¼ÇÀ» ¼³¸íÇÑ´Ù. ¾î¶² ¼³Á¤ ¿É¼ÇÀº À¥¼¹ö°¡ Çϵå¿þ¾î¿Í ¿î¿µÃ¼Á¦ÀÇ ±â´ÉÀ» ´õ Àß È°¿ëÇϵµ·Ï ÇÏ´Â ¹Ý¸é, ¾î¶² ¿É¼ÇÀº ¼Óµµ¸¦ À§ÇØ ±â´ÉÀ» Èñ»ýÇÑ´Ù.
À¥¼¹ö ¼º´É¿¡ °¡Àå Å« ¿µÇâÀ» ÁÖ´Â °ÍÀº ¸Þ¸ð¸®´Ù. ½º¿ÒÀº ¿äû´ç Áö¿¬½Ã°£À» »ç¿ëÀÚ°¡ "ÃæºÐÈ÷ ºü¸£´Ù°í" »ý°¢ÇÏÁö ¸øÇÏ°Ô ´Ã¸®±â¶§¹®¿¡ À¥¼¹ö´Â ½º¿ÒÀ» ÇÏ¸é ¾ÈµÈ´Ù. ´À·ÁÁö¸é »ç¿ëÀÚ´Â Á¤ÁöÇÏ°í ´Ù½Ã Á¢¼ÓÇÏ¿© ºÎÇÏ°¡ °è¼Ó Áõ°¡ÇÑ´Ù. MaxClients
Áö½Ã¾î¸¦ Á¶ÀýÇÏ¿© À¥¼¹ö°¡ ½º¿ÒÀ» ÇÒ Á¤µµ·Î ¸¹Àº ÀÚ½ÄÀ» ¸¸µéÁö¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù. ¹æ¹ýÀº °£´ÜÇÏ´Ù: top
°ú °°Àº µµ±¸¿¡¼ ÇÁ·Î¼¼½º ¸ñ·ÏÀ» º¸°í ¾ÆÆÄÄ¡ ÇÁ·Î¼¼½ºÀÇ Æò±Õ ¸Þ¸ð¸® »ç¿ë·®À» ¾Ë¾Æ³½ÈÄ, Àüü »ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸®¿¡¼ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ »ç¿ëÇÒ °ø°£À» »« °ª¿¡¼ ³ª´«´Ù.
³ª¸ÓÁö´Â Æò¹üÇÏ´Ù: ÃæºÐÈ÷ ºü¸¥ CPU, ÃæºÐÈ÷ ºü¸¥ ³×Æ®¿÷Ä«µå, ÃæºÐÈ÷ ºü¸¥ µð½ºÅ©, ¿©±â¼ "ÃæºÐÈ÷ ºü¸¥"Àº ½ÇÇèÀ» Çؼ °áÁ¤ÇØ¾ß ÇÑ´Ù.
¿î¿µÃ¼Á¦´Â º¸Åë °¢ÀÚ ¾Ë¾Æ¼ ¼±ÅÃÇÒ ÀÏÀÌ´Ù. ±×·¯³ª ÀϹÝÀûÀ¸·Î À¯¿ëÇÏ´Ù°í ÆǸíµÈ ¸î°¡Áö ÁöħÀÌ ÀÖ´Ù:
¼±ÅÃÇÑ ¿î¿µÃ¼Á¦ÀÇ ÃֽŠ¾ÈÁ¤ ¹öÀü°ú ÆÐÄ¡¸¦ ½ÇÇàÇÑ´Ù. ¸¹Àº ¿î¿µÃ¼Á¦ Á¦ÀÛ»ç´Â ÃÖ±Ù TCP ½ºÅðú ¾²·¹µå ¶óÀ̺귯¸®¿¡ ¸¹Àº ¼ÓµµÇâ»óÀ» Çß´Ù.
¿î¿µÃ¼Á¦°¡ sendfile(2)
½Ã½ºÅÛÈ£ÃâÀ» Áö¿øÇÑ´Ù¸é, À̸¦ »ç¿ëÇϱâÀ§ÇÑ ¹öÀüÀ̳ª ÆÐÄ¡¸¦ ¼³Ä¡ÇÏ¿´´ÂÁö È®ÀÎÇÑ´Ù. (¿¹¸¦ µé¾î, ¸®´ª½º¶ó¸é 2.4 ÀÌ»ó ¹öÀüÀ» ¶æÇÑ´Ù. Solaris 8 Ãʱ⠹öÀüÀº ÆÐÄ¡°¡ ÇÊ¿äÇÏ´Ù.) Áö¿øÇÏ´Â ½Ã½ºÅÛÀ̶ó¸é ¾ÆÆÄÄ¡ 2´Â sendfile
À» »ç¿ëÇÏ¿© CPU¸¦ ´ú »ç¿ëÇϸç Á¤Àû ÆÄÀÏÀ» ´õ »¡¸® Àü¼ÛÇÒ ¼ö ÀÕ´Ù.
°ü·ÃµÈ ¸ðµâ | °ü·ÃµÈ Áö½Ã¾î |
---|---|
¾ÆÆÄÄ¡ 1.3 ÀÌÀü¿¡ HostnameLookups
ÀÇ ±âº»°ªÀº On
ÀÌ¿´´Ù. ¿äûÀ» ¸¶Ä¡±âÀü¿¡ DNS °Ë»öÀÌ ³¡³ª¾ß ÇϹǷΠ¿äû¸¶´Ù Áö¿¬ÀÌ »ý°å´Ù. ¾ÆÆÄÄ¡ 1.3¿¡¼ ÀÌ ¼³Á¤ÀÇ ±âº»°ªÀÌ Off
·Î º¯°æµÇ¾ú´Ù. ·Î±×ÆÄÀÏÀÇ ÁÖ¼Ò¸¦ È£½ºÆ®¸íÀ¸·Î º¯È¯ÇÏ·Á¸é ¿©·¯ ·Î±×ó¸® ÇÁ·Î±×·¥Áß ÇϳªÀÎ, ¾ÆÆÄÄ¡¿¡ Æ÷ÇÔµÈ logresolve
ÇÁ·Î±×·¥À» »ç¿ëÇ϶ó.
·Î±×ó¸® ÀÛ¾÷ÀÌ ¼¹ö ¼º´É¿¡ ¾Ç¿µÇâÀ» ¹ÌÄ¡¹Ç·Î ½ÇÁ¦ »ç¿ëÇÏ´Â À¥¼¹ö°¡ ¾Æ´Ñ ´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼ ·Î±×ÆÄÀÏÀ» ÈÄó¸®ÇÏ±æ ¹Ù¶õ´Ù.
À̳ª Allow
from domain
Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù¸é (Áï, IP ÁÖ¼Ò°¡ ¾Æ´Ñ È£½ºÆ®¸íÀ̳ª µµ¸ÞÀθíÀ» »ç¿ëÇÑ´Ù¸é) ºÎµæÀÌ Áߺ¹-¿ª DNS °Ë»öÀ» (¿ª°Ë»öÀ» ÇÑÈÄ ¾ÇÀÇ·Î º¯°æµÇ¾ú´ÂÁö È®ÀÎÇϱâÀ§ÇØ ´Ù½Ã °Ë»ö) ÇØ¾ß ÇÑ´Ù. ±×·¯¹Ç·Î ¼º´ÉÀ» ³ôÀ̱âÀ§ÇØ ÀÌ·± Áö½Ã¾î¿¡´Â °¡´ÉÇϸé À̸§´ë½Å IP ÁÖ¼Ò¸¦ »ç¿ëÇÑ´Ù.Deny
from domain
<Location /server-status>
¼½¼Ç µîÀ¸·Î Áö½Ã¾îÀÇ Àû¿ë¹üÀ§¸¦ Á¦ÇÑÇÒ ¼ö ÀÖÀ½À» ±â¾ïÇ϶ó. ÀÌ °æ¿ì Á¶°Ç¿¡ ¸Â´Â ¿äû¿¡¸¸ DNS Á¶È¸¸¦ ÇÑ´Ù. ´ÙÀ½Àº .html
°ú .cgi
ÆÄÀϸ¸ DNS °Ë»öÀ» ÇÏ´Â ¿¹Á¦´Ù:
HostnameLookups off
<Files ~ "\.(html|cgi)$">
HostnameLookups on
</Files>
±×·¯³ª CGI¿¡¼ DNS¸íÀÌ ÇÊ¿äÇÒ »ÓÀ̶ó¸é, ÇÊ¿äÇÑ Æ¯Á¤ CGI¿¡¼¸¸ gethostbyname
È£ÃâÀ» Çϵµ·Ï °í·ÁÇغ¼ ¼ö ÀÖ´Ù.
URL °ø°£¿¡¼ Options FollowSymLinks
¸¦ »ç¿ëÇÏÁö¾Ê°í Options SymLinksIfOwnerMatch
¸¦ »ç¿ëÇÏ¸é ¾ÆÆÄÄ¡´Â ½Éº¼¸µÅ©¸¦ °Ë»çÇϱâÀ§ÇØ ½Ã½ºÅÛÈ£ÃâÀ» Çѹø ´õ ÇØ¾ß ÇÑ´Ù. ÆÄÀϸíÀÇ °¢ ºÎºÐ¸¶´Ù Çѹø¾¿ ´õ È£ÃâÀ» ÇÑ´Ù. ¿¹¸¦ µé¾î, ¼³Á¤ÀÌ ´ÙÀ½°ú °°°í:
DocumentRoot /www/htdocs
<Directory />
Options SymLinksIfOwnerMatch
</Directory>
/index.html
URI¿¡ ´ëÇÑ ¿äûÀÌ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. ±×·¯¸é ¾ÆÆÄÄ¡´Â /www
, /www/htdocs
, /www/htdocs/index.html
°¢°¢¿¡ ´ëÇØ lstat(2)
¸¦ È£ÃâÇÑ´Ù. lstats
°á°ú¸¦ ij½ÌÇÏÁö ¾Ê±â¶§¹®¿¡ ¿äûÀÌ µé¾î¿Ã ¶§¸¶´Ù ¸Å¹ø °°Àº ÀÛ¾÷À» ÇÑ´Ù. ÁøÂ¥ ½Éº¼¸µÅ© º¸¾È °Ë»ç¸¦ ¿øÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ´Ù:
DocumentRoot /www/htdocs
<Directory />
Options FollowSymLinks
</Directory>
<Directory /www/htdocs>
Options -FollowSymLinks +SymLinksIfOwnerMatch
</Directory>
ÀÌ °æ¿ì ÃÖ¼ÒÇÑ DocumentRoot
°æ·Î´Â °Ë»çÇÏÁö ¾Ê´Â´Ù. DocumentRoot ¹Û¿¡ ÀÖ´Â °æ·Î·Î Alias
³ª RewriteRule
À» »ç¿ëÇÑ °æ¿ì¿¡µµ À§¿Í ºñ½ÁÇÑ ¼½¼ÇÀÌ ÇÊ¿äÇÏ´Ù. ½Éº¼¸µÅ© º¸¾ÈÀ» °í·ÁÇÏÁö ¾Ê°í ÃÖ°íÀÇ ¼º´ÉÀ» ¾òÀ¸·Á¸é, FollowSymLinks
¸¦ ¼³Á¤ÇÏ°í, SymLinksIfOwnerMatch
´Â Àý´ë·Î ¾ÈµÈ´Ù.
URL °ø°£¿¡¼ overrides¸¦ Çã¿ëÇÑ´Ù¸é (º¸Åë .htaccess
ÆÄÀÏ) ¾ÆÆÄÄ¡´Â ÆÄÀϸíÀÇ °¢ ºÎºÐ¸¶´Ù .htaccess
¸¦ ¿±æ ½ÃµµÇÑ´Ù. ¿¹¸¦ µé¾î,
DocumentRoot /www/htdocs
<Directory />
AllowOverride all
</Directory>
/index.html
URI¿¡ ´ëÇÑ ¿äûÀÌ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. ¾ÆÆÄÄ¡´Â /.htaccess
, /www/.htaccess
, /www/htdocs/.htaccess
¸¦ ¿·Á°í ½ÃµµÇÑ´Ù. ÇØ°áÃ¥Àº ¾ÕÀÇ Options FollowSymLinks
°æ¿ì¿Í ºñ½ÁÇÏ´Ù. ÃÖ°íÀÇ ¼º´ÉÀ» ¾òÀ¸·Á¸é ÆÄÀϽýºÅÛ¿¡ ´ëÇؼ Ç×»ó AllowOverride None
À» »ç¿ëÇÑ´Ù.
°¡´ÉÇÏ°í ÁøÂ¥ Á¶±ÝÀÇ ¼º´ÉÇâ»ó¿¡µµ °ü½ÉÀÌ ÀÖ´Ù¸é ³»¿ëÇù»óÀ» ¸·´Â´Ù. ½ÇÁ¦·Î Çù»óÀÇ À̵æÀº ¼º´ÉÀúÇϺ¸´Ù ÀÛ´Ù. ¼¹ö¸¦ ºü¸£°Ô ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°ÀÌ ¿ÍÀϵåÄ«µå¸¦ »ç¿ëÇÏ´Â ´ë½Å:
DirectoryIndex index
¿ÏÀüÇÑ ¸ñ·ÏÀ» »ç¿ëÇÑ´Ù:
DirectoryIndex index.cgi index.pl index.shtml index.html
°¡Àå ÈçÇÑ °ÍÀ» ¾Õ¿¡ µÐ´Ù.
¶Ç, µð·ºÅ丮¿¡¼ ÆÄÀϵéÀ» ã´Â MultiViews
º¸´Ù´Â, ÇÑ ÆÄÀϸ¸ ÀÐÀ¸¸é ÇÊ¿äÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Â type-map
ÆÄÀÏÀ» Á÷Á¢ ¸¸µå´Â °ÍÀÌ ´õ ºü¸§À» ¸í½ÉÇ϶ó.
»çÀÌÆ®¿¡ ³»¿ëÇù»óÀÌ ÇÊ¿äÇÏ´Ù¸é Çù»óÀ» À§ÇØ Options MultiViews
Áö½Ã¾î¸¦ »ç¿ëÇϱ⺸´Ù type-map
ÆÄÀÏÀ» °í·ÁÇ϶ó. Çù»ó¹æ¹ý¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸í°ú type-map
ÆÄÀÏÀ» ¸¸µå´Â ¹æ¹ýÀº ³»¿ëÇù»ó ¹®¼¸¦ Âü°íÇ϶ó.
¿¹¸¦ µé¾î, server-side-include¸¦ ó¸®ÇÏ´Â µî ¾ÆÆÄÄ¡ 2.0ÀÌ Àü¼ÛÇÒ ÆÄÀÏÀ» ÀÐÀ»¶§ ¿î¿µÃ¼Á¦°¡ mmap(2)
µîÀ» Áö¿øÇÑ´Ù¸é ÆÄÀÏÀ» ¸Þ¸ð¸®´ëÀÀÇÑ´Ù.
¿©·¯ Ç÷¡Æû¿¡¼ ¸Þ¸ð¸®´ëÀÀÀ» ¼º´ÉÀ» Çâ»óÇÑ´Ù. ±×·¯³ª ¸Þ¸ð¸®´ëÀÀÀÌ ¼¹öÀÇ ¼º´ÉÀ» ¶³¾îÆ®¸®°í ½ÉÁö¾î ¾ÈÁ¤¼ºÀ» ÇØÄ¡´Â °æ¿ì°¡ ÀÖ´Ù:
¾î¶² ¿î¿µÃ¼Á¦¿¡¼ mmap
Àº CPU °³¼ö°¡ ¸¹¾ÆÁú¶§ read(2)
¸¸Å È®À强ÀÌ ÁÁÁö ¾Ê´Ù. ¿¹¸¦ µé¾î, ´ÙÁßÇÁ·Î¼¼¼ Solaris ¼¹ö¿¡¼ ¾ÆÆÄÄ¡ 2.0Àº Á¾Á¾ mmap
À» »ç¿ëÇÏÁö ¾ÊÀ»¶§ ¼¹ö°¡ ó¸®ÇÑ ÆÄÀÏÀ» ´õ »¡¸® Àü¼ÛÇÑ´Ù.
NFS ¸¶¿îÆ®ÇÑ ÆÄÀϽýºÅÛ¿¡ ÀÖ´Â ÆÄÀÏÀ» ¸Þ¸ð¸®´ëÀÀÇÏ´Â µµÁß¿¡ ´Ù¸¥ NFS Ŭ¶óÀ̾ðÆ®¿¡ ÀÖ´Â ÇÁ·Î¼¼½º°¡ ÆÄÀÏÀ» Áö¿ì°Å³ª ÆÄÀÏÅ©±â¸¦ ÁÙÀ̸é, À¥¼¹ö ÇÁ·Î¼¼½º°¡ ´ÙÀ½ ¹ø¿¡ ¸Þ¸ð¸®´ëÀÀÇÑ ÆÄÀϳ»¿ëÀ» ÀÐÀ»¶§ bus error°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.
À§ÀÇ Á¶°Ç¿¡ ÇØ´çÇϸé Àü¼ÛÇÏ´Â ÆÄÀÏÀ» ¸Þ¸ð¸®´ëÀÀÇÏÁö ¾Êµµ·Ï EnableMMAP off
¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. (ÁÖÀÇ: ÀÌ Áö½Ã¾î´Â µð·ºÅ丮º°·Î º¯°æÇÒ ¼ö ÀÖ´Ù.)
¾ÆÆÄÄ¡´Â ¿î¿µÃ¼Á¦°¡ sendfile(2)
À» Áö¿øÇϸé Ä¿³Î sendfileÀ» »ç¿ëÇÏ¿© -- ¿¹¸¦ µé¾î, Á¤Àû ÆÄÀÏÀ» ¼ºñ½ºÇÒ¶§ -- Àü¼ÛÇÒ ÆÄÀÏÀ» Á÷Á¢ ÀÐÁö¾ÊÀ» ¼ö ÀÖ´Ù.
¿©·¯ Ç÷¡Æû¿¡¼ sendfileÀ» »ç¿ëÇϸé read¿Í send¸¦ µû·Î ÇÒ ÇÊ¿ä°¡ ¾ø¾î¼ »¡¶óÁø´Ù. ±×·¯³ª sendfileÀ» »ç¿ëÇϸé À¥¼¹öÀÇ ¾ÈÁ¤¼ºÀ» ÇØÄ¡°ÔµÇ´Â °æ¿ì°¡ ÀÖ´Ù:
sendfile Áö¿øÀÌ À߸øµÇ¾ú°í ÄÄÆÄÀÏ ½Ã½ºÅÛÀÌ ÀÌÁ¡À» ¹ß°ßÇÏÁö ¸øÇÏ´Â Ç÷¡ÆûÀÌ ÀÖ´Ù. ƯÈ÷ ´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼ ½ÇÇàÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ¿© sendfile Áö¿øÀÌ À߸øµÈ ÄÄÇ»ÅÍ·Î °¡Á®¿Â °æ¿ì¿¡ °¡´ÉÇÏ´Ù.
Ä¿³ÎÀº ÀÚ½ÅÀÇ Ä³½¬¸¦ »ç¿ëÇÏ¿© NFS·Î ¸¶¿îÆ®ÇÑ ÆÄÀÏÀ» ¾ÈÁ¤ÀûÀ¸·Î ¼ºñ½ºÇÒ ¼ö ¾ø´Â °æ¿ì°¡ ÀÖ´Ù.
À§ÀÇ Á¶°Ç¿¡ ÇØ´çÇϸé ÆÄÀÏÀ» sendfile Àü¼ÛÇÏÁö ¾Êµµ·Ï EnableSendfile off
¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. (ÁÖÀÇ: ÀÌ Áö½Ã¾î´Â µð·ºÅ丮º°·Î º¯°æÇÒ ¼ö ÀÖ´Ù.)
¾ÆÆÄÄ¡ 1.3 ÀÌÀü¿¡´Â MinSpareServers
, MaxSpareServers
, StartServers
¼³Á¤ÀÌ ¸ðµÎ º¥Ä¡¸¶Å© °á°ú¿¡ Å« ¿µÇâÀ» ¹ÌÃÆ´Ù. ƯÈ÷ ¾ÆÆÄÄ¡´Â ÀÛ¾÷À» ¼ºñ½ºÇϱâÀ§ÇØ ÃæºÐÇÑ Àڽļö¿¡ ´Ù´Ù¸¦ ¶§±îÁö "µµ´Þ" ±â°£ÀÌ ÇÊ¿äÇß´Ù. óÀ½ StartServers
°³ ÀÚ½ÄÀ» ¸¸µçÈÄ, MinSpareServers
¼³Á¤°ª±îÁö ÃÊ´ç ÀÚ½ÄÀ» Çϳª¾¿ ¸¸µé¾ú´Ù. ±×·¡¼ StartServers
±âº»°ªÀÌ 5
ÀÎ ¼¹ö¿¡ Ŭ¶óÀ̾ðÆ® 100°³°¡ µ¿½Ã¿¡ Á¢¼ÓÇÏ¸é ºÎÇϸ¦ ó¸®Çϱ⿡ ÃæºÐÇÑ ÀÚ½ÄÀ» ¸¸µé±â±îÁö 95ÃÊ°¡ °É·È´Ù. ÀÚÁÖ Àç½ÃÀÛÇÏÁö ¾Ê´Â ½ÇÁ¦ ¼¹ö¿¡¼´Â Àß µ¿ÀÛÇÏÁö¸¸, 10ºÐ°£¸¸ ½ÇÇàÇÏ´Â º¥Ä¡¸¶Å© °á°ú´Â ¸Å¿ì ³ª»Ú°Ô ³ª¿Â´Ù.
ÃÊ´ç ÇÑ°³ ±ÔÄ¢Àº ÀÚ½ÄÀ» »õ·Î ½ÃÀÛÇÏ¸é¼ ¼¹ö¿¡ ¹«¸®¸¦ ÁÖÁö ¾ÊÀ¸·Á°í Á¤Çß´Ù. ÄÄÇ»ÅÍ°¡ ÀÚ½ÄÀ» ½ÃÀÛÇÏ´À¶ó ¹Ù»Ú¸é ¿äûÀ» ¼ºñ½ºÇÒ ¼ö ¾ø´Ù. ±×·¯³ª ÀÌ ±ÔÄ¢ÀÌ ¾ÆÆÄÄ¡ÀÇ Ã¼°¨ ¼º´É¿¡ ¾Ç¿µÇâÀ» ÁÖ¾î º¯°æÇÏ¿´´Ù. ¾ÆÆÄÄ¡ 1.3¿¡¼ ÃÊ´ç ÇÑ°³ ±ÔÄ¢Àº ¿ÏȵǾú´Ù. ÄÚµå´Â ÀÚ½Ä ÇÑ°³¸¦ ¸¸µé°í, 1ÃÊ ½¬°í, µÎ°³¸¦ ¸¸µé°í, 1ÃÊ ½¬°í, ³×°³¸¦ ¸¸µé°í, ÀÌ·± ½ÄÀ¸·Î ÃÊ´ç ÀÚ½ÄÀ» 32°³ ¸¸µé¶§±îÁö Áö¼ö·Î Áõ°¡ÇÑ´Ù. Àڽļö°¡ MinSpareServers
¼³Á¤¿¡ ´Ù´Ù¸£¸é Áõ°¡¸¦ Áß´ÜÇÑ´Ù.
ÀÌ °æ¿ì ¹ÝÀÀ¼Óµµ°¡ »¡¶óÁ®¼ MinSpareServers
, MaxSpareServers
, StartServers
¸¦ °ÅÀÇ ¼³Á¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ÀÏÃÊ¿¡ ÀÚ½ÄÀ» 4°³ ÀÌ»ó »ý¼ºÇϸé ErrorLog
¿¡ ±â·ÏÇÑ´Ù. ÀÌ·± ¿À·ù¹®ÀÌ ¸¹ÀÌ º¸À̸é ÀÌ ¼³Á¤µéÀ» Á¶ÀýÇÏ±æ ¹Ù¶õ´Ù. mod_status
°á°ú°¡ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.
ÇÁ·Î¼¼½º »ý¼º°ú °ü·ÃÇÏ¿© MaxRequestsPerChild
¼³Á¤Àº ÇÁ·Î¼¼½º¸¦ Á¾·áÇÑ´Ù. ±âº»°ªÀº ÀڽĴç ó¸®ÇÒ ¿äû¼ö¿¡ Á¦ÇÑÀÌ ¾ø´Ù´Â 0
ÀÌ´Ù. ÇöÀç ¼³Á¤ÀÌ 30
°ú °°ÀÌ ¸Å¿ì ÀÛÀº °ªÀ¸·Î ¼³Á¤µÇÀÖ´Ù¸é, °ªÀ» »ó´çÈ÷ ³ôÈú ÇÊ¿ä°¡ ÀÖ´Ù. SunOS³ª ¿À·¡µÈ Solaris ¹öÀüÀ» »ç¿ëÇÑ´Ù¸é, ¸Þ¸ð¸®À¯Ã⶧¹®¿¡ ÀÌ °ªÀ» 10000
Á¤µµ·Î ¼³Á¤Ç϶ó.
¿¬°áÀ¯Áö(keep-alive)¸¦ »ç¿ëÇÑ´Ù¸é ÀڽĵéÀº ÀÌ¹Ì ¿¸° ¿¬°á¿¡¼ Ãß°¡ ¿äûÀ» ±â´Ù¸®¸ç ¾Æ¹«°Íµµ ÇÏÁö¾Ê±â¶§¹®¿¡ °è¼Ó ¹Ù»Ú´Ù. KeepAliveTimeout
ÀÇ ±âº»°ª 15
ÃÊ´Â ÀÌ·± Çö»óÀ» ÃÖ¼ÒÈÇÑ´Ù. ³×Æ®¿÷ ´ë¿ªÆø°ú ¼¹ö ÀÚ¿ø °£ÀÇ ±ÕÇüÀÌ ¸Â°Ô ¼³Á¤ÇÑ´Ù. ¿¬°áÀ¯ÁöÀÇ ´ëºÎºÐÀÇ ÀÌÁ¡ÀÌ »ç¶óÁö±â¶§¹®¿¡ ¾î¶² °æ¿ì¿¡µµ ÀÌ °ªÀ» 60
ÃÊ ÀÌ»óÀ¸·Î ¿Ã¸®Áö ¸¶¶ó.
¾ÆÆÄÄ¡ 2.x´Â ´ÙÁß󸮸ðµâ (MPMs)À̶ó´Â ±³Ã¼ÇÒ ¼ö ÀÖ´Â µ¿±âÈ ¸ðµ¨À» Áö¿øÇÑ´Ù. ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÒ¶§ MPMÀ» ¼±ÅÃÇØ¾ß ÇÑ´Ù. beos
, mpm_netware
, mpmt_os2
, mpm_winnt
¿Í °°ÀÌ Æ¯Á¤ Ç÷¡Æû¿¡¼¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Â MPMµµ ÀÖ´Ù. ÀϹÝÀûÀÎ À¯´Ð½º·ù ½Ã½ºÅÛÀº ¿©·¯ MPM Áß¿¡ Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. À¥¼¹öÀÇ ¼Óµµ¿Í È®À强(scalability)Àº ¾î¶² MPMÀ» ¼±ÅÃÇ߳Ŀ¡ ´Þ·È´Ù:
worker
MPMÀº ¿©·¯ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ °¢°¢ ¿©·¯ ¾²·¹µå¸¦ »ç¿ëÇÑ´Ù. °¢ ¾²·¹µå´Â Çѹø¿¡ ÇÑ ¿¬°áÀ» ´ã´çÇÑ´Ù. ÀϹÝÀûÀ¸·Î worker´Â prefork MPM º¸´Ù ÀûÀº ¸Þ¸ð¸®¸¦ »ç¿ëÇϹǷΠÅë½Å·®ÀÌ ¸¹Àº ¼¹ö¿¡ ÀûÀýÇÏ´Ù.prefork
MPMÀº ¾²·¹µå°¡ ÇÑ°³ÀÎ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¿©·¯°³ »ç¿ëÇÑ´Ù. °¢ ÇÁ·Î¼¼½º´Â Çѹø¿¡ ÇÑ ¿¬°áÀ» ´ã´çÇÑ´Ù. ¿©·¯ ½Ã½ºÅÛ¿¡¼ preforkÀÇ ¼Óµµ´Â worker¿Í ºñ½ÁÇÏÁö¸¸, ´õ ¸¹Àº ¸Þ¸ð¸®¸¦ »ç¿ëÇÑ´Ù. ´ÙÀ½°ú °°Àº »óȲ¿¡¼ ¾²·¹µå¸¦ »ç¿ëÇÏÁö ¾Ê´Â prefork ¹æ½ÄÀÌ worker¿¡ ºñÇØ ÀÌÁ¡À» °¡Áø´Ù: ¾²·¹µå¿¡ ¾ÈÀüÇÏÁö (thread-safe) ¾ÊÀº Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâÀ» »ç¿ëÇÒ ¼ö ÀÖ°í, ¾²·¹µå µð¹ö±ë Áö¿øÀÌ ºó¾àÇÑ Ç÷¡Æû¿¡¼ ½±°Ô µð¹ö±ëÇÒ ¼ö ÀÖ´Ù.ÀÌ MPMµé°ú ´Ù¸¥ MPM¿¡ ´ëÇØ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â MPM ¹®¼¸¦ Âü°íÇÏ±æ ¹Ù¶õ´Ù.
¸Þ¸ð¸® »ç¿ë·®ÀÌ ¼º´É¿¡¼ °¡Àå Áß¿äÇÑ ¿äÀÎÀ̱⶧¹®¿¡ ½ÇÁ¦·Î »ç¿ëÇÏÁö ¾Ê´Â ¸ðµâÀ» Á¦°ÅÇغ¸ÀÚ. ¸ðµâÀ» DSO·Î ÄÄÆÄÀÏÇß´Ù¸é °£´ÜÈ÷ ±× ¸ðµâ¿¡ ´ëÇÑ LoadModule
Áö½Ã¾î¸¦ ÁÖ¼®Ã³¸®ÇÏ¸é µÈ´Ù. ±×·¡¼ ¸ðµâÀ» Á¦°ÅÇÏ°í ½ÇÇàÇÏ¿© »çÀÌÆ®°¡ ¸ðµâ¾øÀ̵µ Á¤»óÀûÀ¸·Î µ¿ÀÛÇÏ´ÂÁö »ìÆ캼 ¼ö ÀÖ´Ù.
¹Ý´ë·Î ¸ðµâÀÌ ¾ÆÆÄÄ¡ ½ÇÇàÆÄÀÏ¿¡ Á¤ÀûÀ¸·Î ¸µÅ©µÇÀÖ´Ù¸é ¿øÇÏÁö ¾Ê´Â ¸ðµâÀ» Á¦°ÅÇϱâÀ§ÇØ ¾ÆÆÄÄ¡¸¦ ÀçÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù.
¿©±â¼ ´ç¿¬È÷ ¾î¶² ¸ðµâÀ» »ç¿ëÇÏ°í »ç¿ëÇÏÁö ¸»Áö Àǹ®ÀÌ »ý±ä´Ù. Á¤´äÀº À¥»çÀÌÆ®¸¶´Ù ´Ù¸£´Ù. ±×·¯³ª ¾Æ¸¶µµ ÃÖ¼ÒÇÑ mod_mime
, mod_dir
, mod_log_config
¸ðµâÀº »ç¿ëÇÒ °ÍÀÌ´Ù. ¹°·Ð À¥»çÀÌÆ®¿¡ ·Î±×ÆÄÀÏÀÌ ÇÊ¿ä¾ø´Ù¸é mod_log_config
´Â ¾ø¾îµµ µÈ´Ù. ±×·¯³ª ÃßõÇÏÁö ¾Ê´Â´Ù.
mod_cache
°°Àº ¸ðµâ°ú ÃÖ±Ù °³¹ßÁßÀÎ worker MPMÀº APRÀÇ atomic API¸¦ »ç¿ëÇÑ´Ù. ÀÌ API´Â °æ·®±Þ ¾²·¹µå µ¿±âȸ¦ À§ÇÒ atomic ¸í·ÉÀ» Á¦°øÇÑ´Ù.
±âº»ÀûÀ¸·Î APRÀº °¢ ¿î¿µÃ¼Á¦/CPU Ç÷¡Æû¿¡¼ °¡Àå È¿À²ÀûÀÎ ¹æ¹ýÀ» »ç¿ëÇÏ¿© ÀÌ ¸í·ÉÀ» ±¸ÇöÇÑ´Ù. ¿¹¸¦ µé¾î, ¿©·¯ ÃֽŠCPU¿¡´Â Çϵå¿þ¾î·Î atomic compare-and-swap (CAS) ¿¬»êÀ» ÇÏ´Â ¸í·É¾î°¡ ÀÖ´Ù. ±×·¯³ª ¾î¶² Ç÷¡Æû¿¡¼ APRÀº ÀÌ·± ¸í·É¾î°¡ ¾ø´Â ¿À·¡µÈ CPU¿Í ȣȯ¼ºÀ» À§ÇØ ´õ ´À¸° mutex±â¹Ý ±¸ÇöÀ» ±âº»ÀûÀ¸·Î »ç¿ëÇÑ´Ù. ÀÌ·± Ç÷¡Æû¿¡¼ ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÒ¶§ ¾ÆÆÄÄ¡¸¦ ÃֽŠCPU¿¡¼¸¸ ½ÇÇàÇÒ °èȹÀ̶ó¸é, ¾ÆÆÄÄ¡¸¦ ±¸¼ºÇÒ¶§ --enable-nonportable-atomics
¿É¼ÇÀ» »ç¿ëÇÏ¿© ´õ ºü¸¥ atomic ±¸ÇöÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù:
./buildconf
./configure --with-mpm=worker --enable-nonportable-atomics=yes
--enable-nonportable-atomics
¿É¼ÇÀº ´ÙÀ½°ú °°Àº Ç÷¡Æû¿¡ ¿µÇâÀÌ ÀÖ´Ù:
--enable-nonportable-atomics
¸¦ »ç¿ëÇϸé APRÀº ºü¸¥ Çϵå¿þ¾î compare-and-swapÀ» À§ÇÑ SPARC v8plus ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù. ÀÌ ¿É¼ÇÀ» »ç¿ëÇϸé atomic ¸í·ÉÀÌ ´õ È¿À²ÀûÀÌÁö¸¸ (CPU¸¦ ´ú »ç¿ëÇÏ°í ´õ ³ôÀº µ¿±âÈ°¡ °¡´ÉÇÏ´Ù), ÄÄÆÄÀÏÇÑ ½ÇÇàÆÄÀÏÀº UltraSPARC Ĩ¿¡¼¸¸ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.--enable-nonportable-atomics
¸¦ »ç¿ëÇϸé APRÀº ºü¸¥ Çϵå¿þ¾î compare-and-swapÀ» À§ÇÑ 486 ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù. ´õ È¿À²ÀûÀÎ atomic ¸í·ÉÀÌ °¡´ÉÇÏÁö¸¸, ÄÄÆÄÀÏÇÑ ½ÇÇàÆÄÀÏÀº 486 ÀÌ»ó Ĩ¿¡¼¸¸ (386Àº ¾ÈµÈ´Ù) ½ÇÇàÇÒ ¼ö ÀÖ´Ù.¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÒ¶§ mod_status
¸¦ Æ÷ÇÔÇÏ°í ½ÇÇàÇÒ¶§ ExtendedStatus On
À» ¼³Á¤ÇÏ¸é ¾ÆÆÄÄ¡´Â ¿äûÀ» ¹ÞÀ»¶§¸¶´Ù gettimeofday(2)
(ȤÀº ¿î¿µÃ¼Á¦¿¡ µû¶ó times(2)
)¸¦ µÎ¹ø È£ÃâÇÏ°í (1.3 ÀÌÀü¿¡´Â) time(2)
µµ Ãß°¡·Î ¿©·¯¹ø È£ÃâÇÑ´Ù. »óÅ º¸°í¼¿¡ µ¿À۽ð£ÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù. ÃÖ»óÀÇ ¼º´ÉÀ» ¾òÀ¸·Á¸é (±âº»°ªÀÎ) ExtendedStatus off
¸¦ ¼³Á¤ÇÑ´Ù.
¾Æ·¡ ¹®¼´Â ¾ÆÆÄÄ¡ À¥¼¹ö 2.0 ¹öÀü¿¡¼ º¯°æµÈ ³»¿ëÀ» ´ã°í ÀÖÁö ¾Ê´Ù. ¾ÆÁ÷µµ À¯È¿ÇÑ Á¤º¸°¡ ÀÖÁö¸¸, ÁÖÀÇÇؼ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù.
À¯´Ð½º ¼ÒÄÏ APIÀÇ ´ÜÁ¡À» ¼³¸íÇÑ´Ù. À¥¼¹ö°¡ ¿©·¯ Æ÷Æ® ȤÀº ¿©·¯ ÁÖ¼Ò¸¦ ±â´Ù¸®±âÀ§ÇØ ¿©·¯ Listen
À» »ç¿ëÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ¿¬°áÀÌ °¡´ÉÇÑÁö °¢ ¼ÒÄÏÀ» °Ë»çÇϱâÀ§ÇØ ¾ÆÆÄÄ¡´Â select(2)
¸¦ »ç¿ëÇÑ´Ù. select(2)
´Â ¼ÒÄÏ¿¡ ±â´Ù¸®°í ÀÖ´Â ¿¬°áÀÌ ¾ø´ÂÁö ȤÀº ÃÖ¼ÒÇÑ ÇÑ°³ ÀÖ´ÂÁö ¾Ë·ÁÁØ´Ù. ¾ÆÆÄÄ¡¿¡´Â ¿©·¯ ÀÚ½ÄÀÌ ÀÖ°í, ½¬°í ÀÖ´Â ¸ðµç ÀÚ½ÄÀº µ¿½Ã¿¡ »õ·Î¿î ¿¬°áÀ» °Ë»çÇÑ´Ù. ¿ø·¡ ±¸ÇöÀº ´ÙÀ½°ú ºñ½ÁÇÏ´Ù (ÀÌ ¿¹´Â Äڵ忡¼ °¡Á®¿ÀÁö ¾Ê¾Ò´Ù. ´ÜÁö ¼³¸íÇϱâÀ§ÇÑ ¿ëµµ·Î ¸¸µé¾ú´Ù.):
for (;;) {
for (;;) {
fd_set accept_fds;
FD_ZERO (&accept_fds);
for (i = first_socket; i <= last_socket; ++i) {
FD_SET (i, &accept_fds);
}
rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
if (rc < 1) continue;
new_connection = -1;
for (i = first_socket; i <= last_socket; ++i) {
if (FD_ISSET (i, &accept_fds)) {
new_connection = accept (i, NULL, NULL);
if (new_connection != -1) break;
}
}
if (new_connection != -1) break;
}
process the new_connection;
}
±×·¯³ª À§ÀÇ ´Ü¼øÇÑ ±¸Çö¿¡´Â ½É°¢ÇÑ °í°¥(starvation) ¹®Á¦°¡ ÀÖ´Ù. ¿©·¯ ÀÚ½ÄÀÌ µ¿½Ã¿¡ ÀÌ ¹Ýº¹¹®À» ½ÇÇàÇϸé, ¿äûÀ» ±â´Ù¸®¸ç ¸ðµÎ select
¿¡¼ ¸ØÃá´Ù. À̶§ ¾î¶² ¼ÒÄÏ¿¡ ¿äûÀÌ Çϳª¶óµµ µé¾î¿À¸é ¸ðµç ÀÚ½ÄÀÌ ±ú¾î³´Ù (±ú¾î³ª´Â ÀÚ½ÄÀÇ °³¼ö´Â ¿î¿µÃ¼Á¦¿Í ŸÀֿ̹¡ µû¶ó ´Ù¸£´Ù). À̵éÀº ¸ðµÎ ¿¬°áÀ» accept
ÇÏ±æ ½ÃµµÇÑ´Ù. ±×·¯³ª (¾ÆÁ÷µµ ÇÑ ¿¬°á¸¸ ´ë±âÁßÀ̶ó¸é) ÇÑ Àڽĸ¸ ¼º°øÇÏ°í, ³ª¸ÓÁö´Â accept
¿¡¼ ¸ØÃá´Ù. ±×·¯¸é ÀÌ ÀڽĵéÀº ÇÑ ¼ÒÄÏÀÇ ¿äû¸¸À» ¼ºñ½ºÇϵµ·Ï ¹¿©¼, ±× ¼ÒÄÏÀ¸·Î »õ·Î¿î ¿äûÀÌ ÃæºÐÈ÷ µé¾î¿Í¼ ¸ðµç ÀÚ½ÄÀ» ±ú¿ï¶§±îÁö Á¤ÁöÇØÀÖ´Ù. ÀÌ·± °í°¥ ¹®Á¦´Â PR#467¿¡ óÀ½ º¸°íµÇ¾ú´Ù. ÃÖ¼ÒÇÑ µÎ°¡Áö ÇØ°áÃ¥ÀÌ ÀÖ´Ù.
ÇÑ°¡Áö´Â ¼ÒÄÏÀ» ´ë±âÇÏÁö ¾Êµµ·Ï (non-blocking) ¸¸µå´Â ¹æ¹ýÀÌ´Ù. ÀÌ °æ¿ì ÀÚ½ÄÀÌ accept
¸¦ Çصµ ¸ØÃßÁö ¾Ê°í, Áï½Ã ÁøÇàÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª CPU ½Ã°£À» ³¶ºñÇÑ´Ù. select
¿¡¼ ½¬´Â ÀÚ½ÄÀÌ 10°³ ÀÖ°í, »õ·Î ¿¬°áÀÌ ÇÑ°³ µé¾î¿Ô´Ù°í °¡Á¤ÇÏÀÚ. ±×·¯¸é ÀÌ ÀÚ½ÄÁß 9°³´Â ±ú¾î³ª¼ ¿¬°áÀ» accept
ÇÏ±æ ½ÃµµÇÏ°í ½ÇÆÐÇÏ¸é ¾Æ¹« Àϵµ ÇÏÁö ¾Ê°í ´Ù½Ã select
¸¦ ¹Ýº¹ÇÑ´Ù. ´Ù½Ã select
·Î µ¹¾Æ¿Ã ¶§±îÁö ¾î¶² Àڽĵµ ´Ù¸¥ ¼ÒÄÏ¿¡ µé¾î¿Â ¿äûÀ» ¼ºñ½ºÇÏÁö ¾Ê´Â´Ù. (´ÙÁßÇÁ·Î¼¼¼ ÄÄÇ»ÅÍ¿¡¼) ½¬´Â ÀÚ½Ä °³¼ö¸¸Å CPU °³¼ö°¡ ÀÖ´Â µå¹® °æ¿ì°¡ ¾Æ´Ï¶ó¸é ÀÌ ÇØ°áÃ¥Àº º°·Î ÁÁ¾Æº¸ÀÌÁö ¾Ê´Â´Ù.
´Ù¸¥ ¹æ¹ýÀº ¾ÆÆÄÄ¡°¡ »ç¿ëÇÏ´Â ¹æ¹ýÀ¸·Î ³»ºÎ ¹Ýº¹¹®¿¡ ÇÑ Àڽĸ¸À» µé¿©º¸³½´Ù. ¹Ýº¹¹®Àº ´ÙÀ½°ú °°´Ù (Â÷À̸¦ °Á¶ÇßÀ½):
for (;;) {
accept_mutex_on ();
for (;;) {
fd_set accept_fds;
FD_ZERO (&accept_fds);
for (i = first_socket; i <= last_socket; ++i) {
FD_SET (i, &accept_fds);
}
rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
if (rc < 1) continue;
new_connection = -1;
for (i = first_socket; i <= last_socket; ++i) {
if (FD_ISSET (i, &accept_fds)) {
new_connection = accept (i, NULL, NULL);
if (new_connection != -1) break;
}
}
if (new_connection != -1) break;
}
accept_mutex_off ();
process the new_connection;
}
accept_mutex_on
°ú accept_mutex_off
ÇÔ¼ö´Â mutex ¼¼¸¶Æ÷¾î¸¦ ±¸ÇöÇÑ´Ù. Çѹø¿¡ ¿ÀÁ÷ ÇÑ Àڽĸ¸ÀÌ mutex¸¦ °¡Áú ¼ö ÀÖ´Ù. mutex¸¦ ±¸ÇöÇÏ´Â ¹æ¹ýÀº ¿©·¯°¡ÁöÀÌ´Ù. ±¸Çö ¹æ¹ýÀº (1.3 ÀÌÀü) src/conf.h
³ª (1.3°ú ±× ÀÌÈÄ) src/include/ap_config.h
¿¡ Á¤ÀǵÇÀÖ´Ù. ¾î¶² ¾ÆÅ°ÅØÃÄ´Â Àá±Ý(locking) ¹æ¹ýÀ» ¼±ÅÃÇÏÁö ¾Ê±â¶§¹®¿¡, ÀÌ·± ¾ÆÅ°ÅØÃÄ¿¡¼ ¿©·¯ Listen
Áö½Ã¾î¸¦ »ç¿ëÇϸé À§ÇèÇÏ´Ù.
½ÇÇà½Ã AcceptMutex
Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© mutex ±¸ÇöÀ» º¯°æÇÒ ¼ö ÀÖ´Ù.
AcceptMutex flock
ÀÌ ¹æ¹ýÀº Àá±ÝÆÄÀÏÀ» Àá±×±âÀ§ÇØ flock(2)
½Ã½ºÅÛÈ£ÃâÀ» »ç¿ëÇÑ´Ù (Àá±ÝÆÄÀÏ À§Ä¡´Â LockFile
Áö½Ã¾î·Î ÁöÁ¤).
AcceptMutex fcntl
ÀÌ ¹æ¹ýÀº Àá±ÝÆÄÀÏÀ» Àá±×±âÀ§ÇØ fcntl(2)
½Ã½ºÅÛÈ£ÃâÀ» »ç¿ëÇÑ´Ù (Àá±ÝÆÄÀÏ À§Ä¡´Â LockFile
Áö½Ã¾î·Î ÁöÁ¤).
AcceptMutex sysvsem
(1.3°ú ±× ÀÌÈÄ) ÀÌ ¹æ¹ýÀ» SysV½Ä ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ¿© mutex¸¦ ±¸ÇöÇÑ´Ù. ºÒÇàÈ÷µµ SysV½Ä ¼¼¸¶Æ÷¾î´Â ³ª»Û ºÎÀÛ¿ëÀÌ ÀÖ´Ù. Çϳª´Â ¾ÆÆÄÄ¡°¡ ¼¼¸¶Æ÷¾î¸¦ Á¤¸®ÇÏÁö ¾Ê°í Á×À» ¼ö ÀÖ´Â Á¡ÀÌ´Ù (ipcs(8)
manpage Âü°í). ´Ù¸¥ Çϳª´Â À¥¼¹ö¿Í µ¿ÀÏÇÑ uid·Î ½ÇÇàÇÏ´Â CGI°¡ (Áï, suexec
³ª cgiwrapper
¸¦ »ç¿ëÇÏÁö¾Ê´Â ÇÑ ¸ðµç CGI) ¼¼¸¶Æ÷¾î API¸¦ »ç¿ëÇÏ¿© ¼ºñ½º°ÅºÎ°ø°ÝÀ» ÇÒ ¼ö ÀÖ´Â Á¡ÀÌ´Ù. ÀÌ·± ÀÌÀ¯¶§¹®¿¡ IRIX¸¦ Á¦¿ÜÇÑ ¾ÆÅ°ÅØÃÄ¿¡¼ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù (´ëºÎºÐÀÇ IRIX ÄÄÇ»ÅÍ¿¡¼ ¾ÕÀÇ µÎ ¹æ¹ýÀº Áö³ªÄ¡°Ô ¹ö°Ì´Ù).
AcceptMutex pthread
(1.3°ú ±× ÀÌÈÄ) ÀÌ ¹æ¹ýÀº POSIX mutex¸¦ »ç¿ëÇϱ⶧¹®¿¡ POSIX ¾²·¹µå ±Ô¾àÀ» ¿ÏÀüÈ÷ ±¸ÇöÇÑ ¾ÆÅ°ÅØÃĶó¸é ¸ðµÎ »ç¿ë°¡´ÉÇÏÁö¸¸, (2.5 ÀÌÈÄ) Solaris¿¡¼¸¸ ±×°Íµµ ƯÁ¤ ±¸¼º¿¡¼¸¸ µ¿ÀÛÇÏ´Â µíÇÏ´Ù. ÀÌ ¹æ¹ýÀ» ½ÃµµÇغ»´Ù¸é ¼¹ö°¡ ¸ØÃç¼ ÀÀ´äÀ» ¾ÈÇÏ´ÂÁö »ìÆìºÁ¾ß ÇÑ´Ù. Á¤Àû ³»¿ë¸¸ ¼ºñ½ºÇÏ´Â ¼¹ö´Â Àß µ¿ÀÛÇÏ´Â °Í °°´Ù.
AcceptMutex posixsem
(2.0°ú ±× ÀÌÈÄ) ÀÌ ¹æ¹ýÀº POSIX ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÑ´Ù. mutex¸¦ °¡Áø ÇÁ·Î¼¼½ºÀÇ ¾²·¹µå°¡ Á״´ٸé(segfault) ¼¼¸¶Æ÷¾î ¼ÒÀ¯±ÇÀÌ È¸º¹µÇÁö ¾Ê¾Æ¼ À¥¼¹ö°¡ ¸ØÃá´Ù.
½Ã½ºÅÛ¿¡ À§ ¸ñ·Ï¿¡ ¾ø´Â Á÷·ÄÈ(serialization) ¹æ¹ýÀÌ ÀÖ´Ù¸é ±× ¹æ¹ýÀ» »ç¿ëÇÏ´Â Äڵ带 APR¿¡ Ãß°¡ÇÒ °¡Ä¡°¡ ÀÖ´Ù.
°í·Á´Â ÇغÃÁö¸¸ ±¸ÇöÇÏÁö¾ÊÀº ´Ù¸¥ ¹æ¹ýÀº ºÎºÐÀûÀ¸·Î ¹Ýº¹¹®À» Á÷·ÄÈÇÏ´Â ¹æ¹ýÀÌ´Ù. Áï, ÇÁ·Î¼¼¼¸¦ ¸î°³¸¸ µé¿©º¸³»´Â °ÍÀÌ´Ù. ÀÌ ¹æ¹ýÀº ¿©·¯ ÀÚ½ÄÀ» µ¿½Ã¿¡ ½ÇÇàÇÒ ¼ö ÀÖ¾î¼ Á÷·Äȶ§¹®¿¡ Àüü ´ë¿ªÆøÀ» È°¿ëÇÏÁö ¸øÇÏ´Â ´ÙÁßÇÁ·Î¼¼¼ ÄÄÇ»ÅÍ¿¡¼¸¸ °ü½ÉÀ» °¡Á®º¼ ¼ö ÀÖ´Ù. ¾ÕÀ¸·Î »ìÆ캼 ºÎºÐÀÌÁö¸¸, ¸Å¿ì º´·ÄÈµÈ À¥¼¹ö°¡ ÈçÇÏÁö ¾Ê¾Æ¼ ¿ì¼±¼øÀ§°¡ ³·´Ù.
ÃÖ»óÀÇ ¼º´ÉÀ» ¾ò±âÀ§Çؼ´Â ¿©·¯ Listen
¹®À» »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÀÌ»óÀûÀÌ´Ù. ±×·¯³ª °è¼Ó ¼³¸íÇÑ´Ù.
¾ÕÀÇ ¼³¸íÀº ´ÙÁß¼ÒÄÏ ¼¹ö¿¡´Â ÁÁÁö¸¸, ¼ÒÄÏÀÌ ÇÑ°³ÀÎ ¼¹ö´Â ¾î¶²°¡? ¿¬°áÀÌ µµÂøÇÒ¶§±îÁö ¸ðµç ÀÚ½ÄÀÌ accept(2)
¿¡¼ ¸ØÃçÀֱ⶧¹®¿¡ ÀÌ·Ð»ó °°Àº ¹®Á¦°¡ ¹ß»ýÇÏÁö ¾Ê°í, °í°¥ ¹®Á¦µµ ¾ø´Ù. ±×·¯³ª ½ÇÁ¦·Î´Â ¾Õ¿¡¼ ¸»ÇÑ ´ë±âÇÏÁö ¾Ê´Â (non-blocking) ¹æ¹ý¿¡¼ ¹ß»ýÇÏ´Â "°øȸÀü(spinning)" Çö»óÀ» °¨Ãß°í ÀÖ´Ù. ´ëºÎºÐÀÇ TCP ½ºÅÃÀº ¿¬°áÀÌ µµÂøÇϸé Ä¿³ÎÀÌ accept
¿¡¼ ¸ØÃçÀÖ´Â ¸ðµç ÀÚ½ÄÀ» ±ú¿ìµµ·Ï ±¸ÇöµÇÀÖ´Ù. ÇÁ·Î¼¼½ºÁß ÇÑ°³°¡ ¿¬°áÀ» ¾ò°í »ç¿ëÀÚ¿µ¿ªÀ¸·Î µ¹¾Æ°¡°í, ³ª¸ÓÁö´Â Ä¿³Î¿¡¼ °øȸÀüÇÏ¿© ¿¬°áÀÌ ¾øÀ½À» ¹ß°ßÇÏ¸é ´Ù½Ã ÀáÀ» ÀÜ´Ù. »ç¿ëÀÚ¿µ¿ª Äڵ忡¼´Â ÀÌ·± °øȸÀüÀ» ¾Ë ¼ö ¾øÁö¸¸, ºÐ¸íÈ÷ Á¸ÀçÇÑ´Ù. ±×·¡¼ ´ÙÁß¼ÒÄÏÀÇ ´ë±âÇÏÁö ¾Ê´Â ¹æ¹ý°ú µ¿ÀÏÇÏ°Ô ºÎÇϸ¦ ³ôÀÌ´Â ºÒÇÊ¿äÇÑ ÇൿÀÌ ÀϾÙ.
±×·¡¼ ¿ì¸®´Â ¿©·¯ ¾ÆÅ°ÅØÃÄ¿¡¼ ¼ÒÄÏÀÌ ÇÑ°³ÀÎ °æ¿ì¿¡µµ Á÷·ÄÈÇÏ¸é ´õ "Àß" µ¿ÀÛÇÔÀ» ¹ß°ßÇß´Ù. ±×·¡¼ °ÅÀÇ ´ëºÎºÐÀÇ °æ¿ì ±âº»ÀûÀ¸·Î Á÷·Äȸ¦ »ç¿ëÇÑ´Ù. ¸®´ª½º¿¡¼ (Ä¿³Î 2.0.30, 128Mb ¸Þ¸ð¸®¿¡ µà¾ó Pentium pro) ½ÇÇèÇÑ °á°ú ¼ÒÄÏ ÇÑ°³¸¦ Á÷·ÄÈÇϸé ÇÏÁö ¾ÊÀº °æ¿ì¿¡ ºñÇØ ÃÊ´ç ¿äûÀÌ 3% ¹Ì¸¸ ÁÙ¾îµé¾ú´Ù. ±×·¯³ª Á÷·Äȸ¦ ÇÏÁö ¾ÊÀº °æ¿ì ¿äû´ç 100ms Áö¿¬ÀÌ ¹ß»ýÇß´Ù. ÀÌ Áö¿¬Àº ¾Æ¸¶µµ LAN¿¡¼ ¹ß»ýÇÏ´Â ±ä ¿¬°á¼±¶§¹®ÀÏ °ÍÀÌ´Ù. ¼ÒÄÏÀÌ ÇÑ°³ÀÎ °æ¿ì Á÷·Äȸ¦ »ç¿ëÇÏÁö ¾ÊÀ¸·Á¸é SINGLE_LISTEN_UNSERIALIZED_ACCEPT
¸¦ Á¤ÀÇÇÑ´Ù.
draft-ietf-http-connection-00.txt 8Àý¿¡¼ ¼³¸íÇϵíÀÌ ¾ÈÁ¤ÀûÀÎ À¥¼¹ö°¡ µÇ·Á¸é, Åë½ÅÀÇ ¾ç ¹æÇâÀ» µ¶¸³ÀûÀ¸·Î ´ÝÀ» ¼ö ÀÖ¾î¾ß ÇÑ´Ù (TCP ¿¬°áÀº ½Ö¹æÇâÀÌ°í, ¹æÇâÀº ¼·Î µ¶¸³ÀûÀÌ´Ù). ÀÌÁ¡À» ´Ù¸¥ ¼¹ö¿¡¼´Â ÀÚÁÖ °£°úÇÏÁö¸¸, ¾ÆÆÄÄ¡´Â 1.2ºÎÅÍ Á¤È®È÷ ±¸ÇöÇØ¿Ô´Ù.
ÀÌ ±â´ÉÀ» ºÎÁÖÀÇÇÏ°Ô ¾ÆÆÄÄ¡¿¡ Ãß°¡ÇßÀ»¶§ ¿©·¯ À¯´Ð½º ¹öÀü¿¡¼ ¸¹Àº ¹®Á¦°¡ ¹ß»ýÇß´Ù. TCP ±Ô¾àÀº FIN_WAIT_2
¿¡ ŸÀӾƿôÀÌ ÀÖ´Ù°í Á¤ÇÏÁö ¾Ê¾ÒÁö¸¸, ±ÝÁöÇÏÁöµµ ¾Ê¾Ò´Ù. ŸÀӾƿôÀÌ ¾ø´Â ½Ã½ºÅÛ¿¡¼ ¾ÆÆÄÄ¡ 1.2´Â ¸¹Àº ¼ÒÄÏÀ» ¿µ¿øÈ÷ FIN_WAIT_2
»óÅ·Π¸¸µé¾ú´Ù. ¸¹Àº °æ¿ì ÀÌ ¹®Á¦´Â Á¦Àۻ簡 Á¦°øÇÏ´Â ÃֽŠTCP/IP ÆÐÄ¡¸¦ Àû¿ëÇÏ¿© ÇØ°áÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª Á¦Àۻ簡 ÆÐÄ¡¸¦ ¹ßÇ¥ÇÏÁö ¾Ê´Â °æ¿ì°¡ (Áï, SunOS4 -- ¼Ò½º ¶óÀ̼±½º°¡ ÀÖ´Â »ç¶÷Àº Á÷Á¢ ÆÐÄ¡ÇÒ ¼ö ÀÖÁö¸¸) Àֱ⶧¹®¿¡ ÀÌ ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê±â·Î °áÁ¤Çß´Ù.
¹æ¹ýÀº µÎ°¡Áö´Ù. Çϳª´Â ¼ÒÄÏ ¿É¼Ç SO_LINGER
¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ±×·¯³ª ºÒÇàÈ÷µµ ´ëºÎºÐÀÇ TCP/IP ½ºÅÃÀº ÀÌ ¿É¼ÇÀ» ¿Ã¹Ù·Î ±¸ÇöÇÏÁö ¾Ê¾Ò´Ù. ¿Ã¹Ù·Î ±¸ÇöÇÑ ½ºÅÿ¡¼ Á¶Â÷µµ (Áï, ¸®´ª½º 2.0.31) ÀÌ ¹æ¹ýÀº ´ÙÀ½ ¹æ¹ýº¸´Ù ´õ cpu¸¦ Àâ¾Æ¸Ô´Â´Ù.
¾ÆÆÄÄ¡´Â º¸Åë (http_main.c
¿¡ ÀÖ´Â) lingering_close
¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ´ëÃæ ´ÙÀ½°ú °°´Ù:
void lingering_close (int s)
{
char junk_buffer[2048];
/* shutdown the sending side */
shutdown (s, 1);
signal (SIGALRM, lingering_death);
alarm (30);
for (;;) {
select (s for reading, 2 second timeout);
if (error) break;
if (s is ready for reading) {
if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {
break;
}
/* just toss away whatever is here */
}
}
close (s);
}
ÀÌ ÄÚµå´Â ¿¬°áÀ» ´ÝÀ»¶§ ´õ CPU¸¦ »ç¿ëÇÏÁö¸¸, ¾ÈÁ¤ÀûÀÎ ±¸ÇöÀ» À§ÇØ ÇÊ¿äÇÏ´Ù. HTTP/1.1ÀÌ ´õ ³Î¸® ÆÛÁö°í ¸ðµç ¿¬°áÀ» À¯ÁöÇÑ´Ù¸é(persistent), ¿¬°áÀ» ¹Þ´Â ºñ¿ëÀº ¿©·¯ ¿äûÀ» ó¸®ÇÏ¸é¼ »ó¼âµÉ °ÍÀÌ´Ù. À§ÇèÇÏ°Ôµµ NO_LINGCLOSE
¸¦ Á¤ÀÇÇÏ¿© ÀÌ ±â´ÉÀ» »ç¿ëÇÏÁö ¾ÊÀ» ¼ö ÀÖÁö¸¸, Àý´ë·Î ±ÇÇÏÁö ¾Ê´Â´Ù. ƯÈ÷ HTTP/1.1 ÆÄÀÌÇÁ¶óÀÎ (¿ªÁÖ; ¿¬°áÀ¯Áö »óÅ¿¡¼ ÀÀ´äÀ» ±â´Ù¸®Áö ¾Ê°í ¿©·¯ ¿äûÀ» º¸³»´Â ±â¼ú) ¿¬°áÀ¯Áö¿¡´Â lingering_close
°¡ ÇʼöÀûÀÌ´Ù (±×¸®°í ÆÄÀÌÇÁ¶óÀÎ ¿¬°áÀÌ ´õ ºü¸£±â¶§¹®¿¡ »ç¿ëÇÏ±æ ¹Ù¶ö °ÍÀÌ´Ù).
¾ÆÆÄÄ¡ÀÇ ºÎ¸ð¿Í ÀÚ½ÄÀº scoreboard¶ó´Â °ÍÀ» ÅëÇØ ¼·Î Åë½ÅÇÑ´Ù. ÀÌ»óÀûÀ¸·Î´Â scoreboard¸¦ °øÀ¯¸Þ¸ð¸®·Î ±¸ÇöÇØ¾ß ÇÑ´Ù. ¿ì¸® °³¹ßÀÚ°¡ ÇØ´ç ¿î¿µÃ¼Á¦¿¡ Á¢±ÙÇÒ ¼ö Àְųª »ó¼¼ÇÑ Æ÷Æà °á°ú¸¦ ¹ÞÀº °æ¿ì º¸Åë °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏ¿© ±¸ÇöÇÑ´Ù. ³ª¸ÓÁö´Â µð½ºÅ©¿¡ ÀÖ´Â ÆÄÀÏÀ» »ç¿ëÇÏ¿© ±¸ÇöÇÑ´Ù. µð½ºÅ©¿¡ ÀÖ´Â ÆÄÀÏÀº ´À¸®°í ½Å·Úµµ°¡ ¶³¾îÁø´Ù (±â´Éµµ ´õ Àû´Ù). src/main/conf.h
ÆÄÀÏ¿¡¼ »ç¿ëÇÏ´Â ¾ÆÅ°ÅØÃĸ¦ ã¾Æ¼ USE_MMAP_SCOREBOARD
ȤÀº USE_SHMGET_SCOREBOARD
ÀÎÁö È®ÀÎÇÑ´Ù. µÑÁß Çϳª¸¦ (°¢°¢ ÇÔ²² »ç¿ëÇÒ HAVE_MMAP
À̳ª HAVE_SHMGET
µµ °°ÀÌ) Á¤ÀÇÇÏ¸é °øÀ¯¸Þ¸ð¸® Äڵ带 »ç¿ëÇÑ´Ù. ½Ã½ºÅÛÀÌ ´Ù¸¥ Á¾·ùÀÇ °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÑ´Ù¸é src/main/http_main.c
ÆÄÀÏÀ» ¼öÁ¤ÇÏ¿© ¾ÆÆÄÄ¡¿¡¼ °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÈÅ(hook)À» Ãß°¡Ç϶ó. (¶ÇÇÑ ÆÐÄ¡¸¦ ¿ì¸®¿¡°Ô º¸³»ÁÖ±æ ¹Ù¶õ´Ù.)
¸ðµâÀ» µ¿ÀûÀ¸·Î ÀоîµéÀÌÁö ¾Ê´Â´Ù¸é (°¡´ÉÇÑ Á¶±ÝÀÌ¶óµµ ¼º´ÉÀ» ³ôÀ̱âÀ§ÇØ ÀÌ ±ÛÀ» ÀÐ´Â´Ù¸é ¾Æ¸¶µµ ¸ðµâÀ» µ¿ÀûÀ¸·Î ÀоîµéÀÌÁö ¾ÊÀ» °ÍÀÌ´Ù), ¼¹ö¸¦ ÄÄÆÄÀÏÇÒ¶§ -DDYNAMIC_MODULE_LIMIT=0
À» Ãß°¡ÇÑ´Ù. ±×·¯¸é ¸ðµâÀ» µ¿ÀûÀ¸·Î ÀоîµéÀ̱âÀ§ÇØ ÇÒ´çÇÏ´Â ¸Þ¸ð¸®¸¦ Àý¾àÇÑ´Ù.
´ÙÀ½Àº Solaris 8¿¡¼ worker MPMÀ» »ç¿ëÇÑ ¾ÆÆÄÄ¡ 2.0.38ÀÇ ½Ã½ºÅÛÈ£Ãâ ±â·Ï(trace)ÀÌ´Ù. ¾Æ·¡ ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ±â·ÏÀ» ¾ò¾ú´Ù:
truss -l -p httpd_child_pid.
-l
¿É¼ÇÀ» »ç¿ëÇϸé truss´Â ½Ã½ºÅÛÈ£ÃâÀ» ÇÏ´Â LWP (lightweight process, °æ·®±Þ ÇÁ·Î¼¼½º--SolarisÀÇ Ä¿³Î¼öÁØ ¾²·¹µå) ID¸¦ °°ÀÌ ±â·ÏÇÑ´Ù.
´Ù¸¥ ½Ã½ºÅÛ¿¡´Â strace
, ktrace
, par
°°Àº ½Ã½ºÅÛÈ£Ãâ ÃßÀû µµ±¸°¡ ÀÖ´Ù. °á°ú´Â ºñ½ÁÇÏ´Ù.
Ŭ¶óÀ̾ðÆ®´Â À¥¼¹ö¿¡°Ô Å©±â°¡ 10KBÀÎ Á¤Àû ÆÄÀÏÀ» ¿äûÇÑ´Ù. Á¤ÀûÀÎ ÆÄÀÏÀ» ¿äûÇÏÁö ¾Ê°Å³ª ³»¿ëÇù»óÇÏ´Â ¿äûÀ» ÇÑ °æ¿ì ±â·ÏÀÌ ¸Å¿ì ´Ù¸£´Ù (¶§·Î´Â ¸Å¿ì ¾Ë¾Æº¸±â Èûµé´Ù).
/67: accept(3, 0x00200BEC, 0x00200C0C, 1) (sleeping...) /67: accept(3, 0x00200BEC, 0x00200C0C, 1) = 9
À§¿¡¼ ¿¬°á´ë±â(listener) ¾²·¹µå°¡ LWP #67¿¡¼ ½ÇÇàµÊÀ» ¾Ë ¼ö ÀÖ´Ù.
accept(2)
Á÷·Äȸ¦ »ç¿ëÇÏÁö ¾ÊÀ½À» ÁÖ¸ñÇ϶ó. ¿©·¯ Æ÷Æ®¸¦ ±â´Ù¸®Áö¾Ê´Â °æ¿ì ÀÌ Ç÷¡ÆûÀÇ worker MPMÀº ±âº»ÀûÀ¸·Î Á÷·ÄÈÇÏÁö ¾ÊÀº accept¸¦ »ç¿ëÇÑ´Ù.
/65: lwp_park(0x00000000, 0) = 0 /67: lwp_unpark(65, 1) = 0
¿¬°áÀº ¹Þ¾ÆµéÀÌ°í(accept) ¿¬°á´ë±â ¾²·¹µå´Â worker ¾²·¹µå¸¦ ±ú¿ö¼ ¿äûÀ» ó¸®ÇÏ°Ô ÇÑ´Ù. ¾Æ·¡ ±â·Ï¿¡¼ ¿äûÀ» ó¸®ÇÏ´Â worker ¾²·¹µå°¡ LWP #65ÀÓÀ» ¾Ë ¼ö ÀÖ´Ù.
/65: getsockname(9, 0x00200BA4, 0x00200BC4, 1) = 0
°¡»óÈ£½ºÆ®¸¦ ±¸ÇöÇϱâÀ§ÇØ ¾ÆÆÄÄ¡´Â ¿¬°áÀ» ¹Þ¾ÆµéÀÎ Áö¿ª(local) ¼ÒÄÏ ÁÖ¼Ò¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù. (°¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÏÁö ¾Ê°Å³ª Listen
Áö½Ã¾î¿¡ ¿ÍÀϵåÄ«µå ÁÖ¼Ò¸¦ »ç¿ëÇÏÁö ¾ÊÀº °æ¿ì µî) ¸¹Àº °æ¿ì ÀÌ È£ÃâÀ» ¾ø¾Ù ¼ö ÀÖ´Ù. ±×·¯³ª ¾ÆÁ÷ ÀÌ·± ÃÖÀûÈ ÀÛ¾÷ÀÌ ¾ÈµÇÀÖ´Ù.
/65: brk(0x002170E8) = 0 /65: brk(0x002190E8) = 0
brk(2)
È£ÃâÀº Èü(heap)¿¡¼ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. À¥¼¹ö´Â ´ëºÎºÐÀÇ ¿äû 󸮽à ÀÚü ¸Þ¸ð¸® ÇÒ´çÀÚ(apr_pool
°ú apr_bucket_alloc
)¸¦ »ç¿ëÇϱ⶧¹®¿¡ ½Ã½ºÅÛÈ£Ãâ ±â·Ï¿¡¼ ÀÌ ½Ã½ºÅÛÈ£ÃâÀ» º¸±â°¡ µå¹°´Ù. ÀÌ ±â·Ï¿¡¼ À¥¼¹ö´Â ½ÃÀÛÇÏÀÚ¸¶ÀÚ ÀÚü ¸Þ¸ð¸® ÇÒ´çÀÚ°¡ »ç¿ëÇÒ ¸Þ¸ð¸®ºí·ÏÀ» ¾ò±âÀ§ÇØ malloc(3)
À» È£ÃâÇÑ´Ù.
/65: fcntl(9, F_GETFL, 0x00000000) = 2 /65: fstat64(9, 0xFAF7B818) = 0 /65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0 /65: fstat64(9, 0xFAF7B818) = 0 /65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0 /65: setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0 /65: fcntl(9, F_SETFL, 0x00000082) = 0
´ÙÀ½ worker ¾²·¹µå´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á(ÆÄÀϱâ¼úÀÚ 9)À» ´ë±â¾ÈÇÔ(non-blocking) »óÅ·Π¹Ù²Û´Ù. setsockopt(2)
¿Í getsockopt(2)
È£ÃâÀº SolarisÀÇ libc°¡ ¼ÒÄÏ¿¡ ´ëÇÑ fcntl(2)
À» ¾î¶»°Ô ó¸®ÇÏ´ÂÁö º¸¿©ÁØ´Ù.
/65: read(9, " G E T / 1 0 k . h t m".., 8000) = 97
worker ¾²·¹µå´Â Ŭ¶óÀ̾ðÆ®·Î ºÎÅÍ ¿äûÀ» Àд´Ù.
/65: stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0 /65: open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10
À¥¼¹ö ¼³Á¤Àº Options FollowSymLinks
¿Í AllowOverride None
ÀÌ´Ù. ±×·¡¼ ¿äûÇÑ ÆÄÀÏ°æ·ÎÀÇ °¢ µð·ºÅ丮¿¡ ´ëÇØ lstat(2)
Çϰųª .htaccess
ÆÄÀÏÀ» °Ë»çÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ÆÄÀÏÀ» °Ë»çÇϱâÀ§ÇØ, 1) ÆÄÀÏÀÌ ÀÖ´ÂÁö, 2) µð·ºÅ丮°¡ ¾Æ´Ñ ÀϹÝÆÄÀÏÀÎÁö, stat(2)
È£Ã⸸ ÇÏ¸é µÈ´Ù.
/65: sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C) = 10269
ÀÌ °æ¿ì À¥¼¹ö´Â ÇѹøÀÇ sendfilev(2)
½Ã½ºÅÛÈ£Ãâ·Î HTTP ÀÀ´äÇì´õ¿Í ¿äûÇÑ ÆÄÀÏÀ» Àü¼ÛÇÒ ¼ö ÀÖ´Ù. Sendfile Áö¿ø¿©ºÎ´Â ¿î¿µÃ¼Á¦¸¶´Ù ´Ù¸£´Ù. ´Ù¸¥ ½Ã½ºÅÛÀ̶ó¸é sendfile(2)
À» È£ÃâÇϱâ Àü¿¡ Çì´õ¸¦ º¸³»±âÀ§ÇØ write(2)
³ª writev(2)
È£ÃâÀ» ÇÑ´Ù.
/65: write(4, " 1 2 7 . 0 . 0 . 1 - ".., 78) = 78
write(2)
È£ÃâÀº Á¢±Ù·Î±×(access log)¿¡ ¿äûÀ» ±â·ÏÇÑ´Ù. ÀÌ ±â·Ï¿¡ time(2)
È£ÃâÀÌ ¾øÀ½À» ÁÖ¸ñÇ϶ó. ¾ÆÆÄÄ¡ 1.3°ú ´Þ¸® ¾ÆÆÄÄ¡ 2.0Àº ½Ã°£À» ¾Ë±âÀ§ÇØ gettimeofday(3)
¸¦ »ç¿ëÇÑ´Ù. gettimeofday
¸¦ ÃÖÀûÈÇÑ ¸®´ª½º¿Í Solaris °°Àº ¸î¸î ¿î¿µÃ¼Á¦¿¡¼´Â ÀϹÝÀûÀÎ ½Ã½ºÅÛÈ£Ã⠺δãÀÌ ¾ø´Ù.
/65: shutdown(9, 1, 1) = 0 /65: poll(0xFAF7B980, 1, 2000) = 1 /65: read(9, 0xFAF7BC20, 512) = 0 /65: close(9) = 0
worker ¾²·¹µå´Â ¿¬°áÀ» Áö¿¬´Ý±â(lingering close)ÇÑ´Ù.
/65: close(10) = 0 /65: lwp_park(0x00000000, 0) (sleeping...)
¸¶Áö¸·À¸·Î worker ¾²·¹µå´Â ¹æ±Ý Àü¼ÛÇÑ ÆÄÀÏÀ» ´Ý°í, ¿¬°á´ë±â(listener) ¾²·¹µå°¡ ´Ù¸¥ ¿¬°áÀ» ÇÒ´çÇÒ ¶§±îÁö Á¤ÁöÇÑ´Ù.
/67: accept(3, 0x001FEB74, 0x001FEB94, 1) (sleeping...)
±×µ¿¾È ¿¬°á´ë±â ¾²·¹µå´Â ¿¬°áÀ» (¸ðµç worker°¡ ÀÛ¾÷ÁßÀÌ¸é ¿¬°á´ë±â ¾²·¹µå¸¦ ¸ØÃß´Â worker MPMÀÇ È帧Á¦¾î ±â´É¿¡ µû¶ó) worker ¾²·¹µå¿¡ ÇÒ´çÇÏÀÚ¸¶ÀÚ ´Ù¸¥ ¿¬°áÀ» ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Ù. ÀÌ ±â·Ï¿¡´Â ³ª¿ÀÁö ¾ÊÁö¸¸, worker ¾²·¹µå°¡ ¹æ±Ý ¹ÞÀº ¿¬°áÀ» ó¸®ÇÏ´Â µ¿¾È ´ÙÀ½ accept(2)
°¡ (¿äûÀÌ ¸Å¿ì ¸¹Àº °æ¿ì Ç×»ó) ÀϾ ¼ö ÀÖ´Ù.