Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
nginxƽ̨³õ̽
 
À´Ô´£ºtengine ·¢²¼ÓÚ£º 2015-04-10
  3426  次浏览      27
 

³õ̽nginx¼Ü¹¹(100%)

ÖÚËùÖÜÖª£¬nginxÐÔÄܸߣ¬¶ønginxµÄ¸ßÐÔÄÜÓëÆä¼Ü¹¹ÊÇ·Ö²»¿ªµÄ¡£ÄÇônginx¾¿¾¹ÊÇÔõôÑùµÄÄØ£¿ÕâÒ»½ÚÎÒÃÇÏÈÀ´³õʶһÏÂnginx¿ò¼Ü°É¡£

nginxÔÚÆô¶¯ºó£¬ÔÚunixϵͳÖлáÒÔdaemonµÄ·½Ê½ÔÚºǫ́ÔËÐУ¬ºǫ́½ø³Ì°üº¬Ò»¸ömaster½ø³ÌºÍ¶à¸öworker½ø³Ì¡£ÎÒÃÇÒ²¿ÉÒÔÊÖ¶¯µØ¹Øµôºǫ́ģʽ£¬ÈÃnginxÔÚǰ̨ÔËÐУ¬²¢ÇÒͨ¹ýÅäÖÃÈÃnginxÈ¡Ïûmaster½ø³Ì£¬´Ó¶ø¿ÉÒÔʹnginxÒÔµ¥½ø³Ì·½Ê½ÔËÐС£ºÜÏÔÈ»£¬Éú²ú»·¾³ÏÂÎÒÃǿ϶¨²»»áÕâô×ö£¬ËùÒԹرպǫ́ģʽ£¬Ò»°ãÊÇÓÃÀ´µ÷ÊÔÓõģ¬ÔÚºóÃæµÄÕ½ÚÀïÃæ£¬ÎÒÃÇ»áÏêϸµØ½²½âÈçºÎµ÷ÊÔnginx¡£ËùÒÔ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½£¬nginxÊÇÒÔ¶à½ø³ÌµÄ·½Ê½À´¹¤×÷µÄ£¬µ±È»nginxÒ²ÊÇÖ§³Ö¶àÏ̵߳ķ½Ê½µÄ£¬Ö»ÊÇÎÒÃÇÖ÷Á÷µÄ·½Ê½»¹ÊÇ¶à½ø³ÌµÄ·½Ê½£¬Ò²ÊÇnginxµÄĬÈÏ·½Ê½¡£nginx²ÉÓÃ¶à½ø³ÌµÄ·½Ê½ÓÐÖî¶àºÃ´¦£¬ËùÒÔÎÒ¾ÍÖ÷Òª½²½ânginxµÄ¶à½ø³Ìģʽ°É¡£

¸Õ²Å½²µ½£¬nginxÔÚÆô¶¯ºó£¬»áÓÐÒ»¸ömaster½ø³ÌºÍ¶à¸öworker½ø³Ì¡£master½ø³ÌÖ÷ÒªÓÃÀ´¹ÜÀíworker½ø³Ì£¬°üº¬£º½ÓÊÕÀ´×ÔÍâ½çµÄÐźţ¬Ïò¸÷worker½ø³Ì·¢ËÍÐźţ¬¼à¿Øworker½ø³ÌµÄÔËÐÐ״̬£¬µ±worker½ø³ÌÍ˳öºó(Òì³£Çé¿öÏÂ)£¬»á×Ô¶¯ÖØÐÂÆô¶¯ÐµÄworker½ø³Ì¡£¶ø»ù±¾µÄÍøÂçʼþ£¬ÔòÊÇ·ÅÔÚworker½ø³ÌÖÐÀ´´¦ÀíÁË¡£¶à¸öworker½ø³ÌÖ®¼äÊǶԵȵģ¬ËûÃÇͬµÈ¾ºÕùÀ´×Ô¿Í»§¶ËµÄÇëÇ󣬸÷½ø³Ì»¥ÏàÖ®¼äÊǶÀÁ¢µÄ¡£Ò»¸öÇëÇó£¬Ö»¿ÉÄÜÔÚÒ»¸öworker½ø³ÌÖд¦Àí£¬Ò»¸öworker½ø³Ì£¬²»¿ÉÄÜ´¦ÀíÆäËü½ø³ÌµÄÇëÇó¡£worker½ø³ÌµÄ¸öÊýÊÇ¿ÉÒÔÉèÖõģ¬Ò»°ãÎÒÃÇ»áÉèÖÃÓë»úÆ÷cpuºËÊýÒ»Ö£¬ÕâÀïÃæµÄÔ­ÒòÓënginxµÄ½ø³ÌÄ£ÐÍÒÔ¼°Ê¼þ´¦ÀíÄ£ÐÍÊÇ·Ö²»¿ªµÄ¡£nginxµÄ½ø³ÌÄ£ÐÍ£¬¿ÉÒÔÓÉÏÂͼÀ´±íʾ£º

ÔÚnginxÆô¶¯ºó£¬Èç¹ûÎÒÃÇÒª²Ù×÷nginx£¬ÒªÔõô×öÄØ£¿´ÓÉÏÎÄÖÐÎÒÃÇ¿ÉÒÔ¿´µ½£¬masterÀ´¹ÜÀíworker½ø³Ì£¬ËùÒÔÎÒÃÇÖ»ÐèÒªÓëmaster½ø³ÌͨОÍÐÐÁË¡£master½ø³Ì»á½ÓÊÕÀ´×ÔÍâ½ç·¢À´µÄÐźţ¬ÔÙ¸ù¾ÝÐźÅ×ö²»Í¬µÄÊÂÇé¡£ËùÒÔÎÒÃÇÒª¿ØÖÆnginx£¬Ö»ÐèҪͨ¹ýkillÏòmaster½ø³Ì·¢ËÍÐźžÍÐÐÁË¡£±ÈÈçkill -HUP pid£¬ÔòÊǸæËßnginx£¬´ÓÈݵØÖØÆônginx£¬ÎÒÃÇÒ»°ãÓÃÕâ¸öÐźÅÀ´ÖØÆônginx£¬»òÖØÐ¼ÓÔØÅäÖã¬ÒòΪÊÇ´ÓÈݵØÖØÆô£¬Òò´Ë·þÎñÊDz»Öжϵġ£master½ø³ÌÔÚ½ÓÊÕµ½HUPÐźźóÊÇÔõô×öµÄÄØ£¿Ê×ÏÈmaster½ø³ÌÔÚ½Óµ½Ðźź󣬻áÏÈÖØÐ¼ÓÔØÅäÖÃÎļþ£¬È»ºóÔÙÆô¶¯ÐµÄworker½ø³Ì£¬²¢ÏòËùÓÐÀϵÄworker½ø³Ì·¢ËÍÐźţ¬¸æËßËûÃÇ¿ÉÒÔ¹âÈÙÍËÐÝÁË¡£ÐµÄworkerÔÚÆô¶¯ºó£¬¾Í¿ªÊ¼½ÓÊÕеÄÇëÇ󣬶øÀϵÄworkerÔÚÊÕµ½À´×ÔmasterµÄÐźź󣬾Ͳ»ÔÙ½ÓÊÕеÄÇëÇ󣬲¢ÇÒÔÚµ±Ç°½ø³ÌÖеÄËùÓÐδ´¦ÀíÍêµÄÇëÇó´¦ÀíÍê³Éºó£¬ÔÙÍ˳ö¡£µ±È»£¬Ö±½Ó¸ømaster½ø³Ì·¢ËÍÐźţ¬ÕâÊDZȽÏÀϵIJÙ×÷·½Ê½£¬nginxÔÚ0.8°æ±¾Ö®ºó£¬ÒýÈëÁËһϵÁÐÃüÁîÐвÎÊý£¬À´·½±ãÎÒÃǹÜÀí¡£±ÈÈ磬./nginx -s reload£¬¾ÍÊÇÀ´ÖØÆônginx£¬./nginx -s stop£¬¾ÍÊÇÀ´Í£Ö¹nginxµÄÔËÐС£ÈçºÎ×öµ½µÄÄØ£¿ÎÒÃÇ»¹ÊÇÄÃreloadÀ´Ëµ£¬ÎÒÃÇ¿´µ½£¬Ö´ÐÐÃüÁîʱ£¬ÎÒÃÇÊÇÆô¶¯Ò»¸öеÄnginx½ø³Ì£¬¶øÐµÄnginx½ø³ÌÔÚ½âÎöµ½reload²ÎÊýºó£¬¾ÍÖªµÀÎÒÃǵÄÄ¿µÄÊÇ¿ØÖÆnginxÀ´ÖØÐ¼ÓÔØÅäÖÃÎļþÁË£¬Ëü»áÏòmaster½ø³Ì·¢ËÍÐźţ¬È»ºó½ÓÏÂÀ´µÄ¶¯×÷£¬¾ÍºÍÎÒÃÇÖ±½ÓÏòmaster½ø³Ì·¢ËÍÐźÅÒ»ÑùÁË¡£

ÏÖÔÚ£¬ÎÒÃÇÖªµÀÁ˵±ÎÒÃÇÔÚ²Ù×÷nginxµÄʱºò£¬nginxÄÚ²¿×öÁËЩʲôÊÂÇ飬ÄÇô£¬worker½ø³ÌÓÖÊÇÈçºÎ´¦ÀíÇëÇóµÄÄØ£¿ÎÒÃÇÇ°ÃæÓÐÌáµ½£¬worker½ø³ÌÖ®¼äÊÇÆ½µÈµÄ£¬Ã¿¸ö½ø³Ì£¬´¦ÀíÇëÇóµÄ»ú»áÒ²ÊÇÒ»ÑùµÄ¡£µ±ÎÒÃÇÌṩ80¶Ë¿ÚµÄhttp·þÎñʱ£¬Ò»¸öÁ¬½ÓÇëÇó¹ýÀ´£¬Ã¿¸ö½ø³Ì¶¼ÓпÉÄÜ´¦ÀíÕâ¸öÁ¬½Ó£¬Ôõô×öµ½µÄÄØ£¿Ê×ÏÈ£¬Ã¿¸öworker½ø³Ì¶¼ÊÇ´Ómaster½ø³Ìfork¹ýÀ´£¬ÔÚmaster½ø³ÌÀïÃæ£¬ÏȽ¨Á¢ºÃÐèÒªlistenµÄsocket£¨listenfd£©Ö®ºó£¬È»ºóÔÙfork³ö¶à¸öworker½ø³Ì¡£ËùÓÐworker½ø³ÌµÄlistenfd»áÔÚÐÂÁ¬½Óµ½À´Ê±±äµÃ¿É¶Á£¬Îª±£Ö¤Ö»ÓÐÒ»¸ö½ø³Ì´¦Àí¸ÃÁ¬½Ó£¬ËùÓÐworker½ø³ÌÔÚ×¢²álistenfd¶ÁʼþǰÇÀaccept_mutex£¬ÇÀµ½»¥³âËøµÄÄǸö½ø³Ì×¢²álistenfd¶Áʼþ£¬ÔÚ¶ÁʼþÀïµ÷ÓÃaccept½ÓÊܸÃÁ¬½Ó¡£µ±Ò»¸öworker½ø³ÌÔÚacceptÕâ¸öÁ¬½ÓÖ®ºó£¬¾Í¿ªÊ¼¶ÁÈ¡ÇëÇ󣬽âÎöÇëÇ󣬴¦ÀíÇëÇ󣬲úÉúÊý¾Ýºó£¬ÔÙ·µ»Ø¸ø¿Í»§¶Ë£¬×îºó²Å¶Ï¿ªÁ¬½Ó£¬ÕâÑùÒ»¸öÍêÕûµÄÇëÇó¾ÍÊÇÕâÑùµÄÁË¡£ÎÒÃÇ¿ÉÒÔ¿´µ½£¬Ò»¸öÇëÇó£¬ÍêÈ«ÓÉworker½ø³ÌÀ´´¦Àí£¬¶øÇÒÖ»ÔÚÒ»¸öworker½ø³ÌÖд¦Àí¡£

ÄÇô£¬nginx²ÉÓÃÕâÖÖ½ø³ÌÄ£ÐÍÓÐʲôºÃ´¦ÄØ£¿µ±È»£¬ºÃ´¦¿Ï¶¨»áºÜ¶àÁË¡£Ê×ÏÈ£¬¶ÔÓÚÿ¸öworker½ø³ÌÀ´Ëµ£¬¶ÀÁ¢µÄ½ø³Ì£¬²»ÐèÒª¼ÓËø£¬ËùÒÔÊ¡µôÁËËø´øÀ´µÄ¿ªÏú£¬Í¬Ê±ÔÚ±à³ÌÒÔ¼°ÎÊÌâ²éÕÒʱ£¬Ò²»á·½±ãºÜ¶à¡£Æä´Î£¬²ÉÓöÀÁ¢µÄ½ø³Ì£¬¿ÉÒÔÈû¥ÏàÖ®¼ä²»»áÓ°Ï죬һ¸ö½ø³ÌÍ˳öºó£¬ÆäËü½ø³Ì»¹ÔÚ¹¤×÷£¬·þÎñ²»»áÖжϣ¬master½ø³ÌÔòºÜ¿ìÆô¶¯ÐµÄworker½ø³Ì¡£µ±È»£¬worker½ø³ÌµÄÒì³£Í˳ö£¬¿Ï¶¨ÊdzÌÐòÓÐbugÁË£¬Òì³£Í˳ö£¬»áµ¼Öµ±Ç°workerÉϵÄËùÓÐÇëÇóʧ°Ü£¬²»¹ý²»»áÓ°Ïìµ½ËùÓÐÇëÇó£¬ËùÒÔ½µµÍÁË·çÏÕ¡£µ±È»£¬ºÃ´¦»¹Óкܶ࣬´ó¼Ò¿ÉÒÔÂýÂýÌå»á¡£

ÉÏÃæ½²ÁËºÜ¶à¹ØÓÚnginxµÄ½ø³ÌÄ£ÐÍ£¬½ÓÏÂÀ´£¬ÎÒÃÇÀ´¿´¿´nginxÊÇÈçºÎ´¦ÀíʼþµÄ¡£

ÓÐÈË¿ÉÄÜÒªÎÊÁË£¬nginx²ÉÓöàworkerµÄ·½Ê½À´´¦ÀíÇëÇó£¬Ã¿¸öworkerÀïÃæÖ»ÓÐÒ»¸öÖ÷Ị̈߳¬ÄÇÄܹ»´¦ÀíµÄ²¢·¢ÊýºÜÓÐÏÞ°¡£¬¶àÉÙ¸öworker¾ÍÄÜ´¦Àí¶àÉÙ¸ö²¢·¢£¬ºÎÀ´¸ß²¢·¢ÄØ£¿·ÇÒ²£¬Õâ¾ÍÊÇnginxµÄ¸ßÃ÷Ö®´¦£¬nginx²ÉÓÃÁËÒì²½·Ç×èÈûµÄ·½Ê½À´´¦ÀíÇëÇó£¬Ò²¾ÍÊÇ˵£¬nginxÊÇ¿ÉÒÔͬʱ´¦Àí³ÉǧÉÏÍò¸öÇëÇóµÄ¡£ÏëÏëapacheµÄ³£Óù¤×÷·½Ê½£¨apacheÒ²ÓÐÒì²½·Ç×èÈû°æ±¾£¬µ«ÒòÆäÓë×Ô´øÄ³Ð©Ä£¿é³åÍ»£¬ËùÒÔ²»³£Óã©£¬Ã¿¸öÇëÇó»á¶ÀÕ¼Ò»¸ö¹¤×÷Ị̈߳¬µ±²¢·¢ÊýÉϵ½¼¸Ç§Ê±£¬¾ÍͬʱÓм¸Ç§µÄÏß³ÌÔÚ´¦ÀíÇëÇóÁË¡£Õâ¶Ô²Ù×÷ϵͳÀ´Ëµ£¬ÊǸö²»Ð¡µÄÌôÕ½£¬Ï̴߳øÀ´µÄÄÚ´æÕ¼Ó÷dz£´ó£¬Ï̵߳ÄÉÏÏÂÎÄÇл»´øÀ´µÄcpu¿ªÏúºÜ´ó£¬×ÔÈ»ÐÔÄܾÍÉϲ»È¥ÁË£¬¶øÕâЩ¿ªÏúÍêÈ«ÊÇûÓÐÒâÒåµÄ¡£

Ϊʲônginx¿ÉÒÔ²ÉÓÃÒì²½·Ç×èÈûµÄ·½Ê½À´´¦ÀíÄØ£¬»òÕßÒì²½·Ç×èÈûµ½µ×ÊÇÔõô»ØÊÂÄØ£¿ÎÒÃÇÏȻص½Ô­µã£¬¿´¿´Ò»¸öÇëÇóµÄÍêÕû¹ý³Ì¡£Ê×ÏÈ£¬ÇëÇó¹ýÀ´£¬Òª½¨Á¢Á¬½Ó£¬È»ºóÔÙ½ÓÊÕÊý¾Ý£¬½ÓÊÕÊý¾Ýºó£¬ÔÙ·¢ËÍÊý¾Ý¡£¾ßÌ嵽ϵͳµ×²ã£¬¾ÍÊǶÁдʼþ£¬¶øµ±¶ÁдʼþûÓÐ×¼±¸ºÃʱ£¬±ØÈ»²»¿É²Ù×÷£¬Èç¹û²»Ó÷Ç×èÈûµÄ·½Ê½À´µ÷Óã¬ÄǾ͵Ã×èÈûµ÷ÓÃÁË£¬Ê¼þûÓÐ×¼±¸ºÃ£¬ÄǾÍÖ»ÄܵÈÁË£¬µÈʼþ×¼±¸ºÃÁË£¬ÄãÔÙ¼ÌÐø°É¡£×èÈûµ÷ÓÃ»á½øÈëÄں˵ȴý£¬cpu¾Í»áÈóöÈ¥¸ø±ðÈËÓÃÁË£¬¶Ôµ¥Ï̵߳ÄworkerÀ´Ëµ£¬ÏÔÈ»²»ºÏÊÊ£¬µ±ÍøÂçʼþÔ½¶àʱ£¬´ó¼Ò¶¼ÔڵȴýÄØ£¬cpu¿ÕÏÐÏÂÀ´Ã»ÈËÓã¬cpuÀûÓÃÂÊ×ÔÈ»Éϲ»È¥ÁË£¬¸ü±ð̸¸ß²¢·¢ÁË¡£ºÃ°É£¬Äã˵¼Ó½ø³ÌÊý£¬Õâ¸úapacheµÄÏß³ÌÄ£ÐÍÓÐÊ²Ã´Çø±ð£¬×¢Ò⣬±ðÔö¼ÓÎÞνµÄÉÏÏÂÎÄÇл»¡£ËùÒÔ£¬ÔÚnginxÀïÃæ£¬×î¼É»ä×èÈûµÄϵͳµ÷ÓÃÁË¡£²»Òª×èÈû£¬ÄǾͷÇ×èÈûà¶¡£·Ç×èÈû¾ÍÊÇ£¬Ê¼þûÓÐ×¼±¸ºÃ£¬ÂíÉÏ·µ»ØEAGAIN£¬¸æËßÄ㣬ʼþ»¹Ã»×¼±¸ºÃÄØ£¬Äã»Åʲô£¬¹ý»áÔÙÀ´°É¡£ºÃ°É£¬Äã¹ýÒ»»á£¬ÔÙÀ´¼ì²éÒ»ÏÂʼþ£¬Ö±µ½Ê¼þ×¼±¸ºÃÁËΪֹ£¬ÔÚÕâÆÚ¼ä£¬Äã¾Í¿ÉÒÔÏÈÈ¥×öÆäËüÊÂÇ飬ȻºóÔÙÀ´¿´¿´Ê¼þºÃÁËû¡£ËäÈ»²»×èÈûÁË£¬µ«ÄãµÃ²»Ê±µØ¹ýÀ´¼ì²éÒ»ÏÂʼþµÄ״̬£¬Äã¿ÉÒÔ×ö¸ü¶àµÄÊÂÇéÁË£¬µ«´øÀ´µÄ¿ªÏúÒ²ÊDz»Ð¡µÄ¡£ËùÒÔ£¬²Å»áÓÐÁËÒì²½·Ç×èÈûµÄʼþ´¦Àí»úÖÆ£¬¾ßÌ嵽ϵͳµ÷ÓþÍÊÇÏñselect/poll/epoll/kqueueÕâÑùµÄϵͳµ÷Óá£ËüÃÇÌṩÁËÒ»ÖÖ»úÖÆ£¬ÈÃÄã¿ÉÒÔͬʱ¼à¿Ø¶à¸öʼþ£¬µ÷ÓÃËûÃÇÊÇ×èÈûµÄ£¬µ«¿ÉÒÔÉèÖó¬Ê±Ê±¼ä£¬ÔÚ³¬Ê±Ê±¼äÖ®ÄÚ£¬Èç¹ûÓÐʼþ×¼±¸ºÃÁË£¬¾Í·µ»Ø¡£ÕâÖÖ»úÖÆÕýºÃ½â¾öÁËÎÒÃÇÉÏÃæµÄÁ½¸öÎÊÌ⣬ÄÃepollΪÀý(ÔÚºóÃæµÄÀý×ÓÖУ¬ÎÒÃǶàÒÔepollΪÀý×Ó£¬ÒÔ´ú±íÕâÒ»ÀຯÊý)£¬µ±Ê¼þû׼±¸ºÃʱ£¬·Åµ½epollÀïÃæ£¬Ê¼þ×¼±¸ºÃÁË£¬ÎÒÃǾÍÈ¥¶Áд£¬µ±¶Áд·µ»ØEAGAINʱ£¬ÎÒÃǽ«ËüÔٴμÓÈëµ½epollÀïÃæ¡£ÕâÑù£¬Ö»ÒªÓÐʼþ×¼±¸ºÃÁË£¬ÎÒÃǾÍÈ¥´¦ÀíËü£¬Ö»Óе±ËùÓÐʼþ¶¼Ã»×¼±¸ºÃʱ£¬²ÅÔÚepollÀïÃæµÈ×Å¡£ÕâÑù£¬ÎÒÃǾͿÉÒÔ²¢·¢´¦Àí´óÁ¿µÄ²¢·¢ÁË£¬µ±È»£¬ÕâÀïµÄ²¢·¢ÇëÇó£¬ÊÇָδ´¦ÀíÍêµÄÇëÇó£¬Ïß³ÌÖ»ÓÐÒ»¸ö£¬ËùÒÔͬʱÄÜ´¦ÀíµÄÇëÇóµ±È»Ö»ÓÐÒ»¸öÁË£¬Ö»ÊÇÔÚÇëÇó¼ä½øÐв»¶ÏµØÇл»¶øÒÑ£¬Çл»Ò²ÊÇÒòΪÒ첽ʼþδ׼±¸ºÃ£¬¶øÖ÷¶¯ÈóöµÄ¡£ÕâÀïµÄÇл»ÊÇûÓÐÈκδú¼Û£¬Äã¿ÉÒÔÀí½âΪѭ»·´¦Àí¶à¸ö×¼±¸ºÃµÄʼþ£¬ÊÂʵÉϾÍÊÇÕâÑùµÄ¡£Óë¶àÏß³ÌÏà±È£¬ÕâÖÖʼþ´¦Àí·½Ê½ÊÇÓкܴóµÄÓÅÊÆµÄ£¬²»ÐèÒª´´½¨Ị̈߳¬Ã¿¸öÇëÇóÕ¼ÓõÄÄÚ´æÒ²ºÜÉÙ£¬Ã»ÓÐÉÏÏÂÎÄÇл»£¬Ê¼þ´¦Àí·Ç³£µÄÇáÁ¿¼¶¡£²¢·¢ÊýÔÙ¶àÒ²²»»áµ¼ÖÂÎÞνµÄ×ÊÔ´ÀË·Ñ£¨ÉÏÏÂÎÄÇл»£©¡£¸ü¶àµÄ²¢·¢Êý£¬Ö»ÊÇ»áÕ¼Óøü¶àµÄÄÚ´æ¶øÒÑ¡£ ÎÒ֮ǰÓжÔÁ¬½ÓÊý½øÐйý²âÊÔ£¬ÔÚ24GÄÚ´æµÄ»úÆ÷ÉÏ£¬´¦ÀíµÄ²¢·¢ÇëÇóÊý´ïµ½¹ý200Íò¡£ÏÖÔÚµÄÍøÂç·þÎñÆ÷»ù±¾¶¼²ÉÓÃÕâÖÖ·½Ê½£¬ÕâÒ²ÊÇnginxÐÔÄܸßЧµÄÖ÷ÒªÔ­Òò¡£

ÎÒÃÇ֮ǰ˵¹ý£¬ÍƼöÉèÖÃworkerµÄ¸öÊýΪcpuµÄºËÊý£¬ÔÚÕâÀï¾ÍºÜÈÝÒ×Àí½âÁË£¬¸ü¶àµÄworkerÊý£¬Ö»»áµ¼Ö½ø³ÌÀ´¾ºÕùcpu×ÊÔ´ÁË£¬´Ó¶ø´øÀ´²»±ØÒªµÄÉÏÏÂÎÄÇл»¡£¶øÇÒ£¬nginxΪÁ˸üºÃµÄÀûÓöàºËÌØÐÔ£¬ÌṩÁËcpuÇ×ÔµÐԵİó¶¨Ñ¡ÏÎÒÃÇ¿ÉÒÔ½«Ä³Ò»¸ö½ø³Ì°ó¶¨ÔÚijһ¸öºËÉÏ£¬ÕâÑù¾Í²»»áÒòΪ½ø³ÌµÄÇл»´øÀ´cacheµÄʧЧ¡£ÏñÕâÖÖСµÄÓÅ»¯ÔÚnginxÖзdz£³£¼û£¬Í¬Ê±Ò²ËµÃ÷ÁËnginx×÷ÕߵĿàÐĹÂÒè¡£±ÈÈ磬nginxÔÚ×ö4¸ö×Ö½ÚµÄ×Ö·û´®±È½Ïʱ£¬»á½«4¸ö×Ö·ûת»»³ÉÒ»¸öintÐÍ£¬ÔÙ×÷±È½Ï£¬ÒÔ¼õÉÙcpuµÄÖ¸ÁîÊýµÈµÈ¡£

ÏÖÔÚ£¬ÖªµÀÁËnginxΪʲô»áÑ¡ÔñÕâÑùµÄ½ø³ÌÄ£ÐÍÓëʼþÄ£ÐÍÁË¡£¶ÔÓÚÒ»¸ö»ù±¾µÄweb·þÎñÆ÷À´Ëµ£¬Ê¼þͨ³£ÓÐÈýÖÖÀàÐÍ£¬ÍøÂçʼþ¡¢Ðźš¢¶¨Ê±Æ÷¡£´ÓÉÏÃæµÄ½²½âÖÐÖªµÀ£¬ÍøÂçʼþͨ¹ýÒì²½·Ç×èÈû¿ÉÒԺܺõĽâ¾öµô¡£ÈçºÎ´¦ÀíÐźÅÓ붨ʱÆ÷£¿

Ê×ÏÈ£¬ÐźŵĴ¦Àí¡£¶ÔnginxÀ´Ëµ£¬ÓÐÒ»Ð©ÌØ¶¨µÄÐźţ¬´ú±í×ÅÌØ¶¨µÄÒâÒå¡£ÐźŻáÖжϵô³ÌÐòµ±Ç°µÄÔËÐУ¬Ôڸıä״̬ºó£¬¼ÌÐøÖ´ÐС£Èç¹ûÊÇϵͳµ÷Óã¬Ôò¿ÉÄܻᵼÖÂϵͳµ÷ÓõÄʧ°Ü£¬ÐèÒªÖØÈë¡£¹ØÓÚÐźŵĴ¦Àí£¬´ó¼Ò¿ÉÒÔѧϰһЩרҵÊé¼®£¬ÕâÀï²»¶à˵¡£¶ÔÓÚnginxÀ´Ëµ£¬Èç¹ûnginxÕýÔڵȴýʼþ£¨epoll_waitʱ£©£¬Èç¹û³ÌÐòÊÕµ½Ðźţ¬ÔÚÐźŴ¦Àíº¯Êý´¦ÀíÍêºó£¬epoll_wait»á·µ»Ø´íÎó£¬È»ºó³ÌÐò¿ÉÔٴνøÈëepoll_waitµ÷Óá£

ÁíÍ⣬ÔÙÀ´¿´¿´¶¨Ê±Æ÷¡£ÓÉÓÚepoll_waitµÈº¯ÊýÔÚµ÷ÓõÄʱºòÊÇ¿ÉÒÔÉèÖÃÒ»¸ö³¬Ê±Ê±¼äµÄ£¬ËùÒÔnginx½èÖúÕâ¸ö³¬Ê±Ê±¼äÀ´ÊµÏÖ¶¨Ê±Æ÷¡£nginxÀïÃæµÄ¶¨Ê±Æ÷ʼþÊÇ·ÅÔÚÒ»¿Åά»¤¶¨Ê±Æ÷µÄºìºÚÊ÷ÀïÃæ£¬Ã¿´ÎÔÚ½øÈëepoll_waitǰ£¬ÏȴӸúìºÚÊ÷ÀïÃæÄõ½ËùÓж¨Ê±Æ÷ʼþµÄ×îСʱ¼ä£¬ÔÚ¼ÆËã³öepoll_waitµÄ³¬Ê±Ê±¼äºó½øÈëepoll_wait¡£ËùÒÔ£¬µ±Ã»ÓÐʼþ²úÉú£¬Ò²Ã»ÓÐÖжÏÐźÅʱ£¬epoll_wait»á³¬Ê±£¬Ò²¾ÍÊÇ˵£¬¶¨Ê±Æ÷ʼþµ½ÁË¡£Õâʱ£¬nginx»á¼ì²éËùÓеij¬Ê±Ê¼þ£¬½«ËûÃǵÄ״̬ÉèÖÃΪ³¬Ê±£¬È»ºóÔÙÈ¥´¦ÀíÍøÂçʼþ¡£ÓÉ´Ë¿ÉÒÔ¿´³ö£¬µ±ÎÒÃÇдnginx´úÂëʱ£¬ÔÚ´¦ÀíÍøÂçʼþµÄ»Øµ÷º¯Êýʱ£¬Í¨³£×öµÄµÚÒ»¸öÊÂÇé¾ÍÊÇÅжϳ¬Ê±£¬È»ºóÔÙÈ¥´¦ÀíÍøÂçʼþ¡£

ÎÒÃÇ¿ÉÒÔÓÃÒ»¶Îα´úÂëÀ´×ܽáÒ»ÏÂnginxµÄʼþ´¦ÀíÄ£ÐÍ£º

while (true) {
for t in run_tasks:
t.handler();
update_time(&now);
timeout = ETERNITY;
for t in wait_tasks: /* sorted already */
if (t.time <= now) {
t.timeout_handler();
} else {
timeout = t.time - now;
break;
}
nevents = poll_function(events, timeout);
for i in nevents:
task t;
if (events[i].type == READ) {
t.handler = read_handler;
} else { /* events[i].type == WRITE */
t.handler = write_handler;
}
run_tasks_add(t);
}

ºÃ£¬±¾½ÚÎÒÃǽ²Á˽ø³ÌÄ£ÐÍ£¬Ê¼þÄ£ÐÍ£¬°üÀ¨ÍøÂçʼþ£¬Ðźţ¬¶¨Ê±Æ÷ʼþ¡£

nginx»ù´¡¸ÅÄî(100%)

connection

ÔÚnginxÖÐconnection¾ÍÊǶÔtcpÁ¬½ÓµÄ·â×°£¬ÆäÖаüÀ¨Á¬½ÓµÄsocket£¬¶Áʼþ£¬Ð´Ê¼þ¡£ÀûÓÃnginx·â×°µÄconnection£¬ÎÒÃÇ¿ÉÒԺܷ½±ãµÄʹÓÃnginxÀ´´¦ÀíÓëÁ¬½ÓÏà¹ØµÄÊÂÇ飬±ÈÈ磬½¨Á¢Á¬½Ó£¬·¢ËÍÓë½ÓÊÜÊý¾ÝµÈ¡£¶ønginxÖеÄhttpÇëÇóµÄ´¦Àí¾ÍÊǽ¨Á¢ÔÚconnectionÖ®Éϵģ¬ËùÒÔnginx²»½ö¿ÉÒÔ×÷Ϊһ¸öweb·þÎñÆ÷£¬Ò²¿ÉÒÔ×÷ΪÓʼþ·þÎñÆ÷¡£µ±È»£¬ÀûÓÃnginxÌṩµÄconnection£¬ÎÒÃÇ¿ÉÒÔÓëÈκκó¶Ë·þÎñ´ò½»µÀ¡£

½áºÏÒ»¸ötcpÁ¬½ÓµÄÉúÃüÖÜÆÚ£¬ÎÒÃÇ¿´¿´nginxÊÇÈçºÎ´¦ÀíÒ»¸öÁ¬½ÓµÄ¡£Ê×ÏÈ£¬nginxÔÚÆô¶¯Ê±£¬»á½âÎöÅäÖÃÎļþ£¬µÃµ½ÐèÒª¼àÌýµÄ¶Ë¿ÚÓëipµØÖ·£¬È»ºóÔÚnginxµÄmaster½ø³ÌÀïÃæ£¬Ïȳõʼ»¯ºÃÕâ¸ö¼à¿ØµÄsocket(´´½¨socket£¬ÉèÖÃaddrreuseµÈÑ¡Ï°ó¶¨µ½Ö¸¶¨µÄipµØÖ·¶Ë¿Ú£¬ÔÙlisten)£¬È»ºóÔÙfork³ö¶à¸ö×Ó½ø³Ì³öÀ´£¬È»ºó×Ó½ø³Ì»á¾ºÕùacceptеÄÁ¬½Ó¡£´Ëʱ£¬¿Í»§¶Ë¾Í¿ÉÒÔÏònginx·¢ÆðÁ¬½ÓÁË¡£µ±¿Í»§¶ËÓë·þÎñ¶Ëͨ¹ýÈý´ÎÎÕÊÖ½¨Á¢ºÃÒ»¸öÁ¬½Óºó£¬nginxµÄijһ¸ö×Ó½ø³Ì»áaccept³É¹¦£¬µÃµ½Õâ¸ö½¨Á¢ºÃµÄÁ¬½ÓµÄsocket£¬È»ºó´´½¨nginx¶ÔÁ¬½ÓµÄ·â×°£¬¼´ngx_connection_t½á¹¹Ìå¡£½Ó×Å£¬ÉèÖöÁдʼþ´¦Àíº¯Êý²¢Ìí¼Ó¶ÁдʼþÀ´Óë¿Í»§¶Ë½øÐÐÊý¾ÝµÄ½»»»¡£×îºó£¬nginx»ò¿Í»§¶ËÀ´Ö÷¶¯¹ØµôÁ¬½Ó£¬µ½´Ë£¬Ò»¸öÁ¬½Ó¾ÍÊÙÖÕÕýÇÞÁË¡£

µ±È»£¬nginxÒ²ÊÇ¿ÉÒÔ×÷Ϊ¿Í»§¶ËÀ´ÇëÇóÆäËüserverµÄÊý¾ÝµÄ£¨ÈçupstreamÄ£¿é£©£¬´Ëʱ£¬ÓëÆäËüserver´´½¨µÄÁ¬½Ó£¬Ò²·â×°ÔÚngx_connection_tÖС£×÷Ϊ¿Í»§¶Ë£¬nginxÏÈ»ñȡһ¸öngx_connection_t½á¹¹Ì壬Ȼºó´´½¨socket£¬²¢ÉèÖÃsocketµÄÊôÐÔ£¨ ±ÈÈç·Ç×èÈû£©¡£È»ºóÔÙͨ¹ýÌí¼Ó¶Áдʼþ£¬µ÷ÓÃconnect/read/writeÀ´µ÷ÓÃÁ¬½Ó£¬×îºó¹ØµôÁ¬½Ó£¬²¢ÊÍ·Ångx_connection_t¡£

ÔÚnginxÖУ¬Ã¿¸ö½ø³Ì»áÓÐÒ»¸öÁ¬½ÓÊýµÄ×î´óÉÏÏÞ£¬Õâ¸öÉÏÏÞÓëϵͳ¶ÔfdµÄÏÞÖÆ²»Ò»Ñù¡£ÔÚ²Ù×÷ϵͳÖУ¬Í¨¹ýulimit -n£¬ÎÒÃÇ¿ÉÒԵõ½Ò»¸ö½ø³ÌËùÄܹ»´ò¿ªµÄfdµÄ×î´óÊý£¬¼´nofile£¬ÒòΪÿ¸ösocketÁ¬½Ó»áÕ¼ÓõôÒ»¸öfd£¬ËùÒÔÕâÒ²»áÏÞÖÆÎÒÃǽø³ÌµÄ×î´óÁ¬½ÓÊý£¬µ±È»Ò²»áÖ±½ÓÓ°Ïìµ½ÎÒÃdzÌÐòËùÄÜÖ§³ÖµÄ×î´ó²¢·¢Êý£¬µ±fdÓÃÍêºó£¬ÔÙ´´½¨socketʱ£¬¾Í»áʧ°Ü¡£nginxͨ¹ýÉèÖÃworker_connectonsÀ´ÉèÖÃÿ¸ö½ø³ÌÖ§³ÖµÄ×î´óÁ¬½ÓÊý¡£Èç¹û¸ÃÖµ´óÓÚnofile£¬ÄÇôʵ¼ÊµÄ×î´óÁ¬½ÓÊýÊÇnofile£¬nginx»áÓо¯¸æ¡£nginxÔÚʵÏÖʱ£¬ÊÇͨ¹ýÒ»¸öÁ¬½Ó³ØÀ´¹ÜÀíµÄ£¬Ã¿¸öworker½ø³Ì¶¼ÓÐÒ»¸ö¶ÀÁ¢µÄÁ¬½Ó³Ø£¬Á¬½Ó³ØµÄ´óСÊÇworker_connections¡£ÕâÀïµÄÁ¬½Ó³ØÀïÃæ±£´æµÄÆäʵ²»ÊÇÕæÊµµÄÁ¬½Ó£¬ËüÖ»ÊÇÒ»¸öworker_connections´óСµÄÒ»¸öngx_connection_t½á¹¹µÄÊý×é¡£²¢ÇÒ£¬nginx»áͨ¹ýÒ»¸öÁ´±ífree_connectionsÀ´±£´æËùÓеĿÕÏÐngx_connection_t£¬Ã¿´Î»ñȡһ¸öÁ¬½Óʱ£¬¾Í´Ó¿ÕÏÐÁ¬½ÓÁ´±íÖлñȡһ¸ö£¬ÓÃÍêºó£¬ÔٷŻؿÕÏÐÁ¬½ÓÁ´±íÀïÃæ¡£

ÔÚÕâÀºÜ¶àÈË»áÎó½âworker_connectionsÕâ¸ö²ÎÊýµÄÒâ˼£¬ÈÏΪÕâ¸öÖµ¾ÍÊÇnginxËùÄܽ¨Á¢Á¬½ÓµÄ×î´óÖµ¡£Æäʵ²»È»£¬Õâ¸öÖµÊDZíʾÿ¸öworker½ø³ÌËùÄܽ¨Á¢Á¬½ÓµÄ×î´óÖµ£¬ËùÒÔ£¬Ò»¸önginxÄܽ¨Á¢µÄ×î´óÁ¬½ÓÊý£¬Ó¦¸ÃÊÇworker_connections * worker_processes¡£µ±È»£¬ÕâÀï˵µÄÊÇ×î´óÁ¬½ÓÊý£¬¶ÔÓÚHTTPÇëÇó±¾µØ×ÊÔ´À´Ëµ£¬Äܹ»Ö§³ÖµÄ×î´ó²¢·¢ÊýÁ¿ÊÇworker_connections * worker_processes£¬¶øÈç¹ûÊÇHTTP×÷Ϊ·´Ïò´úÀíÀ´Ëµ£¬×î´ó²¢·¢ÊýÁ¿Ó¦¸ÃÊÇworker_connections * worker_processes/2¡£ÒòΪ×÷Ϊ·´Ïò´úÀí·þÎñÆ÷£¬Ã¿¸ö²¢·¢»á½¨Á¢Óë¿Í»§¶ËµÄÁ¬½ÓºÍÓëºó¶Ë·þÎñµÄÁ¬½Ó£¬»áÕ¼ÓÃÁ½¸öÁ¬½Ó¡£

ÄÇô£¬ÎÒÃÇÇ°ÃæÓÐ˵¹ýÒ»¸ö¿Í»§¶ËÁ¬½Ó¹ýÀ´ºó£¬¶à¸ö¿ÕÏеĽø³Ì£¬»á¾ºÕùÕâ¸öÁ¬½Ó£¬ºÜÈÝÒ׿´µ½£¬ÕâÖÖ¾ºÕù»áµ¼Ö²»¹«Æ½£¬Èç¹ûij¸ö½ø³ÌµÃµ½acceptµÄ»ú»á±È½Ï¶à£¬ËüµÄ¿ÕÏÐÁ¬½ÓºÜ¿ì¾ÍÓÃÍêÁË£¬Èç¹û²»Ìáǰ×öһЩ¿ØÖÆ£¬µ±acceptµ½Ò»¸öеÄtcpÁ¬½Óºó£¬ÒòΪÎÞ·¨µÃµ½¿ÕÏÐÁ¬½Ó£¬¶øÇÒÎÞ·¨½«´ËÁ¬½Óת½»¸øÆäËü½ø³Ì£¬×îÖջᵼÖ´ËtcpÁ¬½ÓµÃ²»µ½´¦Àí£¬¾ÍÖÐÖ¹µôÁË¡£ºÜÏÔÈ»£¬ÕâÊDz»¹«Æ½µÄ£¬ÓеĽø³ÌÓпÕÓàÁ¬½Ó£¬È´Ã»Óд¦Àí»ú»á£¬ÓеĽø³ÌÒòΪûÓпÕÓàÁ¬½Ó£¬È´ÈËΪµØ¶ªÆúÁ¬½Ó¡£ÄÇô£¬ÈçºÎ½â¾öÕâ¸öÎÊÌâÄØ£¿Ê×ÏÈ£¬nginxµÄ´¦ÀíµÃÏÈ´ò¿ªaccept_mutexÑ¡Ï´Ëʱ£¬Ö»ÓлñµÃÁËaccept_mutexµÄ½ø³Ì²Å»áÈ¥Ìí¼Óacceptʼþ£¬Ò²¾ÍÊÇ˵£¬nginx»á¿ØÖƽø³ÌÊÇ·ñÌí¼Óacceptʼþ¡£nginxʹÓÃÒ»¸ö½Ðngx_accept_disabledµÄ±äÁ¿À´¿ØÖÆÊÇ·ñÈ¥¾ºÕùaccept_mutexËø¡£ÔÚµÚÒ»¶Î´úÂëÖУ¬¼ÆËãngx_accept_disabledµÄÖµ£¬Õâ¸öÖµÊÇnginxµ¥½ø³ÌµÄËùÓÐÁ¬½Ó×ÜÊýµÄ°Ë·ÖÖ®Ò»£¬¼õȥʣϵĿÕÏÐÁ¬½ÓÊýÁ¿£¬µÃµ½µÄÕâ¸öngx_accept_disabledÓÐÒ»¸ö¹æÂÉ£¬µ±Ê£ÓàÁ¬½ÓÊýСÓÚ×ÜÁ¬½ÓÊýµÄ°Ë·Ö֮һʱ£¬ÆäÖµ²Å´óÓÚ0£¬¶øÇÒÊ£ÓàµÄÁ¬½ÓÊýԽС£¬Õâ¸öÖµÔ½´ó¡£ÔÙ¿´µÚ¶þ¶Î´úÂ룬µ±ngx_accept_disabled´óÓÚ0ʱ£¬²»»áÈ¥³¢ÊÔ»ñÈ¡accept_mutexËø£¬²¢ÇÒ½«ngx_accept_disabled¼õ1£¬ÓÚÊÇ£¬Ã¿´ÎÖ´Ðе½´Ë´¦Ê±£¬¶¼»áÈ¥¼õ1£¬Ö±µ½Ð¡ÓÚ0¡£²»È¥»ñÈ¡accept_mutexËø£¬¾ÍÊǵÈÓÚÈóö»ñÈ¡Á¬½ÓµÄ»ú»á£¬ºÜÏÔÈ»¿ÉÒÔ¿´³ö£¬µ±¿ÕÓàÁ¬½ÓÔ½ÉÙʱ£¬ngx_accept_disableÔ½´ó£¬ÓÚÊÇÈóöµÄ»ú»á¾ÍÔ½¶à£¬ÕâÑùÆäËü½ø³Ì»ñÈ¡ËøµÄ»ú»áÒ²¾ÍÔ½´ó¡£²»È¥accept£¬×Ô¼ºµÄÁ¬½Ó¾Í¿ØÖÆÏÂÀ´ÁË£¬ÆäËü½ø³ÌµÄÁ¬½Ó³Ø¾Í»áµÃµ½ÀûÓã¬ÕâÑù£¬nginx¾Í¿ØÖÆÁË¶à½ø³Ì¼äÁ¬½ÓµÄƽºâÁË¡£

ngx_accept_disabled = ngx_cycle->connection_n / 8
- ngx_cycle->free_connection_n; if (ngx_accept_disabled > 0) {
ngx_accept_disabled--;} else { if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { return; } if (ngx_accept_mutex_held) { flags |= NGX_POST_EVENTS; } else { if (timer == NGX_TIMER_INFINITE || timer > ngx_accept_mutex_delay) { timer = ngx_accept_mutex_delay; } } }

ºÃÁË£¬Á¬½Ó¾ÍÏȽéÉܵ½Õ⣬±¾ÕµÄÄ¿µÄÊǽéÉÜ»ù±¾¸ÅÄ֪µÀÔÚnginxÖÐÁ¬½ÓÊǸöʲô¶«Î÷¾ÍÐÐÁË£¬¶øÇÒÁ¬½ÓÊÇÊôÓڱȽϸ߼¶µÄÓ÷¨£¬ÔÚºóÃæµÄÄ£¿é¿ª·¢¸ß¼¶Æª»áÓÐרÃŵÄÕ½ÚÀ´½²½âÁ¬½ÓÓëʼþµÄʵÏÖ¼°Ê¹Óá£

request

Õâ½ÚÎÒÃǽ²request£¬ÔÚnginxÖÐÎÒÃÇÖ¸µÄÊÇhttpÇëÇ󣬾ßÌåµ½nginxÖеÄÊý¾Ý½á¹¹ÊÇngx_http_request_t¡£ngx_http_request_tÊǶÔÒ»¸öhttpÇëÇóµÄ·â×°¡£ ÎÒÃÇÖªµÀ£¬Ò»¸öhttpÇëÇ󣬰üº¬ÇëÇóÐС¢ÇëÇóÍ·¡¢ÇëÇóÌå¡¢ÏìÓ¦ÐС¢ÏìӦͷ¡¢ÏìÓ¦Ìå¡£

httpÇëÇóÊǵäÐ͵ÄÇëÇó-ÏìÓ¦ÀàÐ͵ĵÄÍøÂçЭÒ飬¶øhttpÊÇÎļþЭÒ飬ËùÒÔÎÒÃÇÔÚ·ÖÎöÇëÇóÐÐÓëÇëÇóÍ·£¬ÒÔ¼°Êä³öÏìÓ¦ÐÐÓëÏìӦͷ£¬ÍùÍùÊÇÒ»ÐÐÒ»ÐеĽøÐд¦Àí¡£Èç¹ûÎÒÃÇ×Ô¼ºÀ´Ð´Ò»¸öhttp·þÎñÆ÷£¬Í¨³£ÔÚÒ»¸öÁ¬½Ó½¨Á¢ºÃºó£¬¿Í»§¶Ë»á·¢ËÍÇëÇó¹ýÀ´¡£È»ºóÎÒÃǶÁȡһÐÐÊý¾Ý£¬·ÖÎö³öÇëÇóÐÐÖаüº¬µÄmethod¡¢uri¡¢http_versionÐÅÏ¢¡£È»ºóÔÙÒ»ÐÐÒ»Ðд¦ÀíÇëÇóÍ·£¬²¢¸ù¾ÝÇëÇómethodÓëÇëÇóÍ·µÄÐÅÏ¢À´¾ö¶¨ÊÇ·ñÓÐÇëÇóÌåÒÔ¼°ÇëÇóÌåµÄ³¤¶È£¬È»ºóÔÙÈ¥¶ÁÈ¡ÇëÇóÌå¡£µÃµ½ÇëÇóºó£¬ÎÒÃÇ´¦ÀíÇëÇó²úÉúÐèÒªÊä³öµÄÊý¾Ý£¬È»ºóÔÙÉú³ÉÏìÓ¦ÐУ¬ÏìӦͷÒÔ¼°ÏìÓ¦Ìå¡£ÔÚ½«ÏìÓ¦·¢Ë͸ø¿Í»§¶ËÖ®ºó£¬Ò»¸öÍêÕûµÄÇëÇó¾Í´¦ÀíÍêÁË¡£µ±È»ÕâÊÇ×î¼òµ¥µÄwebserverµÄ´¦Àí·½Ê½£¬ÆäʵnginxÒ²ÊÇÕâÑù×öµÄ£¬Ö»ÊÇÓÐһЩССµÄÇø±ð£¬±ÈÈ磬µ±ÇëÇóÍ·¶ÁÈ¡Íê³Éºó£¬¾Í¿ªÊ¼½øÐÐÇëÇóµÄ´¦ÀíÁË¡£nginxͨ¹ýngx_http_request_tÀ´±£´æ½âÎöÇëÇóÓëÊä³öÏìÓ¦Ïà¹ØµÄÊý¾Ý¡£

ÄǽÓÏÂÀ´£¬¼òÒª½²½²nginxÊÇÈçºÎ´¦ÀíÒ»¸öÍêÕûµÄÇëÇóµÄ¡£¶ÔÓÚnginxÀ´Ëµ£¬Ò»¸öÇëÇóÊÇ´Óngx_http_init_request¿ªÊ¼µÄ£¬ÔÚÕâ¸öº¯ÊýÖУ¬»áÉèÖöÁʼþΪngx_http_process_request_line£¬Ò²¾ÍÊÇ˵£¬½ÓÏÂÀ´µÄÍøÂçʼþ£¬»áÓÉngx_http_process_request_lineÀ´Ö´ÐС£´Óngx_http_process_request_lineµÄº¯ÊýÃû£¬ÎÒÃÇ¿ÉÒÔ¿´µ½£¬Õâ¾ÍÊÇÀ´´¦ÀíÇëÇóÐеģ¬ÕýºÃÓë֮ǰ½²µÄ£¬´¦ÀíÇëÇóµÄµÚÒ»¼þʾÍÊÇ´¦ÀíÇëÇóÐÐÊÇÒ»Öµġ£Í¨¹ýngx_http_read_request_headerÀ´¶ÁÈ¡ÇëÇóÊý¾Ý¡£È»ºóµ÷ÓÃngx_http_parse_request_lineº¯ÊýÀ´½âÎöÇëÇóÐС£nginxΪÌá¸ßЧÂÊ£¬²ÉÓÃ״̬»úÀ´½âÎöÇëÇóÐУ¬¶øÇÒÔÚ½øÐÐmethodµÄ±È½Ïʱ£¬Ã»ÓÐÖ±½ÓʹÓÃ×Ö·û´®±È½Ï£¬¶øÊǽ«Ëĸö×Ö·ûת»»³ÉÒ»¸öÕûÐÍ£¬È»ºóÒ»´Î±È½ÏÒÔ¼õÉÙcpuµÄÖ¸ÁîÊý£¬Õâ¸öÇ°ÃæÓÐ˵¹ý¡£ºÜ¶àÈË¿ÉÄܺÜÇå³þÒ»¸öÇëÇóÐаüº¬ÇëÇóµÄ·½·¨£¬uri£¬°æ±¾£¬È´²»ÖªµÀÆäʵÔÚÇëÇóÐÐÖУ¬Ò²ÊÇ¿ÉÒÔ°üº¬ÓÐhostµÄ¡£±ÈÈçÒ»¸öÇëÇóGET http://www.taobao.com/uri HTTP/1.0ÕâÑùÒ»¸öÇëÇóÐÐÒ²ÊǺϷ¨µÄ£¬¶øÇÒhostÊÇwww.taobao.com£¬Õâ¸öʱºò£¬nginx»áºöÂÔÇëÇóÍ·ÖеÄhostÓò£¬¶øÒÔÇëÇóÐÐÖеÄÕâ¸öΪ׼À´²éÕÒÐéÄâÖ÷»ú¡£ÁíÍ⣬¶ÔÓÚ¶ÔÓÚhttp0.9°æÀ´Ëµ£¬ÊDz»Ö§³ÖÇëÇóÍ·µÄ£¬ËùÒÔÕâÀïÒ²ÊÇÒªÌØ±ðµÄ´¦Àí¡£ËùÒÔ£¬ÔÚºóÃæ½âÎöÇëÇóͷʱ£¬Ð­Òé°æ±¾¶¼ÊÇ1.0»ò1.1¡£Õû¸öÇëÇóÐнâÎöµ½µÄ²ÎÊý£¬»á±£´æµ½ngx_http_request_t½á¹¹µ±ÖС£

ÔÚ½âÎöÍêÇëÇóÐкó£¬nginx»áÉèÖöÁʼþµÄhandlerΪngx_http_process_request_headers£¬È»ºóºóÐøµÄÇëÇó¾ÍÔÚngx_http_process_request_headersÖнøÐжÁÈ¡Óë½âÎö¡£ngx_http_process_request_headersº¯ÊýÓÃÀ´¶ÁÈ¡ÇëÇóÍ·£¬¸úÇëÇóÐÐÒ»Ñù£¬»¹Êǵ÷ÓÃngx_http_read_request_headerÀ´¶ÁÈ¡ÇëÇóÍ·£¬µ÷ÓÃngx_http_parse_header_lineÀ´½âÎöÒ»ÐÐÇëÇóÍ·£¬½âÎöµ½µÄÇëÇóÍ·»á±£´æµ½ngx_http_request_tµÄÓòheaders_inÖУ¬headers_inÊÇÒ»¸öÁ´±í½á¹¹£¬±£´æËùÓеÄÇëÇóÍ·¡£¶øHTTPÖÐÓÐЩÇëÇóÊÇÐèÒªÌØ±ð´¦ÀíµÄ£¬ÕâЩÇëÇóÍ·ÓëÇëÇó´¦Àíº¯Êý´æ·ÅÔÚÒ»¸öÓ³Éä±íÀïÃæ£¬¼´ngx_http_headers_in£¬ÔÚ³õʼ»¯Ê±£¬»áÉú³ÉÒ»¸öhash±í£¬µ±Ã¿½âÎöµ½Ò»¸öÇëÇóÍ·ºó£¬¾Í»áÏÈÔÚÕâ¸öhash±íÖвéÕÒ£¬Èç¹ûÓÐÕÒµ½£¬Ôòµ÷ÓÃÏàÓ¦µÄ´¦Àíº¯ÊýÀ´´¦ÀíÕâ¸öÇëÇóÍ·¡£±ÈÈç:HostÍ·µÄ´¦Àíº¯ÊýÊÇngx_http_process_host¡£

µ±nginx½âÎöµ½Á½¸ö»Ø³µ»»Ðзûʱ£¬¾Í±íʾÇëÇóÍ·µÄ½áÊø£¬´Ëʱ¾Í»áµ÷ÓÃngx_http_process_requestÀ´´¦ÀíÇëÇóÁË¡£ngx_http_process_request»áÉèÖõ±Ç°µÄÁ¬½ÓµÄ¶Áдʼþ´¦Àíº¯ÊýΪngx_http_request_handler£¬È»ºóÔÙµ÷ÓÃngx_http_handlerÀ´ÕæÕý¿ªÊ¼´¦ÀíÒ»¸öÍêÕûµÄhttpÇëÇó¡£ÕâÀï¿ÉÄÜ±È½ÏÆæ¹Ö£¬¶Áдʼþ´¦Àíº¯Êý¶¼ÊÇngx_http_request_handler£¬ÆäʵÔÚÕâ¸öº¯ÊýÖУ¬»á¸ù¾Ýµ±Ç°Ê¼þÊǶÁʼþ»¹ÊÇдʼþ£¬·Ö±ðµ÷ÓÃngx_http_request_tÖеÄread_event_handler»òÕßÊÇwrite_event_handler¡£ÓÉÓÚ´Ëʱ£¬ÎÒÃǵÄÇëÇóÍ·ÒѾ­¶ÁÈ¡Íê³ÉÁË£¬Ö®Ç°ÓÐ˵¹ý£¬nginxµÄ×ö·¨ÊÇÏȲ»¶ÁÈ¡ÇëÇóbody£¬ËùÒÔÕâÀïÃæÎÒÃÇÉèÖÃread_event_handlerΪngx_http_block_reading£¬¼´²»¶ÁÈ¡Êý¾ÝÁË¡£¸Õ²Å˵µ½£¬ÕæÕý¿ªÊ¼´¦ÀíÊý¾Ý£¬ÊÇÔÚngx_http_handlerÕâ¸öº¯ÊýÀïÃæ£¬Õâ¸öº¯Êý»áÉèÖÃwrite_event_handlerΪngx_http_core_run_phases£¬²¢Ö´ÐÐngx_http_core_run_phasesº¯Êý¡£ngx_http_core_run_phasesÕâ¸öº¯Êý½«Ö´Ðжà½×¶ÎÇëÇó´¦Àí£¬nginx½«Ò»¸öhttpÇëÇóµÄ´¦Àí·ÖΪ¶à¸ö½×¶Î£¬ÄÇôÕâ¸öº¯Êý¾ÍÊÇÖ´ÐÐÕâЩ½×¶ÎÀ´²úÉúÊý¾Ý¡£ÒòΪngx_http_core_run_phases×îºó»á²úÉúÊý¾Ý£¬ËùÒÔÎÒÃǾͺÜÈÝÒ×Àí½â£¬ÎªÊ²Ã´ÉèÖÃдʼþµÄ´¦Àíº¯ÊýΪngx_http_core_run_phasesÁË¡£ÔÚÕâÀÎÒ¼òҪ˵Ã÷ÁËһϺ¯ÊýµÄµ÷ÓÃÂß¼­£¬ÎÒÃÇÐèÒªÃ÷°××îÖÕÊǵ÷ÓÃngx_http_core_run_phasesÀ´´¦ÀíÇëÇ󣬲úÉúµÄÏìӦͷ»á·ÅÔÚngx_http_request_tµÄheaders_outÖУ¬ÕâÒ»²¿·ÖÄÚÈÝ£¬ÎÒ»á·ÅÔÚÇëÇó´¦ÀíÁ÷³ÌÀïÃæÈ¥½²¡£nginxµÄ¸÷Öֽ׶λá¶ÔÇëÇó½øÐд¦Àí£¬×îºó»áµ÷ÓÃfilterÀ´¹ýÂËÊý¾Ý£¬¶ÔÊý¾Ý½øÐмӹ¤£¬Èçtruncked´«Êä¡¢gzipѹËõµÈ¡£ÕâÀïµÄfilter°üÀ¨header filterÓëbody filter£¬¼´¶ÔÏìӦͷ»òÏìÓ¦Ìå½øÐд¦Àí¡£filterÊÇÒ»¸öÁ´±í½á¹¹£¬·Ö±ðÓÐheader filterÓëbody filter£¬ÏÈÖ´ÐÐheader filterÖеÄËùÓÐfilter£¬È»ºóÔÙÖ´ÐÐbody filterÖеÄËùÓÐfilter¡£ÔÚheader filterÖеÄ×îºóÒ»¸öfilter£¬¼´ngx_http_header_filter£¬Õâ¸öfilter½«»á±éÀúËùÓеÄÏìӦͷ£¬×îºóÐèÒªÊä³öµÄÏìӦͷÔÚÒ»¸öÁ¬ÐøµÄÄڴ棬Ȼºóµ÷ÓÃngx_http_write_filter½øÐÐÊä³ö¡£ngx_http_write_filterÊÇbody filterÖеÄ×îºóÒ»¸ö£¬ËùÒÔnginxÊ×ÏȵÄbodyÐÅÏ¢£¬ÔÚ¾­¹ýһϵÁеÄbody filterÖ®ºó£¬×îºóÒ²»áµ÷ÓÃngx_http_write_filterÀ´½øÐÐÊä³ö(ÓÐͼÀ´ËµÃ÷)¡£

ÕâÀïҪעÒâµÄÊÇ£¬nginx»á½«Õû¸öÇëÇóÍ·¶¼·ÅÔÚÒ»¸öbufferÀïÃæ£¬Õâ¸öbufferµÄ´óСͨ¹ýÅäÖÃÏîclient_header_buffer_sizeÀ´ÉèÖã¬Èç¹ûÓû§µÄÇëÇóÍ·Ì«´ó£¬Õâ¸öbuffer×°²»Ï£¬ÄÇnginx¾Í»áÖØÐ·ÖÅäÒ»¸öеĸü´óµÄbufferÀ´×°ÇëÇóÍ·£¬Õâ¸ö´óbuffer¿ÉÒÔͨ¹ýlarge_client_header_buffersÀ´ÉèÖã¬Õâ¸ölarge_bufferÕâÒ»×ébuffer£¬±ÈÈçÅäÖÃ4 8k£¬¾ÍÊDZíʾÓÐËĸö8k´óСµÄbuffer¿ÉÒÔÓá£×¢Ò⣬ΪÁ˱£´æÇëÇóÐлòÇëÇóÍ·µÄÍêÕûÐÔ£¬Ò»¸öÍêÕûµÄÇëÇóÐлòÇëÇóÍ·£¬ÐèÒª·ÅÔÚÒ»¸öÁ¬ÐøµÄÄÚ´æÀïÃæ£¬ËùÒÔ£¬Ò»¸öÍêÕûµÄÇëÇóÐлòÇëÇóÍ·£¬Ö»»á±£´æÔÚÒ»¸öbufferÀïÃæ¡£ÕâÑù£¬Èç¹ûÇëÇóÐдóÓÚÒ»¸öbufferµÄ´óС£¬¾Í»á·µ»Ø414´íÎó£¬Èç¹ûÒ»¸öÇëÇóÍ·´óС´óÓÚÒ»¸öbuffer´óС£¬¾Í»á·µ»Ø400´íÎó¡£ÔÚÁ˽âÁËÕâЩ²ÎÊýµÄÖµ£¬ÒÔ¼°nginxʵ¼ÊµÄ×ö·¨Ö®ºó£¬ÔÚÓ¦Óó¡¾°£¬ÎÒÃǾÍÐèÒª¸ù¾Ýʵ¼ÊµÄÐèÇóÀ´µ÷ÕûÕâЩ²ÎÊý£¬À´ÓÅ»¯ÎÒÃǵijÌÐòÁË¡£

´¦ÀíÁ÷³Ìͼ£º

ÒÔÉÏÕâЩ£¬¾ÍÊÇnginxÖÐÒ»¸öhttpÇëÇóµÄÉúÃüÖÜÆÚÁË¡£ÎÒÃÇÔÙ¿´¿´ÓëÇëÇóÏà¹ØµÄһЩ¸ÅÄî°É¡£

keepalive

µ±È»£¬ÔÚnginxÖУ¬¶ÔÓÚhttp1.0Óëhttp1.1Ò²ÊÇÖ§³Ö³¤Á¬½ÓµÄ¡£Ê²Ã´Êdz¤Á¬½ÓÄØ£¿ÎÒÃÇÖªµÀ£¬httpÇëÇóÊÇ»ùÓÚTCPЭÒéÖ®Éϵģ¬ÄÇô£¬µ±¿Í»§¶ËÔÚ·¢ÆðÇëÇóǰ£¬ÐèÒªÏÈÓë·þÎñ¶Ë½¨Á¢TCPÁ¬½Ó£¬¶øÃ¿Ò»´ÎµÄTCPÁ¬½ÓÊÇÐèÒªÈý´ÎÎÕÊÖÀ´È·¶¨µÄ£¬Èç¹û¿Í»§¶ËÓë·þÎñ¶ËÖ®¼äÍøÂç²îÒ»µã£¬ÕâÈý´Î½»»¥Ïû·ÑµÄʱ¼ä»á±È½Ï¶à£¬¶øÇÒÈý´Î½»»¥Ò²»á´øÀ´ÍøÂçÁ÷Á¿¡£µ±È»£¬µ±Á¬½Ó¶Ï¿ªºó£¬Ò²»áÓÐËĴεĽ»»¥£¬µ±È»¶ÔÓû§ÌåÑéÀ´Ëµ¾Í²»ÖØÒªÁË¡£¶øhttpÇëÇóÊÇÇëÇóÓ¦´ðʽµÄ£¬Èç¹ûÎÒÃÇÄÜÖªµÀÿ¸öÇëÇóÍ·ÓëÏìÓ¦ÌåµÄ³¤¶È£¬ÄÇôÎÒÃÇÊÇ¿ÉÒÔÔÚÒ»¸öÁ¬½ÓÉÏÃæÖ´Ðжà¸öÇëÇóµÄ£¬Õâ¾ÍÊÇËùνµÄ³¤Á¬½Ó£¬µ«Ç°ÌáÌõ¼þÊÇÎÒÃÇÏȵÃÈ·¶¨ÇëÇóÍ·ÓëÏìÓ¦ÌåµÄ³¤¶È¡£¶ÔÓÚÇëÇóÀ´Ëµ£¬Èç¹ûµ±Ç°ÇëÇóÐèÒªÓÐbody£¬ÈçPOSTÇëÇó£¬ÄÇônginx¾ÍÐèÒª¿Í»§¶ËÔÚÇëÇóÍ·ÖÐÖ¸¶¨content-lengthÀ´±íÃ÷bodyµÄ´óС£¬·ñÔò·µ»Ø400´íÎó¡£Ò²¾ÍÊÇ˵£¬ÇëÇóÌåµÄ³¤¶ÈÊÇÈ·¶¨µÄ£¬ÄÇôÏìÓ¦ÌåµÄ³¤¶ÈÄØ£¿ÏÈÀ´¿´¿´httpЭÒéÖйØÓÚÏìÓ¦body³¤¶ÈµÄÈ·¶¨£º

1.¶ÔÓÚhttp1.0ЭÒéÀ´Ëµ£¬Èç¹ûÏìӦͷÖÐÓÐcontent-lengthÍ·£¬ÔòÒÔcontent-lengthµÄ³¤¶È¾Í¿ÉÒÔÖªµÀbodyµÄ³¤¶ÈÁË£¬¿Í»§¶ËÔÚ½ÓÊÕbodyʱ£¬¾Í¿ÉÒÔÒÀÕÕÕâ¸ö³¤¶ÈÀ´½ÓÊÕÊý¾Ý£¬½ÓÊÕÍêºó£¬¾Í±íʾÕâ¸öÇëÇóÍê³ÉÁË¡£¶øÈç¹ûûÓÐcontent-lengthÍ·£¬Ôò¿Í»§¶Ë»áÒ»Ö±½ÓÊÕÊý¾Ý£¬Ö±µ½·þÎñ¶ËÖ÷¶¯¶Ï¿ªÁ¬½Ó£¬²Å±íʾbody½ÓÊÕÍêÁË¡£

2.¶ø¶ÔÓÚhttp1.1ЭÒéÀ´Ëµ£¬Èç¹ûÏìӦͷÖеÄTransfer-encodingΪchunked´«Ê䣬Ôò±íʾbodyÊÇÁ÷ʽÊä³ö£¬body»á±»·Ö³É¶à¸ö¿é£¬Ã¿¿éµÄ¿ªÊ¼»á±êʶ³öµ±Ç°¿éµÄ³¤¶È£¬´Ëʱ£¬body²»ÐèҪͨ¹ý³¤¶ÈÀ´Ö¸¶¨¡£Èç¹ûÊÇ·Çchunked´«Ê䣬¶øÇÒÓÐcontent-length£¬Ôò°´ÕÕcontent-lengthÀ´½ÓÊÕÊý¾Ý¡£·ñÔò£¬Èç¹ûÊÇ·Çchunked£¬²¢ÇÒûÓÐcontent-length£¬Ôò¿Í»§¶Ë½ÓÊÕÊý¾Ý£¬Ö±µ½·þÎñ¶ËÖ÷¶¯¶Ï¿ªÁ¬½Ó¡£

´ÓÉÏÃæ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½£¬³ýÁËhttp1.0²»´øcontent-lengthÒÔ¼°http1.1·Çchunked²»´øcontent-lengthÍ⣬bodyµÄ³¤¶ÈÊÇ¿ÉÖªµÄ¡£´Ëʱ£¬µ±·þÎñ¶ËÔÚÊä³öÍêbodyÖ®ºó£¬»á¿ÉÒÔ¿¼ÂÇʹÓó¤Á¬½Ó¡£ÄÜ·ñʹÓó¤Á¬½Ó£¬Ò²ÊÇÓÐÌõ¼þÏÞÖÆµÄ¡£Èç¹û¿Í»§¶ËµÄÇëÇóÍ·ÖеÄconnectionΪclose£¬Ôò±íʾ¿Í»§¶ËÐèÒª¹Øµô³¤Á¬½Ó£¬Èç¹ûΪkeep-alive£¬Ôò¿Í»§¶ËÐèÒª´ò¿ª³¤Á¬½Ó£¬Èç¹û¿Í»§¶ËµÄÇëÇóÖÐûÓÐconnectionÕâ¸öÍ·£¬ÄÇô¸ù¾ÝЭÒ飬Èç¹ûÊÇhttp1.0£¬ÔòĬÈÏΪclose£¬Èç¹ûÊÇhttp1.1£¬ÔòĬÈÏΪkeep-alive¡£Èç¹û½á¹ûΪkeepalive£¬ÄÇô£¬nginxÔÚÊä³öÍêÏìÓ¦Ìåºó£¬»áÉèÖõ±Ç°Á¬½ÓµÄkeepaliveÊôÐÔ£¬È»ºóµÈ´ý¿Í»§¶ËÏÂÒ»´ÎÇëÇó¡£µ±È»£¬nginx²»¿ÉÄÜÒ»Ö±µÈ´ýÏÂÈ¥£¬Èç¹û¿Í»§¶ËÒ»Ö±²»·¢Êý¾Ý¹ýÀ´£¬Æñ²»ÊÇÒ»Ö±Õ¼ÓÃÕâ¸öÁ¬½Ó£¿ËùÒÔµ±nginxÉèÖÃÁËkeepaliveµÈ´ýÏÂÒ»´ÎµÄÇëÇóʱ£¬Í¬Ê±Ò²»áÉèÖÃÒ»¸ö×î´óµÈ´ýʱ¼ä£¬Õâ¸öʱ¼äÊÇͨ¹ýÑ¡Ïîkeepalive_timeoutÀ´ÅäÖõģ¬Èç¹ûÅäÖÃΪ0£¬Ôò±íʾ¹Øµôkeepalive£¬´Ëʱ£¬http°æ±¾ÎÞÂÛÊÇ1.1»¹ÊÇ1.0£¬¿Í»§¶ËµÄconnection²»¹ÜÊÇclose»¹ÊÇkeepalive£¬¶¼»áÇ¿ÖÆÎªclose¡£

Èç¹û·þÎñ¶Ë×îºóµÄ¾ö¶¨ÊÇkeepalive´ò¿ª£¬ÄÇôÔÚÏìÓ¦µÄhttpÍ·ÀïÃæ£¬Ò²»á°üº¬ÓÐconnectionÍ·Óò£¬ÆäÖµÊÇ¡±Keep-Alive¡±£¬·ñÔò¾ÍÊÇ¡±Close¡±¡£Èç¹ûconnectionֵΪclose£¬ÄÇôÔÚnginxÏìÓ¦ÍêÊý¾Ýºó£¬»áÖ÷¶¯¹ØµôÁ¬½Ó¡£ËùÒÔ£¬¶ÔÓÚÇëÇóÁ¿±È½Ï´óµÄnginxÀ´Ëµ£¬¹Øµôkeepalive×îºó»á²úÉú±È½Ï¶àµÄtime-wait״̬µÄsocket¡£Ò»°ãÀ´Ëµ£¬µ±¿Í»§¶ËµÄÒ»´Î·ÃÎÊ£¬ÐèÒª¶à´Î·ÃÎÊͬһ¸öserverʱ£¬´ò¿ªkeepaliveµÄÓÅÊÆ·Ç³£´ó£¬±ÈÈçͼƬ·þÎñÆ÷£¬Í¨³£Ò»¸öÍøÒ³»á°üº¬ºÜ¶à¸öͼƬ¡£´ò¿ªkeepaliveÒ²»á´óÁ¿¼õÉÙtime-waitµÄÊýÁ¿¡£

pipe

ÔÚhttp1.1ÖУ¬ÒýÈëÁËÒ»ÖÖеÄÌØÐÔ£¬¼´pipeline¡£ÄÇôʲôÊÇpipelineÄØ£¿pipelineÆäʵ¾ÍÊÇÁ÷Ë®Ïß×÷Òµ£¬Ëü¿ÉÒÔ¿´×÷ΪkeepaliveµÄÒ»ÖÖÉý»ª£¬ÒòΪpipelineÒ²ÊÇ»ùÓÚ³¤Á¬½ÓµÄ£¬Ä¿µÄ¾ÍÊÇÀûÓÃÒ»¸öÁ¬½Ó×ö¶à´ÎÇëÇó¡£Èç¹û¿Í»§¶ËÒªÌá½»¶à¸öÇëÇ󣬶ÔÓÚkeepaliveÀ´Ëµ£¬ÄÇôµÚ¶þ¸öÇëÇ󣬱ØÐëÒªµÈµ½µÚÒ»¸öÇëÇóµÄÏìÓ¦½ÓÊÕÍêÈ«ºó£¬²ÅÄÜ·¢Æð£¬ÕâºÍTCPµÄÍ£Ö¹µÈ´ýЭÒéÊÇÒ»ÑùµÄ£¬µÃµ½Á½¸öÏìÓ¦µÄʱ¼äÖÁÉÙΪ2*RTT¡£¶ø¶ÔpipelineÀ´Ëµ£¬¿Í»§¶Ë²»±ØµÈµ½µÚÒ»¸öÇëÇó´¦ÀíÍêºó£¬¾Í¿ÉÒÔÂíÉÏ·¢ÆðµÚ¶þ¸öÇëÇ󡣵õ½Á½¸öÏìÓ¦µÄʱ¼ä¿ÉÄÜÄܹ»´ïµ½1*RTT¡£nginxÊÇÖ±½ÓÖ§³ÖpipelineµÄ£¬µ«ÊÇ£¬nginx¶ÔpipelineÖеĶà¸öÇëÇóµÄ´¦ÀíÈ´²»ÊDz¢Ðеģ¬ÒÀÈ»ÊÇÒ»¸öÇëÇó½ÓÒ»¸öÇëÇóµÄ´¦Àí£¬Ö»ÊÇÔÚ´¦ÀíµÚÒ»¸öÇëÇóµÄʱºò£¬¿Í»§¶Ë¾Í¿ÉÒÔ·¢ÆðµÚ¶þ¸öÇëÇó¡£ÕâÑù£¬nginxÀûÓÃpipeline¼õÉÙÁË´¦ÀíÍêÒ»¸öÇëÇóºó£¬µÈ´ýµÚ¶þ¸öÇëÇóµÄÇëÇóÍ·Êý¾ÝµÄʱ¼ä¡£ÆäʵnginxµÄ×ö·¨ºÜ¼òµ¥£¬Ç°ÃæËµµ½£¬nginxÔÚ¶ÁÈ¡Êý¾Ýʱ£¬»á½«¶ÁÈ¡µÄÊý¾Ý·Åµ½Ò»¸öbufferÀïÃæ£¬ËùÒÔ£¬Èç¹ûnginxÔÚ´¦ÀíÍêǰһ¸öÇëÇóºó£¬Èç¹û·¢ÏÖbufferÀïÃæ»¹ÓÐÊý¾Ý£¬¾ÍÈÏΪʣϵÄÊý¾ÝÊÇÏÂÒ»¸öÇëÇóµÄ¿ªÊ¼£¬È»ºó¾Í½ÓÏÂÀ´´¦ÀíÏÂÒ»¸öÇëÇ󣬷ñÔò¾ÍÉèÖÃkeepalive¡£

lingering_close

lingering_close£¬×ÖÃæÒâ˼¾ÍÊÇÑӳٹرգ¬Ò²¾ÍÊÇ˵£¬µ±nginxÒª¹Ø±ÕÁ¬½Óʱ£¬²¢·ÇÁ¢¼´¹Ø±ÕÁ¬½Ó£¬¶øÊÇÏȹرÕtcpÁ¬½ÓµÄд£¬ÔٵȴýÒ»¶Îʱ¼äºóÔٹصôÁ¬½ÓµÄ¶Á¡£ÎªÊ²Ã´ÒªÕâÑùÄØ£¿ÎÒÃÇÏÈÀ´¿´¿´ÕâÑùÒ»¸ö³¡¾°¡£nginxÔÚ½ÓÊÕ¿Í»§¶ËµÄÇëÇóʱ£¬¿ÉÄÜÓÉÓÚ¿Í»§¶Ë»ò·þÎñ¶Ë³ö´íÁË£¬ÒªÁ¢¼´ÏìÓ¦´íÎóÐÅÏ¢¸ø¿Í»§¶Ë£¬¶ønginxÔÚÏìÓ¦´íÎóÐÅÏ¢ºó£¬´ó·Ö²¿Çé¿öÏÂÊÇÐèÒª¹Ø±Õµ±Ç°Á¬½Ó¡£nginxÖ´ÐÐÍêwrite()ϵͳµ÷ÓðѴíÎóÐÅÏ¢·¢Ë͸ø¿Í»§¶Ë£¬write()ϵͳµ÷Ó÷µ»Ø³É¹¦²¢²»±íʾÊý¾ÝÒѾ­·¢Ë͵½¿Í»§¶Ë£¬ÓпÉÄÜ»¹ÔÚtcpÁ¬½ÓµÄwrite bufferÀï¡£½Ó×ÅÈç¹ûÖ±½ÓÖ´ÐÐclose()ϵͳµ÷ÓùرÕtcpÁ¬½Ó£¬Äں˻áÊ×Ïȼì²étcpµÄread bufferÀïÓÐûÓпͻ§¶Ë·¢Ë͹ýÀ´µÄÊý¾ÝÁôÔÚÄÚºË̬ûÓб»Óû§Ì¬½ø³Ì¶ÁÈ¡£¬Èç¹ûÓÐÔò·¢Ë͸ø¿Í»§¶ËRST±¨ÎÄÀ´¹Ø±ÕtcpÁ¬½Ó¶ªÆúwrite bufferÀïµÄÊý¾Ý£¬Èç¹ûûÓÐÔòµÈ´ýwrite bufferÀïµÄÊý¾Ý·¢ËÍÍê±Ï£¬È»ºóÔÙ¾­¹ýÕý³£µÄ4´Î·ÖÊÖ±¨ÎĶϿªÁ¬½Ó¡£ËùÒÔ,µ±ÔÚijЩ³¡¾°Ï³öÏÖtcp write bufferÀïµÄÊý¾ÝÔÚwrite()ϵͳµ÷ÓÃÖ®ºóµ½close()ϵͳµ÷ÓÃÖ´ÐÐ֮ǰûÓз¢ËÍÍê±Ï£¬ÇÒtcp read bufferÀïÃæ»¹ÓÐÊý¾ÝûÓжÁ£¬close()ϵͳµ÷ÓûᵼÖ¿ͻ§¶ËÊÕµ½RST±¨ÎÄÇÒ²»»áÄõ½·þÎñ¶Ë·¢Ë͹ýÀ´µÄ´íÎóÐÅÏ¢Êý¾Ý¡£Äǿͻ§¶Ë¿Ï¶¨»áÏ룬Õâ·þÎñÆ÷ºÃ°ÔµÀ£¬¶¯²»¶¯¾ÍresetÎÒµÄÁ¬½Ó£¬Á¬¸ö´íÎóÐÅÏ¢¶¼Ã»ÓС£

ÔÚÉÏÃæÕâ¸ö³¡¾°ÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½£¬¹Ø¼üµãÊÇ·þÎñ¶Ë¸ø¿Í»§¶Ë·¢ËÍÁËRST°ü£¬µ¼ÖÂ×Ô¼º·¢Ë͵ÄÊý¾ÝÔÚ¿Í»§¶ËºöÂÔµôÁË¡£ËùÒÔ£¬½â¾öÎÊÌâµÄÖØµãÊÇ£¬È÷þÎñ¶Ë±ð·¢RST°ü¡£ÔÙÏëÏ룬ÎÒÃÇ·¢ËÍRSTÊÇÒòΪÎÒÃǹصôÁËÁ¬½Ó£¬¹ØµôÁ¬½ÓÊÇÒòΪÎÒÃDz»ÏëÔÙ´¦Àí´ËÁ¬½ÓÁË£¬Ò²²»»áÓÐÈκÎÊý¾Ý²úÉúÁË¡£¶ÔÓÚȫ˫¹¤µÄTCPÁ¬½ÓÀ´Ëµ£¬ÎÒÃÇÖ»ÐèÒª¹Øµôд¾ÍÐÐÁË£¬¶Á¿ÉÒÔ¼ÌÐø½øÐУ¬ÎÒÃÇÖ»ÐèÒª¶ªµô¶Áµ½µÄÈκÎÊý¾Ý¾ÍÐÐÁË£¬ÕâÑùµÄ»°£¬µ±ÎÒÃǹصôÁ¬½Óºó£¬¿Í»§¶ËÔÙ·¢¹ýÀ´µÄÊý¾Ý£¬¾Í²»»áÔÙÊÕµ½RSTÁË¡£µ±È»×îÖÕÎÒÃÇ»¹ÊÇÐèÒª¹ØµôÕâ¸ö¶Á¶ËµÄ£¬ËùÒÔÎÒÃÇ»áÉèÖÃÒ»¸ö³¬Ê±Ê±¼ä£¬ÔÚÕâ¸öʱ¼ä¹ýºó£¬¾Í¹Øµô¶Á£¬¿Í»§¶ËÔÙ·¢ËÍÊý¾ÝÀ´¾Í²»¹ÜÁË£¬×÷Ϊ·þÎñ¶ËÎÒ»áÈÏΪ£¬¶¼Õâô³¤Ê±¼äÁË£¬·¢¸øÄãµÄ´íÎóÐÅÏ¢Ò²Ó¦¸Ã¶Áµ½ÁË£¬ÔÙÂý¾Í²»¹ØÎÒÊÂÁË£¬Òª¹Ö¾Í¹ÖÄãRP²»ºÃÁË¡£µ±È»£¬Õý³£µÄ¿Í»§¶Ë£¬ÔÚ¶ÁÈ¡µ½Êý¾Ýºó£¬»á¹ØµôÁ¬½Ó£¬´Ëʱ·þÎñ¶Ë¾Í»áÔÚ³¬Ê±Ê±¼äÄڹصô¶Á¶Ë¡£ÕâЩÕýÊÇlingering_closeËù×öµÄÊÂÇ顣ЭÒéÕ»Ìṩ SO_LINGER Õâ¸öÑ¡ÏËüµÄÒ»ÖÖÅäÖÃÇé¿ö¾ÍÊÇÀ´´¦Àílingering_closeµÄÇé¿öµÄ£¬²»¹ýnginxÊÇ×Ô¼ºÊµÏÖµÄlingering_close¡£lingering_close´æÔÚµÄÒâÒå¾ÍÊÇÀ´¶ÁȡʣϵĿͻ§¶Ë·¢À´µÄÊý¾Ý£¬ËùÒÔnginx»áÓÐÒ»¸ö¶Á³¬Ê±Ê±¼ä£¬Í¨¹ýlingering_timeoutÑ¡ÏîÀ´ÉèÖã¬Èç¹ûÔÚlingering_timeoutʱ¼äÄÚ»¹Ã»ÓÐÊÕµ½Êý¾Ý£¬ÔòÖ±½Ó¹ØµôÁ¬½Ó¡£nginx»¹Ö§³ÖÉèÖÃÒ»¸ö×ܵĶÁȡʱ¼ä£¬Í¨¹ýlingering_timeÀ´ÉèÖã¬Õâ¸öʱ¼äÒ²¾ÍÊÇnginxÔڹرÕд֮ºó£¬±£ÁôsocketµÄʱ¼ä£¬¿Í»§¶ËÐèÒªÔÚÕâ¸öʱ¼äÄÚ·¢ËÍÍêËùÓеÄÊý¾Ý£¬·ñÔònginxÔÚÕâ¸öʱ¼ä¹ýºó£¬»áÖ±½Ó¹ØµôÁ¬½Ó¡£µ±È»£¬nginxÊÇÖ§³ÖÅäÖÃÊÇ·ñ´ò¿ªlingering_closeÑ¡ÏîµÄ£¬Í¨¹ýlingering_closeÑ¡ÏîÀ´ÅäÖᣠÄÇô£¬ÎÒÃÇÔÚʵ¼ÊÓ¦ÓÃÖУ¬ÊÇ·ñÓ¦¸Ã´ò¿ªlingering_closeÄØ£¿Õâ¸ö¾ÍûÓй̶¨µÄÍÆ¼öÖµÁË£¬ÈçMaxim DouninËù˵£¬lingering_closeµÄÖ÷Òª×÷ÓÃÊDZ£³Ö¸üºÃµÄ¿Í»§¶Ë¼æÈÝÐÔ£¬µ«ÊÇÈ´ÐèÒªÏûºÄ¸ü¶àµÄ¶îÍâ×ÊÔ´£¨±ÈÈçÁ¬½Ó»áÒ»Ö±Õ¼×Å£©¡£

Õâ½Ú£¬ÎÒÃǽéÉÜÁËnginxÖУ¬Á¬½ÓÓëÇëÇóµÄ»ù±¾¸ÅÄϽڣ¬ÎÒÃǽ²»ù±¾µÄÊý¾Ý½á¹¹¡£

»ù±¾Êý¾Ý½á¹¹(99%)

nginxµÄ×÷ÕßΪ׷Çó¼«ÖµĸßЧ£¬×Ô¼ºÊµÏÖÁ˺ܶàÆÄ¾ßÌØÉ«µÄnginx·ç¸ñµÄÊý¾Ý½á¹¹ÒÔ¼°¹«¹²º¯Êý¡£±ÈÈ磬nginxÌṩÁË´ø³¤¶ÈµÄ×Ö·û´®£¬¸ù¾Ý±àÒëÆ÷Ñ¡ÏîÓÅ»¯¹ýµÄ×Ö·û´®¿½±´º¯Êýngx_copyµÈ¡£ËùÒÔ£¬ÔÚÎÒÃÇдnginxÄ£¿éʱ£¬Ó¦¸Ã¾¡Á¿µ÷ÓÃnginxÌṩµÄapi£¬¾¡¹ÜÓÐЩapiÖ»ÊǶÔglibcµÄºê¶¨Òå¡£±¾½Ú£¬ÎÒÃǽéÉÜstring¡¢list¡¢buffer¡¢chainµÈһϵÁÐ×î»ù±¾µÄÊý¾Ý½á¹¹¼°Ïà¹ØapiµÄʹÓü¼ÇÉÒÔ¼°×¢ÒâÊÂÏî¡£

ngx_str_t(100%)

ÔÚnginxÔ´ÂëĿ¼µÄsrc/coreÏÂÃæµÄngx_string.h|cÀïÃæ£¬°üº¬ÁË×Ö·û´®µÄ·â×°ÒÔ¼°×Ö·û´®Ïà¹Ø²Ù×÷µÄapi¡£nginxÌṩÁËÒ»¸ö´ø³¤¶ÈµÄ×Ö·û´®½á¹¹ngx_str_t£¬ËüµÄÔ­ÐÍÈçÏ£º

typedef struct {
size_t len;
u_char *data;
} ngx_str_t;

ÔڽṹÌåµ±ÖУ¬dataÖ¸Ïò×Ö·û´®Êý¾ÝµÄµÚÒ»¸ö×Ö·û£¬×Ö·û´®µÄ½áÊøÓó¤¶ÈÀ´±íʾ£¬¶ø²»ÊÇÓÉ¡¯\0¡¯À´±íʾ½áÊø¡£ËùÒÔ£¬ÔÚдnginx´úÂëʱ£¬´¦Àí×Ö·û´®µÄ·½·¨¸úÎÒÃÇÆ½Ê±Ê¹ÓÃÓкܴóµÄ²»Ò»Ñù£¬µ«ÒªÊ±¿Ì¼Çס£¬×Ö·û´®²»ÒÔ¡¯\0¡¯½áÊø£¬¾¡Á¿Ê¹ÓÃnginxÌṩµÄ×Ö·û´®²Ù×÷µÄapiÀ´²Ù×÷×Ö·û´®¡£ ÄÇô£¬nginxÕâÑù×öÓÐʲôºÃ´¦ÄØ£¿Ê×ÏÈ£¬Í¨¹ý³¤¶ÈÀ´±íʾ×Ö·û´®³¤¶È£¬¼õÉÙ¼ÆËã×Ö·û´®³¤¶ÈµÄ´ÎÊý¡£Æä´Î£¬nginx¿ÉÒÔÖØ¸´ÒýÓÃÒ»¶Î×Ö·û´®Äڴ棬data¿ÉÒÔÖ¸ÏòÈÎÒâÄڴ棬³¤¶È±íʾ½áÊø£¬¶ø²»ÓÃÈ¥copyÒ»·Ý×Ô¼ºµÄ×Ö·û´®(ÒòΪÈç¹ûÒªÒÔ¡¯\0¡¯½áÊø£¬¶ø²»Äܸü¸ÄÔ­×Ö·û´®£¬ËùÒÔÊÆ±ØÒªcopyÒ»¶Î×Ö·û´®)¡£ÎÒÃÇÔÚngx_http_request_t½á¹¹ÌåµÄ³ÉÔ±ÖУ¬¿ÉÒÔÕÒµ½ºÜ¶à×Ö·û´®ÒýÓÃÒ»¶ÎÄÚ´æµÄÀý×Ó£¬±ÈÈçrequest_line¡¢uri¡¢argsµÈµÈ£¬ÕâЩ×Ö·û´®µÄdata²¿·Ö£¬¶¼ÊÇÖ¸ÏòÔÚ½ÓÊÕÊý¾Ýʱ´´½¨bufferËùÖ¸ÏòµÄÄÚ´æÖУ¬uri£¬args¾ÍûÓбØÒªcopyÒ»·Ý³öÀ´¡£ÕâÑùµÄ»°£¬¼õÉÙÁ˺ܶ಻±ØÒªµÄÄÚ´æ·ÖÅäÓ뿽±´¡£ ÕýÊÇ»ùÓÚ´ËÌØÐÔ£¬ÔÚnginxÖУ¬±ØÐë½÷É÷µÄÈ¥ÐÞ¸ÄÒ»¸ö×Ö·û´®¡£ÔÚÐÞ¸Ä×Ö·û´®Ê±ÐèÒªÈÏÕæµÄÈ¥¿¼ÂÇ£ºÊÇ·ñ¿ÉÒÔÐ޸ĸÃ×Ö·û´®£»×Ö·û´®Ð޸ĺó£¬ÊÇ·ñ»á¶ÔÆäËüµÄÒýÓÃÔì³ÉÓ°Ïì¡£ÔÚºóÃæ½éÉÜngx_unescape_uriº¯ÊýµÄʱºò£¬¾Í»á¿´µ½ÕâÒ»µã¡£µ«ÊÇ£¬Ê¹ÓÃnginxµÄ×Ö·û´®»á²úÉúһЩÎÊÌ⣬glibcÌṩµÄºÜ¶àϵͳapiº¯Êý´ó¶àÊÇͨ¹ý¡¯\0¡¯À´±íʾ×Ö·û´®µÄ½áÊø£¬ËùÒÔÎÒÃÇÔÚµ÷ÓÃϵͳapiʱ£¬¾Í²»ÄÜÖ±½Ó´«Èëstr->dataÁË¡£´Ëʱ£¬Í¨³£µÄ×ö·¨ÊÇ´´½¨Ò»¶Îstr->len + 1´óСµÄÄڴ棬Ȼºócopy×Ö·û´®£¬×îºóÒ»¸ö×Ö½ÚÖÃΪ¡¯\0¡¯¡£±È½ÏhackµÄ×ö·¨ÊÇ£¬½«×Ö·û´®×îºóÒ»¸ö×Ö·ûµÄºóÒ»¸ö×Ö·ûbackupÒ»¸ö£¬È»ºóÉèÖÃΪ¡¯\0¡¯£¬ÔÚ×öÍêµ÷Óúó£¬ÔÙÓÉbackup¸Ä»ØÀ´£¬µ«Ç°ÌáÌõ¼þÊÇ£¬ÄãµÃÈ·¶¨Õâ¸ö×Ö·ûÊÇ¿ÉÒÔÐ޸ĵ쬶øÇÒÊÇÓÐÄÚ´æ·ÖÅ䣬²»»áÔ½½ç£¬µ«Ò»°ã²»½¨ÒéÕâô×ö¡£ ½ÓÏÂÀ´£¬¿´¿´nginxÌṩµÄ²Ù×÷×Ö·û´®Ïà¹ØµÄapi¡£

#define ngx_string(str)     { sizeof(str) - 1, (u_char *) str }

ngx_string(str)ÊÇÒ»¸öºê£¬Ëüͨ¹ýÒ»¸öÒÔ¡¯\0¡¯½áβµÄÆÕͨ×Ö·û´®str¹¹ÔìÒ»¸önginxµÄ×Ö·û´®£¬¼øÓÚÆäÖвÉÓÃsizeof²Ù×÷·û¼ÆËã×Ö·û´®³¤¶È£¬Òò´Ë²ÎÊý±ØÐëÊÇÒ»¸ö³£Á¿×Ö·û´®¡£

#define ngx_null_string     { 0, NULL }

¶¨Òå±äÁ¿Ê±£¬Ê¹ÓÃngx_null_string³õʼ»¯×Ö·û´®Îª¿Õ×Ö·û´®£¬·û´®µÄ³¤¶ÈΪ0£¬dataΪNULL¡£

#define ngx_str_set(str, text)                                               \
(str)->len = sizeof(text) - 1; (str)->data = (u_char *) text

ngx_str_setÓÃÓÚÉèÖÃ×Ö·û´®strΪtext£¬ÓÉÓÚʹÓÃsizeof¼ÆË㳤¶È£¬¹Êtext±ØÐëΪ³£Á¿×Ö·û´®¡£

#define ngx_str_null(str)   (str)->len = 0; (str)->data = NULL

ngx_str_nullÓÃÓÚÉèÖÃ×Ö·û´®strΪ¿Õ´®£¬³¤¶ÈΪ0£¬dataΪNULL¡£

ÉÏÃæÕâËĸöº¯Êý£¬Ê¹ÓÃʱһ¶¨ÒªÐ¡ÐÄ£¬ngx_stringÓëngx_null_stringÊÇ¡°{£¬}¡±¸ñʽµÄ£¬¹ÊÖ»ÄÜÓÃÓÚ¸³ÖµÊ±³õʼ»¯£¬È磺

ngx_str_t str = ngx_string("hello world");
ngx_str_t str1 = ngx_null_string;

Èç¹ûÏòÏÂÃæÕâÑùʹÓ㬾ͻáÓÐÎÊÌ⣬ÕâÀïÉæ¼°µ½cÓïÑÔÖжԽṹÌå±äÁ¿¸³Öµ²Ù×÷µÄÓï·¨¹æÔò£¬Ôڴ˲»×ö½éÉÜ¡£

ngx_str_t str, str1;
str = ngx_string("hello world"); // ±àÒë³ö´í
str1 = ngx_null_string; // ±àÒë³ö´í

ÕâÖÖÇé¿ö£¬¿ÉÒÔµ÷ÓÃngx_str_setÓëngx_str_nullÕâÁ½¸öº¯ÊýÀ´×ö:

ngx_str_t str, str1;
ngx_str_set(&str, "hello world");
ngx_str_null(&str1);

°´ÕÕC99±ê×¼£¬ÄúÒ²¿ÉÒÔÕâô×ö£º

ngx_str_t str, str1;
str = (ngx_str_t) ngx_string("hello world");
str1 = (ngx_str_t) ngx_null_string;

ÁíÍâҪעÒâµÄÊÇ£¬ngx_stringÓëngx_str_setÔÚµ÷ÓÃʱ£¬´«½øÈ¥µÄ×Ö·û´®Ò»¶¨Êdz£Á¿×Ö·û´®£¬·ñÔò»áµÃµ½ÒâÏë²»µ½µÄ´íÎó(ÒòΪngx_str_setÄÚ²¿Ê¹ÓÃÁËsizeof()£¬Èç¹û´«ÈëµÄÊÇu_char*£¬ÄÇô¼ÆËãµÄÊÇÕâ¸öÖ¸ÕëµÄ³¤¶È£¬¶ø²»ÊÇ×Ö·û´®µÄ³¤¶È)¡£È磺

ngx_str_t str;
u_char *a = "hello world";
ngx_str_set(&str, a); // ÎÊÌâ²úÉú

´ËÍ⣬ֵµÃ×¢ÒâµÄÊÇ£¬ÓÉÓÚngx_str_setÓëngx_str_nullʵ¼ÊÉÏÊÇÁ½ÐÐÓï¾ä£¬¹ÊÔÚif/for/whileµÈÓï¾äÖе¥¶ÀʹÓÃÐèÒªÓû¨À¨ºÅÀ¨ÆðÀ´£¬ÀýÈ磺

ngx_str_t str;
if (cond)
ngx_str_set(&str, "true"); // ÎÊÌâ²úÉú
else
ngx_str_set(&str, "false"); // ÎÊÌâ²úÉú

void ngx_strlow(u_char *dst, u_char *src, size_t n);

½«srcµÄǰn¸ö×Ö·ûת»»³ÉСд´æ·ÅÔÚdst×Ö·û´®µ±ÖУ¬µ÷ÓÃÕßÐèÒª±£Ö¤dstÖ¸ÏòµÄ¿Õ¼ä´óÓÚµÈÓÚn£¬ÇÒÖ¸ÏòµÄ¿Õ¼ä±ØÐë¿Éд¡£²Ù×÷²»»á¶ÔÔ­×Ö·û´®²úÉú±ä¶¯¡£ÈçÒª¸ü¸ÄÔ­×Ö·û´®£¬¿ÉÒÔ£º

ngx_strlow(str->data, str->data, str->len);

ngx_strncmp(s1, s2, n)

Çø·Ö´óСдµÄ×Ö·û´®±È½Ï£¬Ö»±È½Ïǰn¸ö×Ö·û¡£

ngx_strcmp(s1, s2)

Çø·Ö´óСдµÄ²»´ø³¤¶ÈµÄ×Ö·û´®±È½Ï¡£

ngx_int_t ngx_strcasecmp(u_char *s1, u_char *s2);

²»Çø·Ö´óСдµÄ²»´ø³¤¶ÈµÄ×Ö·û´®±È½Ï¡£

ngx_int_t ngx_strncasecmp(u_char *s1, u_char *s2, size_t n);

²»Çø·Ö´óСдµÄ´ø³¤¶ÈµÄ×Ö·û´®±È½Ï£¬Ö»±È½Ïǰn¸ö×Ö·û¡£

u_char * ngx_cdecl ngx_sprintf(u_char *buf, const char *fmt, ...);
u_char * ngx_cdecl ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...);
u_char * ngx_cdecl ngx_slprintf(u_char *buf, u_char *last, const char *fmt, ...);

ÉÏÃæÕâÈý¸öº¯ÊýÓÃÓÚ×Ö·û´®¸ñʽ»¯£¬ngx_snprintfµÄµÚ¶þ¸ö²ÎÊýmaxÖ¸Ã÷bufµÄ¿Õ¼ä´óС£¬ngx_slprintfÔòͨ¹ýlastÀ´Ö¸Ã÷buf¿Õ¼äµÄ´óС¡£ÍƼöʹÓõڶþ¸ö»òµÚÈý¸öº¯ÊýÀ´¸ñʽ»¯×Ö·û´®£¬ngx_sprintfº¯Êý»¹ÊDZȽÏΣÏյģ¬ÈÝÒײúÉú»º³åÇøÒç³ö©¶´¡£ÔÚÕâһϵÁк¯ÊýÖУ¬nginxÔÚ¼æÈÝglibcÖиñʽ»¯×Ö·û´®µÄÐÎʽ֮Í⣬»¹Ìí¼ÓÁËһЩ·½±ã¸ñʽ»¯nginxÀàÐ͵ÄһЩתÒå×Ö·û£¬±ÈÈç%VÓÃÓÚ¸ñʽ»¯ngx_str_t½á¹¹¡£ÔÚnginxÔ´ÎļþµÄngx_string.cÖÐÓÐ˵Ã÷£º

/*
* supported formats:
* %[0][width][x][X]O off_t
* %[0][width]T time_t
* %[0][width][u][x|X]z ssize_t/size_t
* %[0][width][u][x|X]d int/u_int
* %[0][width][u][x|X]l long
* %[0][width|m][u][x|X]i ngx_int_t/ngx_uint_t
* %[0][width][u][x|X]D int32_t/uint32_t
* %[0][width][u][x|X]L int64_t/uint64_t
* %[0][width|m][u][x|X]A ngx_atomic_int_t/ngx_atomic_uint_t
* %[0][width][.width]f double, max valid number fits to %18.15f
* %P ngx_pid_t
* %M ngx_msec_t
* %r rlim_t
* %p void *
* %V ngx_str_t *
* %v ngx_variable_value_t *
* %s null-terminated string
* %*s length and string
* %Z '\0'
* %N '\n'
* %c char
* %% %
*
* reserved:
* %t ptrdiff_t
* %S null-terminated wchar string
* %C wchar
*/

ÕâÀïÌØ±ðÒªÌáÐѵÄÊÇ£¬ÎÒÃÇ×î³£ÓÃÓÚ¸ñʽ»¯ngx_str_t½á¹¹£¬Æä¶ÔÓ¦µÄתÒå·ûÊÇ%V£¬´«¸øº¯ÊýµÄÒ»¶¨ÒªÊÇÖ¸ÕëÀàÐÍ£¬·ñÔò³ÌÐò¾Í»ácoredumpµô¡£ÕâÒ²ÊÇÎÒÃÇ×îÈÝÒ×·¸µÄ´í¡£±ÈÈ磺

ngx_str_t str = ngx_string("hello world");
char buffer[1024];
ngx_snprintf(buffer, 1024, "%V", &str); // ×¢Ò⣬strÈ¡µØÖ·

ÕâÁ½¸öº¯ÊýÓÃÓÚ¶Ôstr½øÐÐbase64±àÂëÓë½âÂ룬µ÷ÓÃǰ£¬ÐèÒª±£Ö¤dstÖÐÓÐ×ã¹»µÄ¿Õ¼äÀ´´æ·Å½á¹û£¬Èç¹û²»ÖªµÀ¾ßÌå´óС£¬¿ÉÏȵ÷ÓÃngx_base64_encoded_lengthÓëngx_base64_decoded_lengthÀ´Ô¤¹À×î´óÕ¼Óÿռ䡣

void ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src);
ngx_int_t ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src);

¶Ôsrc½øÐбàÂ룬¸ù¾ÝtypeÀ´°´²»Í¬µÄ·½Ê½½øÐбàÂ룬Èç¹ûdstΪNULL£¬Ôò·µ»ØÐèҪתÒåµÄ×Ö·ûµÄÊýÁ¿£¬Óɴ˿ɵõ½ÐèÒªµÄ¿Õ¼ä´óС¡£typeµÄÀàÐÍ¿ÉÒÔÊÇ£º

uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
ngx_uint_t type);

#define NGX_ESCAPE_URI         0
#define NGX_ESCAPE_ARGS 1
#define NGX_ESCAPE_HTML 2
#define NGX_ESCAPE_REFRESH 3
#define NGX_ESCAPE_MEMCACHED 4
#define NGX_ESCAPE_MAIL_AUTH 5

¶Ôsrc½øÐз´±àÂ룬type¿ÉÒÔÊÇ0¡¢NGX_UNESCAPE_URI¡¢NGX_UNESCAPE_REDIRECTÕâÈý¸öÖµ¡£Èç¹ûÊÇ0£¬Ôò±íʾsrcÖеÄËùÓÐ×Ö·û¶¼Òª½øÐÐתÂë¡£Èç¹ûÊÇNGX_UNESCAPE_URIÓëNGX_UNESCAPE_REDIRECT£¬ÔòÓöµ½¡¯?¡¯ºó¾Í½áÊøÁË£¬ºóÃæµÄ×Ö·û¾Í²»¹ÜÁË¡£¶øNGX_UNESCAPE_URIÓëNGX_UNESCAPE_REDIRECTÖ®¼äµÄÇø±ðÊÇNGX_UNESCAPE_URI¶ÔÓÚÓöµ½µÄÐèҪתÂëµÄ×Ö·û£¬¶¼»áתÂ룬¶øNGX_UNESCAPE_REDIRECTÔòÖ»»á¶Ô·Ç¿É¼û×Ö·û½øÐÐתÂë¡£

void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);

¶Ôsrc½øÐз´±àÂ룬type¿ÉÒÔÊÇ0¡¢NGX_UNESCAPE_URI¡¢NGX_UNESCAPE_REDIRECTÕâÈý¸öÖµ¡£Èç¹ûÊÇ0£¬Ôò±íʾsrcÖеÄËùÓÐ×Ö·û¶¼Òª½øÐÐתÂë¡£Èç¹ûÊÇNGX_UNESCAPE_URIÓëNGX_UNESCAPE_REDIRECT£¬ÔòÓöµ½¡¯?¡¯ºó¾Í½áÊøÁË£¬ºóÃæµÄ×Ö·û¾Í²»¹ÜÁË¡£¶øNGX_UNESCAPE_URIÓëNGX_UNESCAPE_REDIRECTÖ®¼äµÄÇø±ðÊÇNGX_UNESCAPE_URI¶ÔÓÚÓöµ½µÄÐèҪתÂëµÄ×Ö·û£¬¶¼»áתÂ룬¶øNGX_UNESCAPE_REDIRECTÔòÖ»»á¶Ô·Ç¿É¼û×Ö·û½øÐÐתÂë¡£

uintptr_t ngx_escape_html(u_char *dst, u_char *src, size_t size);

¶Ôhtml±êÇ©½øÐбàÂë¡£

µ±È»£¬ÎÒÕâÀïÖ»½éÉÜÁËһЩ³£ÓõÄapiµÄʹÓ㬴ó¼Ò¿ÉÒÔÏÈÊìϤһÏ£¬ÔÚʵ¼ÊʹÓùý³ÌÖУ¬Óöµ½²»Ã÷°×µÄ£¬×î¿ì×îÖ±½ÓµÄ·½·¨¾ÍÊÇÈ¥¿´Ô´Â룬¿´apiµÄʵÏÖ»ò¿´nginx×ÔÉíµ÷ÓÃapiµÄµØ·½ÊÇÔõô×öµÄ£¬´úÂë¾ÍÊÇ×îºÃµÄÎĵµ¡£

   
3426 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þ
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù


Èñ°²¿Æ¼¼ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨
³É¶¼ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£Æû³µ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
±±¾© Èí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£ Èí¼þ¼Ü¹¹Éè¼Æ°¸ÀýÓëʵ¼ù
±±¾© ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ÉîÛÚ ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù