±à¼ÍƼö: |
ÎÄÕ½éÉÜÁËNginxÄ£¿é»®·Ö¡¢Ä£¿é´¦ÀíºÍ´¦ÀíÁ÷³Ì¡¢NginxÇëÇó´¦ÀíÒÔ¼°Nginx¼Ü¹¹¼°¹¤×÷Á÷³ÌµÈÏà¹ØÄÚÈÝ£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚjianshu£¬ÓÉ»ðÁú¹ûÈí¼þLuca±à¼ÍƼö¡£ |
|
1 ·´Ïò´úÀí
1.1 ¸ÅÄî
·´Ïò´úÀí£¨Reverse Proxy£©·½Ê½ÊÇÖ¸ÒÔ´úÀí·þÎñÆ÷À´½ÓÊÜinternetÉϵÄÁ¬½ÓÇëÇó£¬È»ºó½«ÇëÇóת·¢¸øÄÚ²¿ÍøÂçÉϵķþÎñÆ÷£¬²¢½«´Ó·þÎñÆ÷Éϵõ½µÄ½á¹û·µ»Ø¸øinternetÉÏÇëÇóÁ¬½ÓµÄ¿Í»§¶Ë£¬´Ëʱ´úÀí·þÎñÆ÷¶ÔÍâ¾Í±íÏÖΪһ¸ö·þÎñÆ÷¡£
¾Ù¸öÀý×Ó£¬±ÈÈçÎÒÏë·ÃÎÊ http://www.test.com/readme£¬µ«www.test.comÉϲ¢²»´æÔÚreadmeÒ³Ãæ£¬ÓÚÊÇËûÊÇ͵͵´ÓÁíÍâһ̨·þÎñÆ÷ÉÏÈ¡»ØÀ´£¬È»ºó×÷Ϊ×Ô¼ºµÄÄÚÈÝ·µ»ØÓû§£¬µ«Óû§²¢²»ÖªÇé¡£ÕâÀïËùÌáµ½µÄ
www.test.com Õâ¸öÓòÃû¶ÔÓ¦µÄ·þÎñÆ÷¾ÍÉèÖÃÁË·´Ïò´úÀí¹¦ÄÜ¡£
½áÂÛ¾ÍÊÇ£¬·´Ïò´úÀí·þÎñÆ÷¶ÔÓÚ¿Í»§¶Ë¶øÑÔËü¾ÍÏñÊÇÔʼ·þÎñÆ÷£¬²¢ÇÒ¿Í»§¶Ë²»ÐèÒª½øÐÐÈκÎÌØ±ðµÄÉèÖ᣿ͻ§¶ËÏò·´Ïò´úÀíµÄÃüÃû¿Õ¼ä(name-space)ÖеÄÄÚÈÝ·¢ËÍÆÕͨÇëÇ󣬽Ó×Å·´Ïò´úÀí·þÎñÆ÷½«ÅжÏÏòºÎ´¦(Ôʼ·þÎñÆ÷)ת½»ÇëÇ󣬲¢½«»ñµÃµÄÄÚÈÝ·µ»Ø¸ø¿Í»§¶Ë£¬¾ÍÏñÕâЩÄÚÈÝÔ±¾¾ÍÊÇËü×Ô¼ºµÄÒ»Ñù¡£
ÕýÏò´úÀí£¬¼ÈÈ»Óз´Ïò´úÀí£¬¾Í¿Ï¶¨ÓÐÕýÏò´úÀí¡£Ê²Ã´½ÐÕýÏò´úÀíÄØ£¿
ÕýÏò´úÀí£¨Forward Proxy£©Í¨³£¶¼±»¼ò³ÆÎª´úÀí£¬¾ÍÊÇÔÚÓû§ÎÞ·¨Õý³£·ÃÎÊÍⲿ×ÊÔ´£¬±È·½ËµÊܵ½GFWµÄÓ°ÏìÎÞ·¨·ÃÎÊtwitterµÄʱºò£¬ÎÒÃÇ¿ÉÒÔͨ¹ý´úÀíµÄ·½Ê½£¬ÈÃÓû§Èƹý·À»ðǽ£¬´Ó¶øÁ¬½Óµ½Ä¿±êÍøÂç»òÕß·þÎñ¡£
ÕýÏò´úÀíµÄ¹¤×÷ÔÀí¾ÍÏñÒ»¸öÌø°å£¬±ÈÈ磺ÎÒ·ÃÎʲ»ÁËgoogle.com£¬µ«ÊÇÎÒÄÜ·ÃÎÊÒ»¸ö´úÀí·þÎñÆ÷A£¬AÄÜ·ÃÎÊgoogle.com£¬ÓÚÊÇÎÒÏÈÁ¬ÉÏ´úÀí·þÎñÆ÷A£¬¸æËßËûÎÒÐèÒªgoogle.comµÄÄÚÈÝ£¬A¾Íȥȡ»ØÀ´£¬È»ºó·µ»Ø¸øÎÒ¡£´ÓÍøÕ¾µÄ½Ç¶È£¬Ö»ÔÚ´úÀí·þÎñÆ÷À´È¡ÄÚÈݵÄʱºòÓÐÒ»´Î¼Ç¼£¬ÓÐʱºò²¢²»ÖªµÀÊÇÓû§µÄÇëÇó£¬Ò²Òþ²ØÁËÓû§µÄ×ÊÁÏ£¬ÕâÈ¡¾öÓÚ´úÀí¸æ²»¸æËßÍøÕ¾¡£
½áÂÛ¾ÍÊÇ£¬ÕýÏò´úÀíÊÇÒ»¸öλÓÚ¿Í»§¶ËºÍÔʼ·þÎñÆ÷(origin server)Ö®¼äµÄ·þÎñÆ÷¡£ÎªÁË´ÓÔʼ·þÎñÆ÷È¡µÃÄÚÈÝ£¬¿Í»§¶ËÏò´úÀí·¢ËÍÒ»¸öÇëÇó²¢Ö¸¶¨Ä¿±ê(Ôʼ·þÎñÆ÷)£¬È»ºó´úÀíÏòÔʼ·þÎñÆ÷ת½»ÇëÇó²¢½«»ñµÃµÄÄÚÈÝ·µ»Ø¸ø¿Í»§¶Ë¡£
·´Ïò´úÀíVSÕýÏò´úÀí£º

ÕýÏò´úÀíʾÒâͼ

·´Ïò´úÀíʾÒâͼ
1.2 ¹¤×÷Á÷³Ì
Óû§Í¨¹ýÓòÃû·¢³ö·ÃÎÊWeb·þÎñÆ÷µÄÇëÇ󣬸ÃÓòÃû±»DNS·þÎñÆ÷½âÎöΪ·´Ïò´úÀí·þÎñÆ÷µÄIPµØÖ·£»
·´Ïò´úÀí·þÎñÆ÷½ÓÊÜÓû§µÄÇëÇó£»
·´Ïò´úÀí·þÎñÆ÷ÔÚ±¾µØ»º´æÖвéÕÒÇëÇóµÄÄÚÈÝ£¬ÕÒµ½ºóÖ±½Ó°ÑÄÚÈÝ·¢Ë͸øÓû§£»
Èç¹û±¾µØ»º´æÀïûÓÐÓû§ËùÇëÇóµÄÐÅÏ¢ÄÚÈÝ£¬·´Ïò´úÀí·þÎñÆ÷»á´úÌæÓû§ÏòÔ´·þÎñÆ÷ÇëÇóͬÑùµÄÐÅÏ¢ÄÚÈÝ£¬²¢°ÑÐÅÏ¢ÄÚÈÝ·¢¸øÓû§£¬Èç¹ûÐÅÏ¢ÄÚÈÝÊÇ»º´æµÄ»¹»á°ÑËü±£´æµ½»º´æÖС£
1.3 Óŵã
±£»¤ÁËÕæÊµµÄweb·þÎñÆ÷£¬±£Ö¤ÁËweb·þÎñÆ÷µÄ×ÊÔ´°²È«
ͨ³£µÄ´úÀí·þÎñÆ÷£¬Ö»ÓÃÓÚ´úÀíÄÚ²¿ÍøÂç¶ÔInternetÍâ²¿ÍøÂçµÄÁ¬½ÓÇëÇ󣬿ͻ§»ú±ØÐëÖ¸¶¨´úÀí·þÎñÆ÷£¬²¢½«±¾À´ÒªÖ±½Ó·¢Ë͵½Web·þÎñÆ÷ÉϵÄhttpÇëÇó·¢Ë͵½´úÀí·þÎñÆ÷ÖС£²»Ö§³ÖÍâ²¿ÍøÂç¶ÔÄÚ²¿ÍøÂçµÄÁ¬½ÓÇëÇó£¬ÒòΪÄÚ²¿ÍøÂç¶ÔÍâ²¿ÍøÂçÊDz»¿É¼ûµÄ¡£µ±Ò»¸ö´úÀí·þÎñÆ÷Äܹ»´úÀíÍâ²¿ÍøÂçÉϵÄÖ÷»ú£¬·ÃÎÊÄÚ²¿ÍøÂçʱ£¬ÕâÖÖ´úÀí·þÎñµÄ·½Ê½³ÆÎª·´Ïò´úÀí·þÎñ¡£´Ëʱ´úÀí·þÎñÆ÷¶ÔÍâ¾Í±íÏÖΪһ¸öWeb·þÎñÆ÷£¬Íâ²¿ÍøÂç¾Í¿ÉÒÔ¼òµ¥°ÑËüµ±×÷Ò»¸ö±ê×¼µÄWeb·þÎñÆ÷¶ø²»ÐèÒªÌØ¶¨µÄÅäÖᣲ»Í¬Ö®´¦ÔÚÓÚ£¬Õâ¸ö·þÎñÆ÷ûÓб£´æÈκÎÍøÒ³µÄÕæÊµÊý¾Ý£¬ËùÓеľ²Ì¬ÍøÒ³»òÕßCGI³ÌÐò£¬¶¼±£´æÔÚÄÚ²¿µÄWeb·þÎñÆ÷ÉÏ¡£Òò´Ë¶Ô·´Ïò´úÀí·þÎñÆ÷µÄ¹¥»÷²¢²»»áʹµÃÍøÒ³ÐÅÏ¢Ôâµ½ÆÆ»µ£¬ÕâÑù¾ÍÔöÇ¿ÁËWeb·þÎñÆ÷µÄ°²È«ÐÔ¡£
½ÚÔ¼ÁËÓÐÏÞµÄIPµØÖ·×ÊÔ´
ÆóÒµÄÚËùÓеÄÍøÕ¾¹²ÏíÒ»¸öÔÚinternetÖÐ×¢²áµÄIPµØÖ·£¬ÕâЩ·þÎñÆ÷·ÖÅä˽ÓеØÖ·£¬²ÉÓÃÐéÄâÖ÷»úµÄ·½Ê½¶ÔÍâÌṩ·þÎñ¡£
¼õÉÙWEB·þÎñÆ÷ѹÁ¦£¬Ìá¸ßÏìÓ¦ËÙ¶È
·´Ïò´úÀí¾ÍÊÇͨ³£Ëù˵µÄweb·þÎñÆ÷¼ÓËÙ£¬ËüÊÇÒ»ÖÖͨ¹ýÔÚ·±Ã¦µÄweb·þÎñÆ÷ºÍÍâ²¿ÍøÂçÖ®¼äÔö¼ÓÒ»¸ö¸ßËÙµÄweb»º³å·þÎñÆ÷À´½µµÍʵ¼ÊµÄweb·þÎñÆ÷µÄ¸ºÔصÄÒ»ÖÖ¼¼Êõ¡£·´Ïò´úÀíÊÇÕë¶Ôweb·þÎñÆ÷Ìá¸ß¼ÓËÙ¹¦ÄÜ£¬×÷Ϊ´úÀí»º´æ£¬Ëü²¢²»ÊÇÕë¶Ôä¯ÀÀÆ÷Óû§£¬¶øÕë¶Ôһ̨»ò¶àÌ¨ÌØ¶¨µÄweb·þÎñÆ÷£¬Ëü¿ÉÒÔ´úÀíÍâ²¿ÍøÂç¶ÔÄÚ²¿ÍøÂçµÄ·ÃÎÊÇëÇó¡£
·´Ïò´úÀí·þÎñÆ÷»áÇ¿ÖÆ½«Íâ²¿ÍøÂç¶ÔÒª´úÀíµÄ·þÎñÆ÷µÄ·ÃÎʾ¹ýËü£¬ÕâÑù·´Ïò´úÀí·þÎñÆ÷¸ºÔð½ÓÊÕ¿Í»§¶ËµÄÇëÇó£¬È»ºóµ½Ô´·þÎñÆ÷ÉÏ»ñÈ¡ÄÚÈÝ£¬°ÑÄÚÈÝ·µ»Ø¸øÓû§£¬²¢°ÑÄÚÈݱ£´æµ½±¾µØ£¬ÒÔ±ãÈÕºóÔÙÊÕµ½Í¬ÑùµÄÐÅÏ¢ÇëÇóʱ£¬Ëü»á°Ñ±¾µØ»º´æÀïµÄÄÚÈÝÖ±½Ó·¢¸øÓû§£¬ÒÔ¼õÉÙºó¶Ëweb·þÎñÆ÷µÄѹÁ¦£¬Ìá¸ßÏìÓ¦ËÙ¶È¡£Òò´ËNginx»¹¾ßÓлº´æ¹¦ÄÜ¡£
ÆäËûÓŵã
£¨1£©ÇëÇóµÄͳһ¿ØÖÆ£¬°üÀ¨ÉèÖÃȨÏÞ¡¢¹ýÂ˹æÔòµÈ£»
£¨2£©Çø·Ö¶¯Ì¬ºÍ¾²Ì¬¿É»º´æÄÚÈÝ£»
£¨3£©ÊµÏÖ¸ºÔؾùºâ£¬ÄÚ²¿¿ÉÒÔ²ÉÓöą̀·þÎñÆ÷À´×é³É·þÎñÆ÷¼¯Èº£¬Íⲿ»¹ÊÇ¿ÉÒÔ²ÉÓÃÒ»¸öµØÖ··ÃÎÊ£»
£¨4£©½â¾öAjax¿çÓòÎÊÌ⣻
£¨5£©×÷ÎªÕæÊµ·þÎñÆ÷µÄ»º³å£¬½â¾ö˲¼ä¸ºÔØÁ¿´óµÄÎÊÌ⣻
2 NginxÄ£¿é
NginxÓÐÎå´óÓŵ㣺ģ¿é»¯¡¢Ê¼þÇý¶¯¡¢Òì²½¡¢·Ç×èÈû¡¢¶à½ø³Ìµ¥Ï̡߳£ÓÉÄں˺ÍÄ£¿é×é³ÉµÄ£¬ÆäÖÐÄÚºËÍê³ÉµÄ¹¤×÷±È½Ï¼òµ¥£¬½ö½öͨ¹ý²éÕÒÅäÖÃÎļþ½«¿Í»§¶ËÇëÇóÓ³Éäµ½Ò»¸ölocation
block£¬È»ºóÓÖ½«Õâ¸ölocation blockÖÐËùÅäÖõÄÿ¸öÖ¸Á»áÆô¶¯²»Í¬µÄÄ£¿éÈ¥Íê³ÉÏàÓ¦µÄ¹¤×÷¡£
2.1 Ä£¿é»®·Ö
NginxµÄÄ£¿é´Ó½á¹¹ÉÏ·ÖΪºËÐÄÄ£¿é¡¢»ù´¡Ä£¿éºÍµÚÈý·½Ä£¿é£º
ºËÐÄÄ£¿é£ºHTTPÄ£¿é¡¢EVENTÄ£¿éºÍMAILÄ£¿é
»ù´¡Ä£¿é£ºHTTP AccessÄ£¿é¡¢HTTP FastCGIÄ£¿é¡¢HTTP ProxyÄ£¿éºÍHTTP
RewriteÄ£¿é£¬
µÚÈý·½Ä£¿é£ºHTTP Upstream Request HashÄ£¿é¡¢NoticeÄ£¿éºÍHTTP Access
KeyÄ£¿é¡£
NginxµÄÄ£¿é´Ó¹¦ÄÜÉÏ·ÖΪÈçÏÂËÄÀࣺ
Core(ºËÐÄÄ£¿é)£º¹¹½¨nginx»ù´¡·þÎñ¡¢¹ÜÀíÆäËûÄ£¿é¡£
Handlers£¨´¦ÀíÆ÷Ä£¿é£©£º´ËÀàÄ£¿éÖ±½Ó´¦ÀíÇëÇ󣬲¢½øÐÐÊä³öÄÚÈݺÍÐÞ¸ÄheadersÐÅÏ¢µÈ²Ù×÷¡£
Filters £¨¹ýÂËÆ÷Ä£¿é£©£º´ËÀàÄ£¿éÖ÷Òª¶ÔÆäËû´¦ÀíÆ÷Ä£¿éÊä³öµÄÄÚÈݽøÐÐÐ޸IJÙ×÷£¬×îºóÓÉNginxÊä³ö¡£
Proxies £¨´úÀíÀàÄ£¿é£©£º´ËÀàÄ£¿éÊÇNginxµÄHTTP UpstreamÖ®ÀàµÄÄ£¿é£¬ÕâЩģ¿éÖ÷ÒªÓëºó¶ËһЩ·þÎñ±ÈÈçFastCGIµÈ½øÐн»»¥£¬ÊµÏÖ·þÎñ´úÀíºÍ¸ºÔؾùºâµÈ¹¦ÄÜ¡£
NginxµÄºËÐÄÄ£¿éÖ÷Òª¸ºÔð½¨Á¢nginx·þÎñÄ£ÐÍ¡¢¹ÜÀíÍøÂç²ãºÍÓ¦ÓòãÐÒé¡¢ÒÔ¼°Æô¶¯Õë¶ÔÌØ¶¨Ó¦ÓõÄһϵÁкòѡģ¿é¡£ÆäËûÄ£¿é¸ºÔð·ÖÅ䏸web·þÎñÆ÷µÄʵ¼Ê¹¤×÷£º
(1) µ±Nginx·¢ËÍÎļþ»òÕßת·¢ÇëÇ󵽯äËû·þÎñÆ÷£¬ÓÉHandlers(´¦ÀíÄ£¿é)»òProxies£¨´úÀíÀàÄ£¿é£©Ìṩ·þÎñ£»
(2) µ±ÐèÒªNginx°ÑÊä³öѹËõ»òÕßÔÚ·þÎñ¶Ë¼ÓһЩ¶«Î÷£¬ÓÉFilters(¹ýÂËÄ£¿é)Ìṩ·þÎñ¡£
2.2 Ä£¿é´¦Àí
µ±·þÎñÆ÷Æô¶¯£¬Ã¿¸öhandlers(´¦ÀíÄ£¿é)¶¼Óлú»áÓ³Éäµ½ÅäÖÃÎļþÖж¨ÒåµÄÌØ¶¨Î»Öã¨location£©£»Èç¹ûÓжà¸öhandlers(´¦ÀíÄ£¿é)Ó³Éäµ½ÌØ¶¨Î»ÖÃʱ£¬Ö»ÓÐÒ»¸ö»á¡°Ó®¡±£¨ËµÃ÷ÅäÖÃÎļþÓгåÍ»ÏӦ¸Ã±ÜÃâ·¢Éú£©¡£
´¦ÀíÄ£¿éÒÔÈýÖÖÐÎʽ·µ»Ø£º
OK
ERROR
»òÕß·ÅÆú´¦ÀíÕâ¸öÇëÇó¶øÈÃĬÈÏ´¦ÀíÄ£¿éÀ´´¦Àí£¨Ö÷ÒªÊÇÓÃÀ´´¦ÀíһЩ¾²Ì¬Îļþ£¬ÊÂʵÉÏÈç¹ûÊÇλÖÃÕýÈ·¶øÕæÊµµÄ¾²Ì¬Îļþ£¬Ä¬ÈϵĴ¦ÀíÄ£¿é»áÇÀÏÈ´¦Àí£©¡£
Èç¹ûhandlers(´¦ÀíÄ£¿é)°ÑÇëÇó·´Ïò´úÀíµ½ºó¶ËµÄ·þÎñÆ÷£¬¾Í±ä³ÉÁíÍâÒ»ÀàµÄÄ£¿é£ºload-balancers£¨¸ºÔؾùºâÄ£¿é£©¡£¸ºÔؾùºâÄ£¿éµÄÅäÖÃÖÐÓÐÒ»×éºó¶Ë·þÎñÆ÷£¬µ±Ò»¸öHTTPÇëÇó¹ýÀ´Ê±£¬Ëü¾ö¶¨ÄĄ̈·þÎñÆ÷Ó¦µ±»ñµÃÕâ¸öÇëÇó¡£
NginxµÄ¸ºÔؾùºâÄ£¿é²ÉÓÃÁ½ÖÖ·½·¨£º
ÂÖת·¨£¬Ëü´¦ÀíÇëÇó¾ÍÏñֽůÓÎÏ·Ò»Ñù´ÓÍ·µ½Î²·Ö·¢£»
IP¹þÏ£·¨£¬ÔÚÖÚ¶àÇëÇóµÄÇé¿öÏ£¬ËüÈ·±£À´×Ôͬһ¸öIPµÄÇëÇó»á·Ö·¢µ½ÏàͬµÄºó¶Ë·þÎñÆ÷¡£
Èç¹ûhandlers(´¦ÀíÄ£¿é)ûÓвúÉú´íÎó£¬filters£¨¹ýÂËÄ£¿é£©½«±»µ÷Ó᣶à¸öfilters£¨¹ýÂËÄ£¿é£©ÄÜÓ³É䵽ÿ¸öλÖã¬ËùÒÔ£¨±ÈÈ磩ÿ¸öÇëÇ󶼿ÉÒÔ±»Ñ¹Ëõ³É¿é¡£ËüÃǵÄÖ´ÐÐ˳ÐòÔÚ±àÒëʱ¾ö¶¨¡£
filters£¨¹ýÂËÄ£¿é£©ÊǾµäµÄ¡°½ÓÁ¦Á´±í£¨CHAIN OF RESPONSIBILITY£©¡±Ä£ÐÍ£ºÒ»¸öfilters£¨¹ýÂËÄ£¿é£©±»µ÷Óã¬Íê³ÉÆä¹¤×÷£¬È»ºóµ÷ÓÃÏÂÒ»¸öfilters£¨¹ýÂËÄ£¿é£©£¬Ö±µ½×îºóÒ»¸öfilters£¨¹ýÂËÄ£¿é£©¡£
¹ýÂËÄ£¿éÁ´µÄÌØ±ðÖ®´¦ÔÚÓÚ£º
ÿ¸öfilters£¨¹ýÂËÄ£¿é£©²»»áµÈÉÏÒ»¸öfilters£¨¹ýÂËÄ£¿é£©È«²¿Íê³É£»
ËüÄܰÑǰһ¸ö¹ýÂËÄ£¿éµÄÊä³ö×÷ΪÆä´¦ÀíÄÚÈÝ£»ÓеãÏñUnixÖеÄÁ÷Ë®Ïߣ»
¹ýÂËÄ£¿éÄÜÒÔbuffer£¨»º³åÇø£©Îªµ¥Î»½øÐвÙ×÷£¬ÕâЩbufferÒ»°ã¶¼ÊÇÒ»Ò³£¨4K£©´óС£¬µ±È»ÄãÒ²¿ÉÒÔÔÚnginx.confÎļþÖнøÐÐÅäÖá£ÕâÒâζ×Å£¬±ÈÈ磬ģ¿é¿ÉÒÔѹËõÀ´×Ôºó¶Ë·þÎñÆ÷µÄÏìÓ¦£¬È»ºóÏñÁ÷Ò»ÑùµÄµ½´ï¿Í»§¶Ë£¬Ö±µ½Õû¸öÏìÓ¦·¢ËÍÍê³É¡£
×ÜÖ®£¬¹ýÂËÄ£¿éÁ´ÒÔÁ÷Ë®Ïߵķ½Ê½¸ßЧÂʵØÏò¿Í»§¶Ë·¢ËÍÏìÓ¦ÐÅÏ¢¡£
ËùÒÔ×ܽáÏÂÉÏÃæµÄÄÚÈÝ£¬Ò»¸öµäÐ͵ÄHTTP´¦ÀíÖÜÆÚÊÇÕâÑùµÄ£º
¿Í»§¶Ë·¢ËÍHTTPÇëÇó ¨C>
Nginx»ùÓÚÅäÖÃÎļþÖеÄλÖÃÑ¡ÔñÒ»¸öºÏÊʵĴ¦ÀíÄ£¿é ->
(Èç¹ûÓÐ)¸ºÔؾùºâÄ£¿éÑ¡Ôñһ̨ºó¶Ë·þÎñÆ÷ ¨C>
´¦ÀíÄ£¿é½øÐд¦Àí²¢°ÑÊä³ö»º³å·Åµ½µÚÒ»¸ö¹ýÂËÄ£¿éÉÏ ¨C>
µÚÒ»¸ö¹ýÂËÄ£¿é´¦ÀíºóÊä³ö¸øµÚ¶þ¸ö¹ýÂËÄ£¿é ¨C>
È»ºóµÚ¶þ¸ö¹ýÂËÄ£¿éÓÖµ½µÚÈý¸ö ¨C>
ÒÀ´ËÀàÍÆ ¨C> ×îºó°ÑÏìÓ¦·¢¸ø¿Í»§¶Ë¡£
ÏÂͼչʾÁËNginxÄ£¿é´¦ÀíÁ÷³Ì£º

NginxÄ£¿é´¦ÀíÁ÷³Ì
Nginx±¾Éí×öµÄ¹¤×÷ʵ¼ÊºÜÉÙ£¬µ±Ëü½Óµ½Ò»¸öHTTPÇëÇóʱ£¬Ëü½ö½öÊÇͨ¹ý²éÕÒÅäÖÃÎļþ½«´Ë´ÎÇëÇóÓ³Éäµ½Ò»¸ölocation
block£¬¶ø´ËlocationÖÐËùÅäÖõĸ÷¸öÖ¸ÁîÔò»áÆô¶¯²»Í¬µÄÄ£¿éÈ¥Íê³É¹¤×÷£¬Òò´ËÄ£¿é¿ÉÒÔ¿´×öNginxÕæÕýµÄÀͶ¯¹¤×÷Õß¡£Í¨³£Ò»¸ölocationÖеÄÖ¸Áî»áÉæ¼°Ò»¸öhandlerÄ£¿éºÍ¶à¸öfilterÄ£¿é£¨µ±È»£¬¶à¸ölocation¿ÉÒÔ¸´ÓÃͬһ¸öÄ£¿é£©¡£handlerÄ£¿é¸ºÔð´¦ÀíÇëÇó£¬Íê³ÉÏìÓ¦ÄÚÈݵÄÉú³É£¬¶øfilterÄ£¿é¶ÔÏìÓ¦ÄÚÈݽøÐд¦Àí¡£
3 NginxÇëÇó´¦Àí
NginxÔÚÆô¶¯Ê±»áÒÔdaemonÐÎʽÔÚºǫ́ÔËÐУ¬²ÉÓÃ¶à½ø³Ì+Òì²½·Ç×èÈûIOʼþÄ£ÐÍÀ´´¦Àí¸÷ÖÖÁ¬½ÓÇëÇó¡£¶à½ø³ÌÄ£ÐͰüÀ¨Ò»¸ömaster½ø³Ì£¬¶à¸öworker½ø³Ì£¬Ò»°ãworker½ø³Ì¸öÊýÊǸù¾Ý·þÎñÆ÷CPUºËÊýÀ´¾ö¶¨µÄ¡£master½ø³Ì¸ºÔð¹ÜÀíNginx±¾ÉíºÍÆäËûworker½ø³Ì¡£ÈçÏÂͼ£º

Master½ø³Ì¸ºÔð¹ÜÀíNginx±¾ÉíºÍÆäËûworker½ø³Ì

Master-Workerģʽ
´ÓÉÏͼÖпÉÒÔºÜÃ÷ÏԵؿ´µ½£¬4¸öworker½ø³ÌµÄ¸¸½ø³Ì¶¼ÊÇmaster½ø³Ì£¬±íÃ÷worker½ø³Ì¶¼ÊÇ´Ó¸¸½ø³Ìfork³öÀ´µÄ£¬²¢ÇÒ¸¸½ø³ÌµÄppidΪ1£¬±íʾÆäΪdaemon½ø³Ì¡£
ÐèҪ˵Ã÷µÄÊÇ£¬ÔÚnginx¶à½ø³ÌÖУ¬Ã¿¸öworker¶¼ÊÇÆ½µÈµÄ£¬Òò´Ëÿ¸ö½ø³Ì´¦ÀíÍⲿÇëÇóµÄ»ú»áÈ¨ÖØ¶¼ÊÇÒ»Öµġ£
Master½ø³ÌµÄ×÷ÓÃÊÇ£¿
¶ÁÈ¡²¢ÑéÖ¤ÅäÖÃÎļþnginx.conf£»¹ÜÀíworker½ø³Ì£»
Worker½ø³ÌµÄ×÷ÓÃÊÇ£¿
ÿһ¸öWorker½ø³Ì¶¼Î¬»¤Ò»¸öỊ̈߳¨±ÜÃâÏß³ÌÇл»£©£¬´¦ÀíÁ¬½ÓºÍÇëÇó£»×¢ÒâWorker½ø³ÌµÄ¸öÊýÓÉÅäÖÃÎļþ¾ö¶¨£¬Ò»°ãºÍCPU¸öÊýÏà¹Ø£¨ÓÐÀûÓÚ½ø³ÌÇл»£©£¬ÅäÖü¸¸ö¾ÍÓм¸¸öWorker½ø³Ì¡£
NginxÈçºÎ×öµ½ÈȲ¿Êð£¿
ËùνÈȲ¿Ê𣬾ÍÊÇÅäÖÃÎļþnginx.confÐ޸ĺ󣬲»ÐèÒªstop Nginx£¬²»ÐèÒªÖжÏÇëÇ󣬾ÍÄÜÈÃÅäÖÃÎļþÉúЧ£¡£¨nginx
-s reload ÖØÐ¼ÓÔØ/nginx -t¼ì²éÅäÖÃ/nginx -s stop£©
ͨ¹ýÉÏÎÄÎÒÃÇÒѾ֪µÀworker½ø³Ì¸ºÔð´¦Àí¾ßÌåµÄÇëÇó£¬ÄÇôÈç¹ûÏë´ïµ½ÈȲ¿ÊðµÄЧ¹û£¬¿ÉÒÔÏëÏó£º
·½°¸Ò»£º
ÐÞ¸ÄÅäÖÃÎļþnginx.confºó£¬Ö÷½ø³Ìmaster¸ºÔðÍÆË͸øwoker½ø³Ì¸üÐÂÅäÖÃÐÅÏ¢£¬woker½ø³ÌÊÕµ½ÐÅÏ¢ºó£¬¸üнø³ÌÄÚ²¿µÄÏß³ÌÐÅÏ¢¡£
·½°¸¶þ£º
ÐÞ¸ÄÅäÖÃÎļþnginx.confºó£¬ÖØÐÂÉú³ÉеÄworker½ø³Ì£¬µ±È»»áÒÔеÄÅäÖýøÐд¦ÀíÇëÇ󣬶øÇÒеÄÇëÇó±ØÐë¶¼½»¸øÐµÄworker½ø³Ì£¬ÖÁÓÚÀϵÄworker½ø³Ì£¬µÈ°ÑÄÇЩÒÔǰµÄÇëÇó´¦ÀíÍê±Ïºó£¬killµô¼´¿É¡£
Nginx²ÉÓõľÍÊÇ·½°¸¶þÀ´´ïµ½ÈȲ¿ÊðµÄ£¡
NginxÈçºÎ×öµ½¸ß²¢·¢ÏµĸßЧ´¦Àí£¿
ÉÏÎÄÒѾÌá¼°NginxµÄworker½ø³Ì¸öÊýÓëCPU°ó¶¨¡¢worker½ø³ÌÄÚ²¿°üº¬Ò»¸öÏ̸߳ßЧ»Ø»·´¦ÀíÇëÇó£¬ÕâµÄÈ·ÓÐÖúÓÚЧÂÊ£¬µ«ÕâÊDz»¹»µÄ¡£
×÷ΪרҵµÄ³ÌÐòÔ±£¬ÎÒÃÇ¿ÉÒÔ¿ªÒ»ÏÂÄÔ¶´£ºBIO/NIO/AIO¡¢Òì²½/ͬ²½¡¢×èÈû/·Ç×èÈû...
Ҫͬʱ´¦ÀíÄÇô¶àµÄÇëÇó£¬ÒªÖªµÀ£¬ÓеÄÇëÇóÐèÒª·¢ÉúIO£¬¿ÉÄÜÐèÒªºÜ³¤Ê±¼ä£¬Èç¹ûµÈ×ÅËü£¬¾Í»áÍÏÂýworkerµÄ´¦ÀíËÙ¶È¡£
Nginx²ÉÓÃÁËLinuxµÄepollÄ£ÐÍ£¬epollÄ£ÐÍ»ùÓÚʼþÇý¶¯»úÖÆ£¬Ëü¿ÉÒÔ¼à¿Ø¶à¸öʼþÊÇ·ñ×¼±¸Íê±Ï£¬Èç¹ûOK£¬ÄÇô·ÅÈëepoll¶ÓÁÐÖУ¬Õâ¸ö¹ý³ÌÊÇÒì²½µÄ¡£workerÖ»ÐèÒª´Óepoll¶ÓÁÐÑ»·´¦Àí¼´¿É¡£
Nginx¹ÒÁËÔõô°ì£¿
Nginx¼ÈÈ»×÷ΪÈë¿ÚÍø¹Ø£¬ºÜÖØÒª£¬Èç¹û³öÏÖµ¥µãÎÊÌ⣬ÏÔÈ»ÊDz»¿É½ÓÊܵġ£
´ð°¸ÊÇ£ºKeepalived+NginxʵÏָ߿ÉÓá£
KeepalivedÊÇÒ»¸ö¸ß¿ÉÓýâ¾ö·½°¸£¬Ö÷ÒªÊÇÓÃÀ´·ÀÖ¹·þÎñÆ÷µ¥µã·¢Éú¹ÊÕÏ£¬¿ÉÒÔͨ¹ýºÍNginxÅäºÏÀ´ÊµÏÖWeb·þÎñµÄ¸ß¿ÉÓᣣ¨Æäʵ£¬Keepalived²»½ö½ö¿ÉÒÔºÍNginxÅäºÏ£¬»¹¿ÉÒԺͺܶàÆäËû·þÎñÅäºÏ£©
Keepalived+NginxʵÏָ߿ÉÓõÄ˼·£º
µÚÒ»£ºÇëÇó²»ÒªÖ±½Ó´òµ½NginxÉÏ£¬Ó¦¸ÃÏÈͨ¹ýKeepalived£¨Õâ¾ÍÊÇËùνÐéÄâIP£¬VIP£©
µÚ¶þ£ºKeepalivedÓ¦¸ÃÄÜ¼à¿ØNginxµÄÉúÃü״̬£¨Ìṩһ¸öÓû§×Ô¶¨ÒåµÄ½Å±¾£¬¶¨ÆÚ¼ì²éNginx½ø³Ì״̬£¬½øÐÐÈ¨ÖØ±ä»¯,£¬´Ó¶øÊµÏÖNginx¹ÊÕÏÇл»£©

Keepalived+Nginx
Nginx¼Ü¹¹¼°¹¤×÷Á÷³Ìͼ£º

Nginx¼Ü¹¹¼°¹¤×÷Á÷³Ìͼ
NginxÕæÕý´¦ÀíÇëÇóÒµÎñµÄÊÇWorker֮ϵÄÏ̡߳£worker½ø³ÌÖÐÓÐÒ»¸öngx_worker_process_cycle()º¯Êý£¬Ö´ÐÐÎÞÏÞÑ»·£¬²»¶Ï´¦ÀíÊÕµ½µÄÀ´×Ô¿Í»§¶ËµÄÇëÇ󣬲¢½øÐд¦Àí£¬Ö±µ½Õû¸öNginx·þÎñ±»Í£Ö¹¡£
worker ½ø³ÌÖУ¬ngx_worker_process_cycle()º¯Êý¾ÍÊÇÕâ¸öÎÞÏÞÑ»·µÄ´¦Àíº¯Êý¡£ÔÚÕâ¸öº¯ÊýÖУ¬Ò»¸öÇëÇóµÄ¼òµ¥´¦ÀíÁ÷³ÌÈçÏ£º
²Ù×÷ϵͳÌṩµÄ»úÖÆ£¨ÀýÈç epoll, kqueue µÈ£©²úÉúÏà¹ØµÄʼþ¡£
½ÓÊպʹ¦ÀíÕâЩʼþ£¬ÈçÊǽÓÊÕµ½Êý¾Ý£¬Ôò²úÉú¸ü¸ß²ãµÄ request ¶ÔÏó¡£
´¦Àí request µÄ header ºÍ body¡£
²úÉúÏìÓ¦£¬²¢·¢Ëͻؿͻ§¶Ë¡£
Íê³É request µÄ´¦Àí¡£
ÖØÐ³õʼ»¯¶¨Ê±Æ÷¼°ÆäËûʼþ¡£
3.1 ¶à½ø³Ì´¦ÀíÄ£ÐÍ
ÏÂÃæÀ´½éÉÜÒ»¸öÇëÇó½øÀ´£¬¶à½ø³ÌÄ£Ð͵Ĵ¦Àí·½Ê½£º
Ê×ÏÈ£¬master½ø³ÌÒ»¿ªÊ¼¾Í»á¸ù¾ÝÎÒÃǵÄÅäÖã¬À´½¨Á¢ÐèÒªlistenµÄÍøÂçsocket fd£¬È»ºófork³ö¶à¸öworker½ø³Ì¡£
Æä´Î£¬¸ù¾Ý½ø³ÌµÄÌØÐÔ£¬Ð½¨Á¢µÄworker½ø³Ì£¬Ò²»áºÍmaster½ø³ÌÒ»Ñù£¬¾ßÓÐÏàͬµÄÉèÖá£Òò´Ë£¬ÆäÒ²»áÈ¥¼àÌýÏàͬip¶Ë¿ÚµÄÌ×½Ó×Ösocket
fd¡£
È»ºó£¬Õâ¸öʱºòÓжà¸öworker½ø³Ì¶¼ÔÚ¼àÌýͬÑùÉèÖõÄsocket fd£¬Òâζ×ŵ±ÓÐÒ»¸öÇëÇó½øÀ´µÄʱºò£¬ËùÓеÄworker¶¼»á¸ÐÖªµ½¡£ÕâÑù¾Í»á²úÉúËùνµÄ¡°¾ªÈºÏÖÏ󡱡£ÎªÁ˱£Ö¤Ö»»áÓÐÒ»¸ö½ø³Ì³É¹¦×¢²áµ½listenfdµÄ¶Áʼþ£¬nginxÖÐʵÏÖÁËÒ»¸ö¡°accept_mutex¡±ÀàËÆ»¥³âËø£¬Ö»ÓлñÈ¡µ½Õâ¸öËøµÄ½ø³Ì£¬²Å¿ÉÒÔÈ¥×¢²á¶Áʼþ¡£ÆäËû½ø³ÌÈ«²¿accept
ʧ°Ü¡£
×îºó£¬¼àÌý³É¹¦µÄworker½ø³Ì£¬¶ÁÈ¡ÇëÇ󣬽âÎö´¦Àí£¬ÏìÓ¦Êý¾Ý·µ»Ø¸ø¿Í»§¶Ë£¬¶Ï¿ªÁ¬½Ó£¬½áÊø¡£Òò´Ë£¬Ò»¸örequestÇëÇó£¬Ö»ÐèÒªworker½ø³Ì¾Í¿ÉÒÔÍê³É¡£
½ø³ÌÄ£Ð͵Ĵ¦Àí·½Ê½´øÀ´µÄһЩºÃ´¦¾ÍÊÇ£º½ø³ÌÖ®¼äÊǶÀÁ¢µÄ£¬Ò²¾ÍÊÇÒ»¸öworker½ø³Ì³öÏÖÒì³£Í˳ö£¬ÆäËûworker½ø³ÌÊDz»»áÊܵ½Ó°ÏìµÄ£»´ËÍ⣬¶ÀÁ¢½ø³ÌÒ²»á±ÜÃâһЩ²»ÐèÒªµÄËø²Ù×÷£¬ÕâÑù×Ó»áÌá¸ß´¦ÀíЧÂÊ£¬²¢ÇÒ¿ª·¢µ÷ÊÔÒ²¸üÈÝÒס£
ÈçǰÎÄËùÊö£¬¶à½ø³ÌÄ£ÐÍ+Òì²½·Ç×èÈûÄ£ÐͲÅÊÇʤ³öµÄ·½°¸¡£µ¥´¿µÄ¶à½ø³ÌÄ£ÐͻᵼÖÂÁ¬½Ó²¢·¢ÊýÁ¿µÄ½µµÍ£¬¶ø²ÉÓÃÒì²½·Ç×èÈûIOÄ£ÐͺܺõĽâ¾öÁËÕâ¸öÎÊÌ⣻²¢ÇÒ»¹Òò´Ë±ÜÃâµÄ¶àÏ̵߳ÄÉÏÏÂÎÄÇл»µ¼ÖµÄÐÔÄÜËðʧ¡£
worker½ø³Ì»á¾ºÕù¼àÌý¿Í»§¶ËµÄÁ¬½ÓÇëÇó£ºÕâÖÖ·½Ê½¿ÉÄÜ»á´øÀ´Ò»¸öÎÊÌ⣬¾ÍÊÇ¿ÉÄÜËùÓеÄÇëÇó¶¼±»Ò»¸öworker½ø³Ì¸ø¾ºÕù»ñÈ¡ÁË£¬µ¼ÖÂÆäËû½ø³Ì¶¼±È½Ï¿ÕÏУ¬¶øÄ³Ò»¸ö½ø³Ì»á´¦ÓÚæµµÄ״̬£¬ÕâÖÖ״̬¿ÉÄÜ»¹»áµ¼ÖÂÎÞ·¨¼°Ê±ÏìÓ¦Á¬½Ó¶ø¶ªÆúdiscardµô±¾ÓÐÄÜÁ¦´¦ÀíµÄÇëÇó¡£ÕâÖÖ²»¹«Æ½µÄÏÖÏó£¬ÊÇÐèÒª±ÜÃâµÄ£¬ÓÈÆäÊÇÔڸ߿ɿ¿web·þÎñÆ÷»·¾³Ï¡£
Õë¶ÔÕâÖÖÏÖÏó£¬Nginx²ÉÓÃÁËÒ»¸öÊÇ·ñ´ò¿ªaccept_mutexÑ¡ÏîµÄÖµ£¬ngx_accept_disabled±êʶ¿ØÖÆÒ»¸öworker½ø³ÌÊÇ·ñÐèҪȥ¾ºÕù»ñÈ¡accept_mutexÑ¡Ï½ø¶ø»ñÈ¡acceptʼþ¡£
ngx_accept_disabledÖµ£ºnginxµ¥½ø³ÌµÄËùÓÐÁ¬½Ó×ÜÊýµÄ°Ë·ÖÖ®Ò»£¬¼õȥʣϵĿÕÏÐÁ¬½ÓÊýÁ¿£¬µÃµ½µÄÕâ¸öngx_accept_disabled¡£
µ±ngx_accept_disabled´óÓÚ0ʱ£¬²»»áÈ¥³¢ÊÔ»ñÈ¡accept_mutexËø£¬²¢ÇÒ½«ngx_accept_disabled¼õ1£¬ÓÚÊÇ£¬Ã¿´ÎÖ´Ðе½´Ë´¦Ê±£¬¶¼»áÈ¥¼õ1£¬Ö±µ½Ð¡ÓÚ0¡£²»È¥»ñÈ¡accept_mutexËø£¬¾ÍÊǵÈÓÚÈóö»ñÈ¡Á¬½ÓµÄ»ú»á£¬ºÜÏÔÈ»¿ÉÒÔ¿´³ö£¬µ±¿ÕÏÐÁ¬½ÓÔ½ÉÙʱ£¬ngx_accept_disableÔ½´ó£¬ÓÚÊÇÈóöµÄ»ú»á¾ÍÔ½¶à£¬ÕâÑùÆäËü½ø³Ì»ñÈ¡ËøµÄ»ú»áÒ²¾ÍÔ½´ó¡£²»È¥accept£¬×Ô¼ºµÄÁ¬½Ó¾Í¿ØÖÆÏÂÀ´ÁË£¬ÆäËü½ø³ÌµÄÁ¬½Ó³Ø¾Í»áµÃµ½ÀûÓã¬ÕâÑù£¬nginx¾Í¿ØÖÆÁË¶à½ø³Ì¼äÁ¬½ÓµÄƽºâÁË¡£
3.2 Ò»¸ö¼òµ¥µÄHTTPÇëÇó
´Ó Nginx µÄÄÚ²¿À´¿´£¬Ò»¸ö HTTP Request µÄ´¦Àí¹ý³ÌÉæ¼°µ½ÒÔϼ¸¸ö½×¶Î£º
³õʼ»¯ HTTP Request£¨¶ÁÈ¡À´×Ô¿Í»§¶ËµÄÊý¾Ý£¬Éú³É HTTP Request ¶ÔÏ󣬸öÔÏóº¬ÓиÃÇëÇóËùÓеÄÐÅÏ¢£©¡£
´¦ÀíÇëÇóÍ·¡£
´¦ÀíÇëÇóÌå¡£
Èç¹ûÓеϰ£¬µ÷ÓÃÓë´ËÇëÇó£¨URL »òÕß Location£©¹ØÁªµÄ handler¡£
ÒÀ´Îµ÷Óø÷ phase handler ½øÐд¦Àí¡£
ÔÚ½¨Á¢Á¬½Ó¹ý³ÌÖУ¬¶ÔÓÚnginx¼àÌýµ½µÄÿ¸ö¿Í»§¶ËÁ¬½Ó£¬¶¼»á½«ËüµÄ¶ÁʼþµÄhandlerÉèÖÃΪngx_http_init_requestº¯Êý£¬Õâ¸öº¯Êý¾ÍÊÇÇëÇó´¦ÀíµÄÈë¿Ú¡£ÔÚ´¦ÀíÇëÇóʱ£¬Ö÷Òª¾ÍÊÇÒª½âÎöhttpÇëÇ󣬱ÈÈ磺uri£¬ÇëÇóÐеȣ¬È»ºóÔÙ¸ù¾ÝÇëÇóÉú³ÉÏìÓ¦¡£ÏÂÃæ¿´Ò»ÏÂnginx´¦ÀíµÄ¾ßÌå¹ý³Ì£º

Nginx´¦ÀíµÄ¾ßÌå¹ý³Ì
ÔÚÕâÀÎÒÃÇÐèÒªÁ˽âһϠphase handler Õâ¸ö¸ÅÄî¡£phase ×ÖÃæµÄÒâ˼£¬¾ÍÊǽ׶Ρ£ËùÒÔ
phase handlers Ò²¾ÍºÃÀí½âÁË£¬¾ÍÊǰüº¬Èô¸É¸ö´¦Àí½×¶ÎµÄһЩ handler¡£
ÔÚÿһ¸ö½×¶Î£¬°üº¬ÓÐÈô¸É¸ö handler£¬ÔÙ´¦Àíµ½Ä³¸ö½×¶ÎµÄʱºò£¬ÒÀ´Îµ÷ÓÃ¸Ã½×¶ÎµÄ handler
¶Ô HTTP Request ½øÐд¦Àí¡£
ͨ³£Çé¿öÏ£¬Ò»¸ö phase handler ¶ÔÕâ¸ö request ½øÐд¦Àí£¬²¢²úÉúһЩÊä³ö¡£Í¨³£
phase handler ÊÇÓ붨ÒåÔÚÅäÖÃÎļþÖеÄij¸ö location Ïà¹ØÁªµÄ¡£
Ò»¸ö phase handler ͨ³£Ö´ÐÐÒÔϼ¸ÏîÈÎÎñ£º
»ñÈ¡ location ÅäÖá£
²úÉúÊʵ±µÄÏìÓ¦¡£
·¢ËÍ response header¡£
·¢ËÍ response body¡£
µ± Nginx ¶ÁÈ¡µ½Ò»¸ö HTTP Request µÄ header µÄʱºò£¬Nginx Ê×ÏȲéÕÒÓëÕâ¸öÇëÇó¹ØÁªµÄÐéÄâÖ÷»úµÄÅäÖá£Èç¹ûÕÒµ½ÁËÕâ¸öÐéÄâÖ÷»úµÄÅäÖã¬ÄÇôͨ³£Çé¿öÏ£¬Õâ¸ö
HTTP Request ½«»á¾¹ýÒÔϼ¸¸ö½×¶ÎµÄ´¦Àí£¨phase handlers£©£º
NGX_HTTP_POST_READ_PHASE: ¶ÁÈ¡ÇëÇóÄÚÈݽ׶Î
NGX_HTTP_SERVER_REWRITE_PHASE: Server ÇëÇóµØÖ·ÖØÐ´½×¶Î
NGX_HTTP_FIND_CONFIG_PHASE: ÅäÖòéÕÒ½×¶Î
NGX_HTTP_REWRITE_PHASE: LocationÇëÇóµØÖ·ÖØÐ´½×¶Î
NGX_HTTP_POST_REWRITE_PHASE: ÇëÇóµØÖ·ÖØÐ´Ìá½»½×¶Î
NGX_HTTP_PREACCESS_PHASE: ·ÃÎÊȨÏÞ¼ì²é×¼±¸½×¶Î
NGX_HTTP_ACCESS_PHASE: ·ÃÎÊȨÏÞ¼ì²é½×¶Î
NGX_HTTP_POST_ACCESS_PHASE: ·ÃÎÊȨÏÞ¼ì²éÌá½»½×¶Î
NGX_HTTP_TRY_FILES_PHASE: ÅäÖÃÏî try_files ´¦Àí½×¶Î
NGX_HTTP_CONTENT_PHASE: ÄÚÈݲúÉú½×¶Î
NGX_HTTP_LOG_PHASE: ÈÕ־ģ¿é´¦Àí½×¶Î
ÔÚÄÚÈݲúÉú½×¶Î£¬ÎªÁ˸øÒ»¸ö request ²úÉúÕýÈ·µÄÏìÓ¦£¬Nginx ±ØÐë°ÑÕâ¸ö request
½»¸øÒ»¸öºÏÊ浀 content handler È¥´¦Àí¡£Èç¹ûÕâ¸ö request ¶ÔÓ¦µÄ location
ÔÚÅäÖÃÎļþÖб»Ã÷È·Ö¸¶¨ÁËÒ»¸ö content handler£¬ÄÇôNginx ¾Í¿ÉÒÔͨ¹ý¶Ô location
µÄÆ¥Å䣬ֱ½ÓÕÒµ½Õâ¸ö¶ÔÓ¦µÄ handler£¬²¢°ÑÕâ¸ö request ½»¸øÕâ¸ö content handler
È¥´¦Àí¡£ÕâÑùµÄÅäÖÃÖ¸Áî°üÀ¨Ïñ£¬perl£¬flv£¬proxy_pass£¬mp4µÈ¡£
Èç¹ûÒ»¸ö request ¶ÔÓ¦µÄ location ²¢Ã»ÓÐÖ±½ÓÓÐÅäÖÃµÄ content handler£¬ÄÇô
Nginx ÒÀ´Î³¢ÊÔ£º
Èç¹ûÒ»¸ö location ÀïÃæÓÐÅäÖà random_index on£¬ÄÇÃ´Ëæ»úÑ¡ÔñÒ»¸öÎļþ£¬·¢Ë͸ø¿Í»§¶Ë¡£
Èç¹ûÒ»¸ö location ÀïÃæÓÐÅäÖà index Ö¸ÁÄÇô·¢ËÍ index Ö¸ÁîÖ¸Ã÷µÄÎļþ£¬¸ø¿Í»§¶Ë¡£
Èç¹ûÒ»¸ö location ÀïÃæÓÐÅäÖà autoindex on£¬ÄÇô¾Í·¢ËÍÇëÇóµØÖ·¶ÔÓ¦µÄ·þÎñ¶Ë·¾¶ÏµÄÎļþÁÐ±í¸ø¿Í»§¶Ë¡£
Èç¹ûÕâ¸ö request ¶ÔÓ¦µÄ location ÉÏÓÐÉèÖà gzip_static on£¬ÄÇô¾Í²éÕÒÊÇ·ñÓжÔÓ¦µÄ.gzÎļþ´æÔÚ£¬Óеϰ£¬¾Í·¢ËÍÕâ¸ö¸ø¿Í»§¶Ë£¨¿Í»§¶ËÖ§³Ö
gzip µÄÇé¿öÏ£©¡£
ÇëÇóµÄ URI Èç¹û¶ÔÓ¦Ò»¸ö¾²Ì¬Îļþ£¬static module ¾Í·¢Ë;²Ì¬ÎļþµÄÄÚÈݵ½¿Í»§¶Ë¡£
ÄÚÈݲúÉú½×¶ÎÍê³ÉÒÔºó£¬Éú³ÉµÄÊä³ö»á±»´«µÝµ½ filter Ä£¿éÈ¥½øÐд¦Àí¡£filter Ä£¿éÒ²ÊÇÓë
location Ïà¹ØµÄ¡£ËùÓÐµÄ filter Ä£¿é¶¼±»×éÖ¯³ÉÒ»ÌõÁ´¡£Êä³ö»áÒÀ´Î´©Ô½ËùÓÐµÄ filter£¬Ö±µ½ÓÐÒ»¸ö
filter Ä£¿éµÄ·µ»ØÖµ±íÃ÷ÒѾ´¦ÀíÍê³É¡£
ÕâÀïÁоټ¸¸ö³£¼ûµÄ filter Ä£¿é£¬ÀýÈ磺
server-side includes¡£
XSLT filtering¡£
ͼÏñËõ·ÅÖ®ÀàµÄ¡£
gzip ѹËõ¡£
ÔÚËùÓÐµÄ filter ÖУ¬Óм¸¸ö filter Ä£¿éÐèÒª¹Ø×¢Ò»Ï¡£°´ÕÕµ÷ÓõÄ˳ÐòÒÀ´Î˵Ã÷ÈçÏ£º
copy: ½«Ò»Ð©ÐèÒª¸´ÖÆµÄ buf(Îļþ»òÕßÄÚ´æ)ÖØÐ¸´ÖÆÒ»·ÝÈ»ºó½»¸øÊ£ÓàµÄ body filter
´¦Àí¡£
postpone: Õâ¸ö filter ÊǸºÔð subrequest µÄ£¬Ò²¾ÍÊÇ×ÓÇëÇóµÄ¡£
write: дÊä³öµ½¿Í»§¶Ë£¬Êµ¼ÊÉÏÊÇдµ½Á¬½Ó¶ÔÓ¦µÄ socket ÉÏ¡£
3.3 ÇëÇóÍêÕû´¦Àí¹ý³Ì
¸ù¾ÝÒÔÉÏÇëÇó²½ÖèËùÊö£¬ÇëÇóÍêÕûµÄ´¦Àí¹ý³ÌÈçÏÂͼËùʾ£º

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