<-
Apache > HTTP Server > Documentation > Miscellaneous Documentation

ÄÄ ÉÇâ»ó 4p3g3t

ƢÉÇÑ î:  tr 

ÀÌ Â ÃÖÅÇ ÀÌ ÕÏÙ. ÃÖÙ ¯ƩµÈ »ëÀ µî ¦ ÂüíÇÏä.

ÄÄ 2.0À âÉú ÃƢÉú ÉÀÇ ÕÇüÀÌ ÂµµÏ èÇÑ üë À¥öÀÌÙ. ¥ÄÅ© âÏÀ» ìâÀÇ èÇÏÁö ÊÒÁö ÄÄ 2.0À ÇÁ¦ À Ʃì ôÀ ÉÀ» Ù.

ÄÄ 1.3ú ñÇ 2.0 öÀüÀ Ã硤ú ÈÀå(scalability)À» ôÀÌâÀÇ À ÃÖÀûȦ ÇÙ. â»ƨÀÎ ëÎ ÃÖÀûÈÇÑ ƨÀ» »çëÇÑÙ. ¯ ÄÄÄÀÏà ÈÀ ÇÇàà ÁÀÌ É Å« µÇâÀ» ÁÙ ö ÀÖÙ. ÀÌ Â ÄÄ 2.0ÀÇ ÉÀ» Çâ»óÇÏâÀÇ ö üÀÚƢ ÁÇÒ ö ÀÖ ÉÇÀ» íÇÑÙ. îҩ Á ÉÇÀ À¥öƢ ÇϵåîÍ îµÃÁ¦ÀÇ âÉÀ» õ À ÈƢëÇϵµÏ ÇÏ Ýé, îҩ ÉÇÀ Óµµ¦ ÀÇ âÉÀ» Èñ»ýÇÑÙ.

 Apache!

Âüí 251y31

top

ÇϵåîÍ îµÃÁ¦ ëÇ m1a71

À¥ö É ƢÀå Å« µÇâÀ» ÁÖ ÍÀ 碥Ù. ÒÀ äûç Áö¬Ã£À» »çëÀÚƢ "ÃÈ ü£Ùí" »ý¢ÇÏÁö ÇÏÔ Ã硾âҡש碯 À¥ö ÒÀ» ÇÏé ȵÈÙ. ÀÁÁöé »çëÀÚ ÁÁöÇÏí Ùà Á¢ÓÇÏ© ÎÇÏƢ èÓ ÁõƢÇÑÙ. MaxClients ÁöÃî¦ ÁÀýÇÏ© À¥öƢ ÒÀ» ÇÒ ÁµµÎ À ÀÚÄÀ» µéÁöʵµÏ Ç ÇÑÙ. ýÀ £ÜÇÏÙ: topú ơÀ µµ ÇÁÎ ñÏÀ» í ÄÄ ÇÁÎÀÇ òÕ »çëÀ» ËÈÄ, Àüà »çëƢÉÇÑ 碯 Ù¥ ÇÁεéÀÌ »çëÇÒ Ʃ£À» »« ƨ «Ù.

ÓÁö òüÇÏÙ: ÃÈ ü¥ U, ÃÈ ü¥ 碯Ä«µå, ÃÈ ü¥ µÅ©, ©â "ÃÈ ü¥"À ÇÇèÀ» Ç áÁÇ ÇÑÙ.

îµÃÁ¦Â Åë ¢ÀÚ Ë ÅÃÇÒ ÀÏÀÌÙ. ¯ ÀÏÝÀûÀÎ À¯ëÇÏÙí ÇíµÈ îƢÁö ÁöÄÀÌ ÀÖÙ:

top

ÇÇàà Á ëÇ 1t6p5j

HostnameLookupsÍ DNS ëÇ íÁÇÒ Áµé 1b5w4l

ÄÄ 1.3 ÀÌÀü logresolve ÇÁÎ¥À» »çëÇÏó.

Îà ÀÛÀÌ ö É ÇµÇâÀ» ÌÄÇÎ ÇÁ¦ »çëÇÏ À¥öƢ Ñ Ù¥ ÄÄÇ»ÅÍ ÎÄÀÏÀ» ÈÄÃÇÏ ÙõÙ.

Deny from domain ÁöÃî¦ »çëÇÑÙé (Áï, IP ÁÖÒƢ Ñ È£碬íÀÌ µµÀÎíÀ» »çëÇÑÙé) εÀÌ Á- DNS Ë»öÀ» (Ë»öÀ» ÇÑÈÄ ÇÀÇÎ ¯ƩµÇúÂÁö ÈÀÎÇÏâÀÇ Ùà ˻ö) Ç ÇÑÙ. ¯ÇÎ ÉÀ» ôÀÌâÀÇ ÀÌ ÁöÃî ƢÉÇÏé ÀÌעëÅ IP ÁÖÒ¦ »çëÇÑÙ.

<Location /server-status> Ç µîÀÎ ÁöÃîÀÇ ÀûëüÀע¦ Á¦ÇÑÇÒ ö ÀÖÀÀ» âïÇÏó. ÀÌ Ʃì ÁҡÇ Â äû DNS ÁȦ ÇÑÙ. ÙÀÀ .htmlú .cgi ÄÀÏ DNS Ë»öÀ» ÇÏ Á¦Ù:

HostnameLookups off
<Files ~ "\.(html|cgi)$">
HostnameLookups on
</Files>

¯ CGI DNSíÀÌ ÇÊäÇÒ »ÓÀÌóé, ÇÊäÇÑ ¯Á CGI gethostbyname È£ÃâÀ» ÇϵµÏ íÁÇ ö ÀÖÙ.

FollowSymLinksÍ SymLinksIfOwnerMatch 7661t

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 áú¦ ÄÌÇÏÁö Êâҡש碯 äûÀÌ µéîà ҡעҢÙ Å ơÀ ÀÛÀ» ÇÑÙ. ÁÂ¥ ɵũ È Ë»ç¦ ÇÑÙé ÙÀú ơÀÌ ÇÒ ö ÀÖÙ:

DocumentRoot /www/htdocs
<Directory />
Options FollowSymLinks
</Directory>

<Directory /www/htdocs>
Options -FollowSymLinks +SymLinksIfOwnerMatch
</Directory>

ÀÌ Ʃì ÃÖÒÇÑ RewriteRuleÀ» »çëÇÑ Ʃìµµ ÀעÍ ñÁÇÑ ÇÀÌ ÇÊäÇÏÙ. ɵũ ÈÀ» íÁÇÏÁö Êí ÃÖíÀÇ ÉÀ» òÀÁé, FollowSymLinks¦ ÁÇÏí, SymLinksIfOwnerMatch ÀýëΠȵÈÙ.

AllowOverride 64371g

URL Ʃ£ overrides¦ ÇãëÇÑÙé (Åë .htaccess ÄÀÏ) ÄÄ ÄÀÏíÀÇ ¢ ÎҢÙ .htaccess¦ õµÇÑÙ. ¦ µéî,

DocumentRoot /www/htdocs
<Directory />
AllowOverride all
</Directory>

/index.html URI ëÇÑ äûÀÌ ÀÖÙí ƢÁÇÏÀÚ. ÄÄ /.htaccess, /www/.htaccess, /www/htdocs/.htaccess¦ Áí õµÇÑÙ. ÇáÃ¥À ÕÀÇ Options FollowSymLinks ƩìÍ ñÁÇÏÙ. ÃÖíÀÇ ÉÀ» òÀÁé ÄÀÏÃÅÛ ëÇ Ç»ó AllowOverride NoneÀ» »çëÇÑÙ.

»ëÇù»ó 163x5a

ƢÉÇÏí ÁÂ¥ ÁҡÝÀÇ ÉÇâ»óµµ üÉÀÌ ÀÖÙé »ëÇù»óÀ» ÂÙ. ÇÁ¦Î Çù»óÀÇ À̵À ÉÀúÇÏÙ ÀÛÙ. ö¦ ü£Ô ÇÒ ö ÀÖÙ. ÙÀú ơÀÌ ÍÀϵåÄ«µå¦ »çëÇÏ ëÅ:

DirectoryIndex index

ÏÀüÇÑ ñÏÀ» »çëÇÑÙ:

DirectoryIndex index.cgi index.pl index.shtml index.html

ƢÀå ÈçÇÑ ÍÀ» Õ µÙ.

Ç, µÅä碯 ÄÀϵéÀ» ã MultiViews ÙÂ, ÇÑ ÄÀÏ ÀÀé ÇÊäÇÑ Á¦ òÀ» ö ÀÖ type-map ÄÀÏÀ» ÁÁ¢ µå ÍÀÌ õ üÀ» íÉÇÏó.

»çÀÌ碯 »ëÇù»óÀÌ ÇÊäÇÏÙé Çù»óÀ» ÀÇ Options MultiViews ÁöÃî¦ »çëÇÏâÙ type-map ÄÀÏÀ» íÁÇÏó. Çù»óý ëÇÑ ÀÚÇÑ íú type-map ÄÀÏÀ» µå ýÀ »ëÇù»ó ¦ ÂüíÇÏó.

碥ëÀÀ (memory-mapping) 445a37

¦ µéî, server-side-include¦ ÃÇÏ µî ÄÄ 2.0ÀÌ ÀüÛÇÒ ÄÀÏÀ» ÀÀ»ҡ îµÃÁ¦Ƣ mmap(2) µîÀ» ÁöÇÑÙé ÄÀÏÀ» 碥ëÀÀÇÑÙ.

©¯ ÇÃû 碥ëÀÀÀ» ÉÀ» Çâ»óÇÑÙ. ¯ 碥ëÀÀÀÌ öÀÇ ÉÀ» ҩî碬í ÉÁöî ÈÁÀ» ÇÄ ƩìƢ ÀÖÙ:

ÀÀÇ ÁҡÇ ÇçÇÏé ÀüÛÇÏ ÄÀÏÀ» 碥ëÀÀÇÏÁö ʵµÏ EnableMMAP off¦ »çëÇ ÇÑÙ. (ÁÖÀÇ: ÀÌ ÁöÃî µÅä稬ơÎ ¯ƩÇÒ ö ÀÖÙ.)

Sendfile 4q5o2v

ÄÄ îµÃÁ¦Ƣ sendfile(2)À» ÁöÇÏé ÄÎ sendfileÀ» »çëÇÏ© -- ¦ µéî, ÁÀû ÄÀÏÀ» ñÇÒҡ -- ÀüÛÇÒ ÄÀÏÀ» ÁÁ¢ ÀÁöÊÀ» ö ÀÖÙ.

©¯ ÇÃû sendfileÀ» »çëÇÏé readÍ send¦ µûÎ ÇÒ ÇÊäƢ î »óÁÙ. ¯ sendfileÀ» »çëÇÏé À¥öÀÇ ÈÁÀ» ÇÄԵǠƩìƢ ÀÖÙ:

ÀÀÇ ÁҡÇ ÇçÇÏé ÄÀÏÀ» sendfile ÀüÛÇÏÁö ʵµÏ EnableSendfile off¦ »çëÇ ÇÑÙ. (ÁÖÀÇ: ÀÌ ÁöÃî µÅä稬ơÎ ¯ƩÇÒ ö ÀÖÙ.)

ÇÁÎ »ý 1u4w6f

ÄÄ 1.3 ÀÌÀü StartServers â»ƨÀÌ 5ÀÎ ö ŬóÀÌ 100ƩƢ µÃ Á¢ÓÇÏé ÎÇϦ ÃÇÏâ ÃÇÑ ÀÚÄÀ» µéâîÁö 95ÃÊƢ ÉÈÙ. ÀÚÁÖ ÀçÃÀÛÇÏÁö Ê ÇÁ¦ ö À µÀÛÇÏÁö, 10£ ÇÇàÇÏ ¥ÄÅ© áú Åì »ÚÔ ÂÙ.

ÃÊç ÇÑƩ ÔÄ¢À ÀÚÄÀ» »õÎ ÃÀÛÇÏé ö «碬¦ ÁÖÁö ÊÀÁí ÁÇÙ. ÄÄÇ»ÅÍƢ ÀÚÄÀ» ÃÀÛÇÏÀó Ù»Úé äûÀ» ñÇÒ ö Ù. ¯ ÀÌ ÔÄ¢ÀÌ ÄÄÀÇ Ãơ É ÇµÇâÀ» ÁÖî ¯ƩÇÏÙ. ÄÄ 1.3 ÃÊç ÇÑƩ ÔÄ¢À ÏȵÇúÙ. ÄÚµå ÀÚÄ ÇÑƩ¦ µéí, 1ÃÊ ¬í, µÎƩ¦ µéí, 1ÃÊ ¬í, Ʃ¦ µéí, ÀÌ ÄÀÎ ÃÊç ÀÚÄÀ» 32Ʃ µéҡסîÁö ÁööÎ ÁõƢÇÑÙ. ÀÚÄöƢ MinSpareServers Á ÙÙ£é ÁõƢ¦ ÁÜÇÑÙ.

ÀÌ Ʃì ÝÀÀÓµµƢ »óÁ mod_status áúƢ µµòÀÌ µÉ ÍÀÌÙ.

ÇÁÎ »ýú üÃÇÏ© MaxRequestsPerChild ÁÀ ÇÁΦ ÁáÇÑÙ. â»ƨÀ ÀÚÄç ÃÇÒ äûö Á¦ÇÑÀÌ Ù 0ÀÌÙ. ÇöÀç ÁÀÌ 30ú ơÀÌ Åì ÀÛÀ ƨÀÎ ÁµÇÀÖÙé, ƨÀ» »óçÈ ôÈú ÇÊäƢ ÀÖÙ. SunOS ÀµÈ Solaris öÀüÀ» »çëÇÑÙé, À¯Ãâҡש碯 ÀÌ ƨÀ» 10000 ÁµµÎ ÁÇÏó.

¬áÀ¯Áö(keep-alive)¦ »çëÇÑÙé ÀÚĵéÀ ÀÌÌ ¬á ÃƢ äûÀ» âÙ碬ç «Íµµ ÇÏÁöÊâҡש碯 èÓ Ù»ÚÙ. KeepAliveTimeoutÀÇ â»ƨ 15 ÃÊ ÀÌ Çö»óÀ» ÃÖÒÈÇÑÙ. 碯 ëú ö ÀÚ £ÀÇ ÕÇüÀÌ ÂÔ ÁÇÑÙ. ¬áÀ¯ÁöÀÇ ëÎÀÇ ÀÌÁÀÌ »çóÁöâҡש碯 îҩ Ʃìµµ ÀÌ ƨÀ» 60 ÃÊ ÀÌ»óÀÎ ÃÁö Ңó.

top

ÄÄÄÀÏà Á ëÇ 50m13

MPM ÅÃ 57a3e

ÄÄ 2.x mpm_winntÍ ơÀÌ ¯Á ÇÃû »çëÇÒ ö ÀÖ MPMµµ ÀÖÙ. ÀÏÝÀûÀÎ À¯ù ÃÅÛÀ ©¯ MPM Á ÇϦ ÅÃÇÒ ö ÀÖÙ. À¥öÀÇ ÓµµÍ ÈÀå(scalability)À îҩ MPMÀ» ÅÃÇÄ ÈÙ:

ÀÌ MPMµéú Ù¥ MPM ëÇ õ ÀÚÇÑ Á MPM ¦ ÂüíÇÏ ÙõÙ.

µâ 5ho1i

»çëÀÌ É ƢÀå ÁäÇÑ äÀÎÀÌâҡש碯 ÇÁ¦Î »çëÇÏÁö Ê µâÀ» Á¦ÅÇÀÚ. µâÀ» Loodule ÁöÃî¦ ÁÖÃÇÏé µÈÙ. µâÀ» Á¦ÅÇÏí ÇÇàÇÏ© »çÀÌƢ µâÀ̵µ Á»óÀûÀÎ µÀÛÇÏÂÁö »ìì ö ÀÖÙ.

ÝëÎ µâÀÌ ÄÄ ÇÇàÄÀÏ ÁÀûÀÎ µÅ©µÇÀÖÙé ÇÏÁö Ê µâÀ» Á¦ÅÇÏâÀÇ ÄĦ ÀçÄÄÄÀÏÇ ÇÑÙ.

©â ç¬È îҩ µâÀ» »çëÇÏí »çëÇÏÁö »Áö ÀÇÀÌ »ýäÙ. ÁäÀ À¥»çÀÌ碬ҢÙ Ù£Ù. ¯ µµ ÃÖÒÇÑ mod_log_config µâÀ »çëÇÒ ÍÀÌÙ. ơ À¥»çÀÌ碯 ÎÄÀÏÀÌ ÇÊäÙé mod_log_config  µÈÙ. ¯ ÃõÇÏÁö ÊÂÙ.

Atomic íÉ 4mi4z

mod_cache ơÀ µâú ÃÖÙ ƩÁÀÎ worker MPMÀ APRÀÇ atomic API¦ »çëÇÑÙ. ÀÌ API Ʃ硾 µå µâȦ ÀÇÒ atomic íÉÀ» Á¦ƩÇÑÙ.

â»ÀûÀÎ APRÀ ¢ îµÃÁ¦/U ÇÃû ƢÀå ÈÀÀûÀÎ ýÀ» »çëÇÏ© ÀÌ íÉÀ» ÇöÇÑÙ. ¦ µéî, ©¯ ÃÖÅ U ÇϵåîÎ atomic compare-and-swap (CAS) ¬»êÀ» ÇÏ íÉîƢ ÀÖÙ. ¯ îҩ ÇÃû APRÀ ÀÌ íÉîƢ  ÀµÈ UÍ È£È¯À» ÀÇ õ À mutexâÝ ÇöÀ» â»ÀûÀÎ »çëÇÑÙ. ÀÌ ÇÃû ÄĦ ÄÄÄÀÏÇÒҡ ÄĦ ÃÖÅ U ÇÇàÇÒ èÈÀÌóé, ÄĦ ÇÒҡ --enable-nonportable-atomics ÉÇÀ» »çëÇÏ© õ ü¥ atomic ÇöÀ» ÅÃÇÒ ö ÀÖÙ:

./buildconf
./configure --with-mpm=worker --enable-nonportable-atomics=yes

--enable-nonportable-atomics ÉÇÀ ÙÀú ơÀ ÇÃû µÇâÀÌ ÀÖÙ:

mod_statusÍ ExtendedStatus On 2916n

ÄĦ ÄÄÄÀÏÇÒҡ mod_status¦ ÇÔÇÏí ÇÇàÇÒҡ ExtendedStatus OnÀ» ÁÇÏé ÄÄ äûÀ» À»ҡעҢÙ gettimeofday(2)(ÈÀ îµÃÁ¦ µûó times(2))¦ µÎ È£ÃâÇÏí (1.3 ÀÌÀüÂ) time(2)µµ ÃƢÎ ©¯ È£ÃâÇÑÙ. »óÅÂ í µÀÛãÀÌ ÇÊäÇÏâ ҡשÀÌÙ. ÃÖ»óÀÇ ÉÀ» òÀÁé (â»ƨÀÎ) ExtendedStatus off¦ ÁÇÑÙ.

accept ÁÄÈ - ©¯ ÒÄÏ 654h5k

ÁÖÀÇ: 6q4d4w

 ÄÄ À¥ö 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¦ ǵµ ÃÁö Êí, Áïà ÁÇàÇÒ ö ÀÖÙ. ¯ U ãÀ» ҨñÇÑÙ. select ¬Â ÀÚÄÀÌ 10Ʃ ÀÖí, »õÎ ¬áÀÌ ÇÑƩ µéîÔÙí ƢÁÇÏÀÚ. ¯é ÀÌ ÀÚÄÁ 9Ʃ úî ¬áÀ» acceptÇÏ ÃµµÇÏí ÇÇÏé « Àϵµ ÇÏÁö Êí Ùà select¦ ÝÇÑÙ. Ùà selectÎ µÃ ҡסîÁö îҩ ÀÚĵµ Ù¥ ÒÄÏ µéî äûÀ» ñÇÏÁö ÊÂÙ. (ÙÁÇÁÎ ÄÄÇ»ÅÍ) ¬Â ÀÚÄ ƩöÅ U ƩöƢ ÀÖ µå ƩìƢ Ïóé ÀÌ ÇáÃ¥À ơÎ ÁÁÀÌÁö ÊÂÙ.

Ù¥ ýÀ ÄÄƢ »çëÇÏ ýÀÎ »Î Ý碯 ÇÑ ÀÚÄÀ» µé©Ù. ÝÀ ÙÀú ơƢÙ (ÂÀ̦ ơÁÇÀ):

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 ÁÄÈ - ÒÄÏ ÇÑƩ 3n535e

ÕÀÇ íÀ ÙÁÒÄÏ ö ÁÁÁö, ÒÄÏÀÌ ÇÑƩÀÎ ö îҩƢ? ¬áÀÌ µµÂÇÒҡסîÁö µç ÀÚÄÀÌ accept(2) ÃçÀÖâҡש碯 ÀÌ»ó ơÀ Á¦Ƣ »ýÇÏÁö Êí, í¥ Á¦µµ Ù. ¯ ÇÁ¦ÎÂ Õ »ÇÑ ëâÇÏÁö Ê (non-blocking) ý »ýÇÏ "ƩÈÀü(spinning)" Çö»óÀ» ơÃí ÀÖÙ. ëÎÀÇ T ÅÃÀ ¬áÀÌ µµÂÇÏé ÄÎÀÌ accept ÃçÀÖ µç ÀÚÄÀ» úìµµÏ ÇöµÇÀÖÙ. ÇÁÎÁ ÇÑƩƢ ¬áÀ» òí »çëÀÚµÀÎ µƢí, ÓÁö ÄÎ ƩÈÀüÇÏ© ¬áÀÌ ÀÀ» ƩÇÏé Ùà ÀáÀ» ÀÜÙ. »çëÀÚµ ÄÚµå ÀÌ ƩÈÀüÀ» Ë ö Áö, íÈ ÁÀçÇÑÙ. ÙÁÒÄÏÀÇ ëâÇÏÁö Ê ýú µÀÏÇÏÔ ÎÇϦ ôÀÌ ÒÇÊäÇÑ ÇàµÀÌ ÀÏîÙ.

ì碥 ©¯ ÅÅÃÄ ÒÄÏÀÌ ÇÑƩÀÎ Ʃìµµ ÁÄÈÇÏé õ "À" µÀÛÇÔÀ» ƩÇÙ. ÅÀÇ ëÎÀÇ Ʃì â»ÀûÀÎ ÁÄȦ »çëÇÑÙ. 碥 (ÄÎ 2.0.30, 128Mb 碯 µàó Pentium pro) ÇÇèÇÑ áú ÒÄÏ ÇÑƩ¦ ÁÄÈÇÏé ÇÏÁö ÊÀ Ʃì ñÇ ÃÊç äûÀÌ 3% Ì ÁÙîµéúÙ. ¯ ÁÄȦ ÇÏÁö ÊÀ Ʃì äûç 100ms Áö¬ÀÌ »ýÇÙ. ÀÌ Áö¬À µµ LAN »ýÇÏÂ ä ¬áҡשÀÏ ÍÀÌÙ. ÒÄÏÀÌ ÇÑƩÀÎ Ʃì ÁÄȦ »çëÇÏÁö ÊÀÁé SINGLE_LISTEN_UNSERIALIZED_ACCEPT¦ ÁÀÇÇÑÙ.

Close Áö¬(lingering) 2l6p5w

draft-ietf-http-connection-00.txt 8Àý íÇϵíÀÌ ÈÁÀûÀÎ À¥öƢ µÇÁé, ÅëÅÀÇ ç ÇâÀ» µҢÀûÀÎ ÝÀ» ö ÀÖî ÇÑÙ (T ¬áÀ ÖÇâÀÌí, ÇâÀ Î µҢÀûÀÌÙ). ÀÌÁÀ» Ù¥ ö ÀÚÁÖ £úÇÏÁö, ÄÄ 1.2ÎÅÍ ÁÈÈ ÇöÇÔÙ.

ÀÌ âÉÀ» ÎÁÖÀÇÇÏÔ ÄÄ ÃƢÇÀ»ҡ ©¯ À¯ öÀü À Á¦Ƣ »ýÇÙ. T ÔàÀ FIN_WAIT_2 ÅÀÓôÀÌ ÀÖÙí ÁÇÏÁö ÊÒÁö, ÝÁöÇÏÁöµµ ÊÒÙ. ÅÀÓôÀÌ Â ÃÅÛ ÄÄ 1.2 À ÒÄÏÀ» µÈ FIN_WAIT_2 »óÅÂÎ µéúÙ. À Ʃì ÀÌ Á¦Â Á¦ÀÛ»çƢ Á¦ƩÇÏ ÃÖÅ T/IP Ħ ÀûëÇÏ© ÇáÇÒ ö ÀÖÙ. ¯ Á¦ÀÛ»çƢ Ħ Ç¥ÇÏÁö Ê ƩìƢ (Áï, SunOS4 -- Ò óÀÌƢ ÀÖ »çҡÀ ÁÁ¢ ÄÇÒ ö ÀÖÁö) ÀÖâҡש碯 ÀÌ âÉÀ» »çëÇÏÁö ÊâÎ áÁÇÙ.

ýÀ µÎƢÁöÙ. ÇÏ ÒÄÏ ÉÇ SO_LINGER¦ »çëÇÏ ýÀÌÙ. ¯ ÒÇàȵµ ëÎÀÇ T/IP ÅÃÀ ÀÌ ÉÇÀ» ÃÙÎ ÇöÇÏÁö ÊÒÙ. ÃÙÎ ÇöÇÑ Åà Áµµ (Áï, 碥 2.0.31) ÀÌ ýÀ ÙÀ ýÙ õ u¦ ÀâÔÂÙ.

ÄÄ Åë (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);
}

ÀÌ Äڵ堬áÀ» ÝÀ»ҡ õ U¦ »çëÇÏÁö, ÈÁÀûÀÎ ÇöÀ» ÀÇ ÇÊäÇÏÙ. HTTP/1.1ÀÌ õ Î ÛÁöí µç ¬áÀ» À¯ÁöÇÑÙé(persistent), ¬áÀ»  ñëÀ ©¯ äûÀ» ÃÇÏé »óâµÉ ÍÀÌÙ. ÀÇèÇÏÔµµ NO_LINGCLOSE¦ ÁÀÇÇÏ© ÀÌ âÉÀ» »çëÇÏÁö ÊÀ» ö ÀÖÁö, ÀýëÎ ÇÇÏÁö ÊÂÙ. ¯È HTTP/1.1 ÄÀÌÇÁóÀÎ (ÁÖ; ¬áÀ¯Áö »óÅ ÀÀäÀ» âÙÁö Êí ©¯ äûÀ» »Â âú) ¬áÀ¯Áö lingering_closeƢ ÇÊöÀûÀÌÙ (í ÄÀÌÇÁóÀÎ ¬áÀÌ õ ü£âҡש碯 »çëÇÏ Ùö ÍÀÌÙ).

Scoreboard ÄÀÏ 32114p

ÄÄÀÇ ÎÍ ÀÚÄÀ scoreboardó ÍÀ» ÅëÇ Î ÅëÅÇÑÙ. ÀÌ»óÀûÀΠscoreboard¦ ƩÀ¯硤Î ÇöÇ ÇÑÙ. ì ƩÀÚƢ Çç îµÃÁ¦ Á¢ÙÇÒ ö ÀÖÅ »óÇÑ Ã áú¦ À Ʃì Åë ƩÀ¯碬¦ »çëÇÏ© ÇöÇÑÙ. ÓÁö µÅ© ÀÖ ÄÀÏÀ» »çëÇÏ© ÇöÇÑÙ. µÅ© ÀÖ ÄÀÏÀ Àí ÅÚµµƢ ҩîÁÙ (âɵµ õ ÀûÙ). src/main/conf.h ÄÀÏ »çëÇÏ ÅÅÃĦ ã USE_MMAP_SCOREBOARD ÈÀ USE_SHMGET_SCOREBOARDÀÎÁö ÈÀÎÇÑÙ. µÑÁ ÇϦ (¢¢ ÇÔ »çëÇÒ HAVE_MMAPÀÌ HAVE_SHMGETµµ ơÀÌ) ÁÀÇÇÏé ƩÀ¯ ÄÚµå¦ »çëÇÑÙ. ÃÅÛÀÌ Ù¥ ÁùÀÇ ƩÀ¯碬¦ »çëÇÑÙé src/main/http_main.c ÄÀÏÀ» öÁÇÏ© ÄÄ ƩÀ¯碬¦ »çëÇÒ ö ÀÖµµÏ ÈÅ(hook)À» ÃƢÇÏó. (ÇÇÑ Ä¦ ì碯Ô »ÁÖ ÙõÙ.)

»çÀû í: ÄÄÀÇ 碥 öÀüÀ ÄÄ 1.2 öÀüÎÅÍ ƩÀ¯碬¦ »çëÇÏâ ÃÀÛÇÙ. 碥 ÃÊâ ÄÄ öÀüÀÌ Àí ÅÚµµƢ ҩîÁâ ҡשÀÌÙ.

DYNAMIC_MODULE_LIMIT 30651y

µâÀ» µÀûÀÎ ÀîµéÀÌÁö ÊÂÙé (ƢÉÇÑ ÁҡÝÀÌóµµ ÉÀ» ôÀÌâÀÇ ÀÌ ÛÀ» ÀÂÙé µµ µâÀ» µÀûÀÎ ÀîµéÀÌÁö ÊÀ» ÍÀÌÙ), ö¦ ÄÄÄÀÏÇÒҡ -DDYNAMIC_MODULE_LIMIT=0À» ÃƢÇÑÙ. ¯é µâÀ» µÀûÀÎ ÀîµéÀÌâÀÇ ÇÒçÇÏ 碬¦ ÀýàÇÑÙ.

top

ÎÏ: ÃÅÛÈ£Ãâ âÏÀ» ÀÚÈ ÇÏâ 6ni59

ÙÀÀ 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)Ƣ (äûÀÌ Åì À Ʃì Ç»ó) ÀÏî¯ ö ÀÖÙ.

ƢÉÇÑ î:  tr 

top

Comments 2p1l6j

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our s if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.