?Nginx µÄ½ø³ÌÄ£ÐÍ
Nginx ·þÎñÆ÷£¬Õý³£ÔËÐйý³ÌÖУº
- ¶à½ø³Ì£ºÒ»¸ö Master ½ø³Ì¡¢¶à¸ö Worker ½ø³Ì
- Master ½ø³Ì£º¹ÜÀí Worker ½ø³Ì
- ¶ÔÍâ½Ó¿Ú£º½ÓÊÕÍⲿµÄ²Ù×÷£¨Ðźţ©
- ¶ÔÄÚת·¢£º¸ù¾ÝÍⲿµÄ²Ù×÷µÄ²»Í¬£¬Í¨¹ýÐźŹÜÀí Worker
- ¼à¿Ø£º¼à¿Ø worker ½ø³ÌµÄÔËÐÐ״̬£¬worker ½ø³ÌÒì³£ÖÕÖ¹ºó£¬×Ô¶¯ÖØÆô worker ½ø³Ì
- Worker ½ø³Ì£ºËùÓÐ Worker ½ø³Ì¶¼ÊÇƽµÈµÄ
- ʵ¼Ê´¦Àí£ºÍøÂçÇëÇó£¬ÓÉ Worker ½ø³Ì´¦Àí£»
- Worker ½ø³ÌÊýÁ¿£ºÔÚ nginx.conf ÖÐÅäÖã¬Ò»°ãÉèÖÃΪºËÐÄÊý£¬³ä·ÖÀûÓà CPU ×ÊÔ´£¬Í¬Ê±£¬±ÜÃâ½ø³ÌÊýÁ¿¹ý¶à£¬±ÜÃâ½ø³Ì¾ºÕù CPU ×ÊÔ´£¬Ôö¼ÓÉÏÏÂÎÄÇл»µÄËðºÄ¡£
˼¿¼£º
- ÇëÇóÊÇÁ¬½Óµ½ Nginx£¬Master ½ø³Ì¸ºÔð´¦ÀíºÍת·¢£¿
- ÈçºÎÑ¡¶¨Äĸö Worker ½ø³Ì´¦ÀíÇëÇó£¿ÇëÇóµÄ´¦Àí½á¹û£¬ÊÇ·ñ»¹Òª¾¹ý Master ½ø³Ì£¿
HTTP Á¬½Ó½¨Á¢ºÍÇëÇó´¦Àí¹ý³Ì
- Nginx Æô¶¯Ê±£¬Master ½ø³Ì£¬¼ÓÔØÅäÖÃÎļþ
- Master ½ø³Ì£¬³õʼ»¯¼àÌýµÄ socket
- Master ½ø³Ì£¬fork ³ö¶à¸ö Worker ½ø³Ì
- Worker ½ø³Ì£¬¾ºÕùеÄÁ¬½Ó£¬»ñʤ·½Í¨¹ýÈý´ÎÎÕÊÖ£¬½¨Á¢ Socket Á¬½Ó£¬²¢´¦ÀíÇëÇó
Nginx ¸ßÐÔÄÜ¡¢¸ß²¢·¢
- Nginx ²ÉÓ㺶à½ø³Ì + Òì²½·Ç×èÈû·½Ê½£¨IO ¶à·¸´Óà epoll£©
- ÇëÇóµÄÍêÕû¹ý³Ì£º
- ½¨Á¢Á¬½Ó
- ¶ÁÈ¡ÇëÇ󣺽âÎöÇëÇó
- ´¦ÀíÇëÇó
- ÏìÓ¦ÇëÇó
- ÇëÇóµÄÍêÕû¹ý³Ì£¬¶ÔÓ¦µ½µ×²ã£¬¾ÍÊÇ£º¶Áд socket ʼþ
Nginx µÄʼþ´¦ÀíÄ£ÐÍ
request£ºNginx ÖÐ http ÇëÇó¡£
»ù±¾µÄ HTTP Web Server ¹¤×÷ģʽ£º
- ½ÓÊÕÇëÇó£ºÖðÐжÁÈ¡ÇëÇóÐкÍÇëÇóÍ·£¬Åж϶ÎÓÐÇëÇóÌåºó£¬¶ÁÈ¡ÇëÇóÌå
- ´¦ÀíÇëÇó
- ·µ»ØÏìÓ¦£º¸ù¾Ý´¦Àí½á¹û£¬Éú³ÉÏàÓ¦µÄ HTTP ÇëÇó£¨ÏìÓ¦ÐС¢ÏìӦͷ¡¢ÏìÓ¦Ì壩
Nginx Ò²ÊÇÕâ¸öÌ×·£¬ÕûÌåÁ÷³ÌÒ»Ö¡£
Ä£¿é»¯Ìåϵ½á¹¹
nginxµÄÄ£¿é¸ù¾ÝÆ书ÄÜ»ù±¾ÉÏ¿ÉÒÔ·ÖΪÒÔϼ¸ÖÖÀàÐÍ£º
- event module: ´î½¨Á˶ÀÁ¢ÓÚ²Ù×÷ϵͳµÄʼþ´¦Àí»úÖƵĿò¼Ü£¬¼°ÌṩÁ˸÷¾ßÌåʼþµÄ´¦Àí¡£°üÀ¨ngx_events_module£¬ ngx_event_core_moduleºÍngx_epoll_moduleµÈ¡£nginx¾ßÌåʹÓúÎÖÖʼþ´¦ÀíÄ£¿é£¬ÕâÒÀÀµÓÚ¾ßÌåµÄ²Ù×÷ϵͳºÍ±àÒëÑ¡Ïî¡£
- phase handler: ´ËÀàÐ͵ÄÄ£¿éÒ²±»Ö±½Ó³ÆΪhandlerÄ£¿é¡£Ö÷Òª¸ºÔð´¦Àí¿Í»§¶ËÇëÇó²¢²úÉú´ýÏìÓ¦ÄÚÈÝ£¬±ÈÈçngx_http_static_moduleÄ£¿é£¬¸ºÔð¿Í»§¶ËµÄ¾²Ì¬Ò³ÃæÇëÇó´¦Àí²¢½«¶ÔÓ¦µÄ´ÅÅÌÎļþ×¼±¸ÎªÏìÓ¦ÄÚÈÝÊä³ö¡£
- output filter: Ò²³ÆΪfilterÄ£¿é£¬Ö÷ÒªÊǸºÔð¶ÔÊä³öµÄÄÚÈݽøÐд¦Àí£¬¿ÉÒÔ¶ÔÊä³ö½øÐÐÐ޸ġ£ÀýÈ磬¿ÉÒÔʵÏÖ¶ÔÊä³öµÄËùÓÐhtmlÒ³ÃæÔö¼ÓÔ¤¶¨ÒåµÄfootbarÒ»ÀàµÄ¹¤×÷£¬»òÕ߶ÔÊä³öµÄͼƬµÄURL½øÐÐÌæ»»Ö®ÀàµÄ¹¤×÷¡£
- upstream: upstreamÄ£¿éʵÏÖ·´Ïò´úÀíµÄ¹¦ÄÜ£¬½«ÕæÕýµÄÇëÇóת·¢µ½ºó¶Ë·þÎñÆ÷ÉÏ£¬²¢´Óºó¶Ë·þÎñÆ÷É϶ÁÈ¡ÏìÓ¦£¬·¢»Ø¿Í»§¶Ë¡£upstreamÄ£¿éÊÇÒ»ÖÖÌØÊâµÄhandler£¬Ö»²»¹ýÏìÓ¦ÄÚÈݲ»ÊÇÕæÕýÓÉ×Ô¼º²úÉúµÄ£¬¶øÊÇ´Óºó¶Ë·þÎñÆ÷É϶ÁÈ¡µÄ¡£
- load-balancer: ¸ºÔؾùºâÄ£¿é£¬ÊµÏÖÌض¨µÄËã·¨£¬ÔÚÖÚ¶àµÄºó¶Ë·þÎñÆ÷ÖУ¬Ñ¡ÔñÒ»¸ö·þÎñÆ÷³öÀ´×÷Ϊij¸öÇëÇóµÄת·¢·þÎñÆ÷¡£
³£¼ûÎÊÌâÆÊÎö
Nginx vs. Apache
ÍøÂç IO Ä£ÐÍ£º
- nginx£ºIO ¶à·¸´Óã¬epoll(freebsd ÉÏÊÇ kqueue )
- ¸ßÐÔÄÜ
- ¸ß²¢·¢
- Õ¼ÓÃϵͳ×ÊÔ´ÉÙ
- apache£º×èÈû + ¶à½ø³Ì/¶àÏß³Ì
- ¸üÎȶ¨£¬bug ÉÙ
- Ä£¿é¸ü·á¸»
³¡¾°£º
´¦Àí¶à¸öÇëÇóʱ£¬¿ÉÒÔ²ÉÓãºIO ¶à·¸´Óà »òÕß ×èÈû IO +¶àÏß³Ì
- IO ¶à··þÓãºÒ»¸ö Ị̈߳¬¸ú×Ù¶à¸ö socket ״̬£¬Äĸö¾ÍÐ÷£¬¾Í¶ÁдÄĸö£»
- ×èÈû IO + ¶àỊ̈߳ºÃ¿Ò»¸öÇëÇó£¬Ð½¨Ò»¸ö·þÎñÏß³Ì
˼¿¼£ºIO ¶à·¸´Óà ºÍ ¶àÏß³Ì µÄÊÊÓó¡¾°£¿
- IO ¶à·¸´Ó㺵¥¸öÁ¬½ÓµÄÇëÇó´¦ÀíËÙ¶ÈûÓÐÓÅÊÆ£¬ÊÊºÏ IO Ãܼ¯ÐÍ ³¡¾°£¬Ê¼þÇý¶¯
- ´ó²¢·¢Á¿£ºÖ»Ê¹ÓÃÒ»¸öỊ̈߳¬´¦Àí´óÁ¿µÄ²¢·¢ÇëÇ󣬽µµÍÉÏÏÂÎÄ»·¾³Çл»ËðºÄ£¬Ò²²»ÐèÒª¿¼ÂDz¢·¢ÎÊÌ⣬Ïà¶Ô¿ÉÒÔ´¦Àí¸ü¶àµÄÇëÇó£»
- ÏûºÄ¸üÉÙµÄϵͳ×ÊÔ´£¨²»ÐèÒªÏ̵߳÷¶È¿ªÏú£©
- ÊÊÓÃÓÚ³¤Á¬½ÓµÄÇé¿ö£¨¶àÏß³Ìģʽ³¤Á¬½ÓÈÝÒ×Ôì³ÉÏ̹߳ý¶à£¬Ôì³ÉƵ·±µ÷¶È£©
- ×èÈûIO + ¶àỊ̈߳ºÊµÏÖ¼òµ¥£¬¿ÉÒÔ²»ÒÀÀµÏµÍ³µ÷Óã¬ÊÊºÏ CPU Ãܼ¯ÐÍ ³¡¾°
- ÿ¸öỊ̈߳¬¶¼ÐèҪʱ¼äºÍ¿Õ¼ä£»
- Ïß³ÌÊýÁ¿Ôö³¤Ê±£¬Ï̵߳÷¶È¿ªÏúÖ¸ÊýÔö³¤
Nginx ×î´óÁ¬½ÓÊý
»ù´¡±³¾°£º
- Nginx ÊǶà½ø³ÌÄ£ÐÍ£¬Worker ½ø³ÌÓÃÓÚ´¦ÀíÇëÇó£»
- µ¥¸ö½ø³ÌµÄÁ¬½ÓÊý£¨ÎļþÃèÊö·û fd£©£¬ÓÐÉÏÏÞ£¨nofile£©£ºulimit -n
- Nginx ÉÏÅäÖõ¥¸ö worker ½ø³ÌµÄ×î´óÁ¬½ÓÊý£ºworker_connections ÉÏÏÞΪ nofile
- Nginx ÉÏÅäÖà worker ½ø³ÌµÄÊýÁ¿£ºworker_processes
Òò´Ë£¬Nginx µÄ×î´óÁ¬½ÓÊý£º
- Nginx µÄ×î´óÁ¬½ÓÊý£ºWorker ½ø³ÌÊýÁ¿ x µ¥¸ö Worker ½ø³ÌµÄ×î´óÁ¬½ÓÊý
- ÉÏÃæÊÇ Nginx ×÷ΪͨÓ÷þÎñÆ÷ʱ£¬×î´óµÄÁ¬½ÓÊý
- Nginx ×÷Ϊ·´Ïò´úÀí·þÎñÆ÷ʱ£¬Äܹ»·þÎñµÄ×î´óÁ¬½ÓÊý£º£¨Worker ½ø³ÌÊýÁ¿ x µ¥¸ö Worker ½ø³ÌµÄ×î´óÁ¬½ÓÊý£©/ 2¡£
- Nginx ·´Ïò´úÀíʱ£¬»á½¨Á¢ Client µÄÁ¬½ÓºÍºó¶Ë Web Server µÄÁ¬½Ó£¬Õ¼Óà 2 ¸öÁ¬½Ó
˼¿¼£º
ÿ´ò¿ªÒ»¸ö socket Õ¼ÓÃÒ»¸ö fd
Ϊʲô£¬Ò»¸ö½ø³ÌÄܹ»´ò¿ªµÄ fd ÊýÁ¿ÓÐÏÞÖÆ£¿
IO Ä£ÐÍ
³¡¾°£º
´¦Àí¶à¸öÇëÇóʱ£¬¿ÉÒÔ²ÉÓãºIO ¶à·¸´Óà »òÕß ×èÈû IO +¶àÏß³Ì
- IO ¶à·¸´ÓãºÒ»¸ö Ị̈߳¬¸ú×Ù¶à¸ö socket ״̬£¬Äĸö¾ÍÐ÷£¬¾Í¶ÁдÄĸö£»
- ×èÈû IO + ¶àỊ̈߳ºÃ¿Ò»¸öÇëÇó£¬Ð½¨Ò»¸ö·þÎñÏß³Ì
˼¿¼£ºIO ¶à·¸´Óà ºÍ ¶àÏß³Ì µÄÊÊÓó¡¾°£¿
- IO ¶à·¸´Ó㺵¥¸öÁ¬½ÓµÄÇëÇó´¦ÀíËÙ¶ÈûÓÐÓÅÊÆ
- ´ó²¢·¢Á¿£ºÖ»Ê¹ÓÃÒ»¸öỊ̈߳¬´¦Àí´óÁ¿µÄ²¢·¢ÇëÇ󣬽µµÍÉÏÏÂÎÄ»·¾³Çл»ËðºÄ£¬Ò²²»ÐèÒª¿¼ÂDz¢·¢ÎÊÌ⣬Ïà¶Ô¿ÉÒÔ´¦Àí¸ü¶àµÄÇëÇó£»
- ÏûºÄ¸üÉÙµÄϵͳ×ÊÔ´£¨²»ÐèÒªÏ̵߳÷¶È¿ªÏú£©
- ÊÊÓÃÓÚ³¤Á¬½ÓµÄÇé¿ö£¨¶àÏß³Ìģʽ³¤Á¬½ÓÈÝÒ×Ôì³ÉÏ̹߳ý¶à£¬Ôì³ÉƵ·±µ÷¶È£©
- ×èÈûIO + ¶àỊ̈߳ºÊµÏÖ¼òµ¥£¬¿ÉÒÔ²»ÒÀÀµÏµÍ³µ÷Óá£
- ÿ¸öỊ̈߳¬¶¼ÐèҪʱ¼äºÍ¿Õ¼ä£»
- Ïß³ÌÊýÁ¿Ôö³¤Ê±£¬Ï̵߳÷¶È¿ªÏúÖ¸ÊýÔö³¤
select/poll ºÍ epoll ±È½Ï
ÏêϸÄÚÈÝ£¬²Î¿¼£º
- select poll epollÈýÕßÖ®¼äµÄ±È½Ï
select/poll ϵͳµ÷Óãº
//?select?ϵͳµ÷ÓÃ??int?select(int?maxfdp,fd_set?*readfds,fd_set?*writefds,fd_set?*errorfds,struct?timeval?*timeout);??//?poll?ϵͳµ÷ÓÃ??int?poll(struct?pollfd?fds[],?nfds_t?nfds,?int?timeout)£»?
select£º
- ²éѯ fd_set ÖУ¬ÊÇ·ñÓоÍÐ÷µÄ fd£¬¿ÉÒÔÉ趨һ¸ö³¬Ê±Ê±¼ä£¬µ±ÓÐ fd (File descripter) ¾ÍÐ÷»ò³¬Ê±·µ»Ø£»
- fd_set ÊÇÒ»¸öλ¼¯ºÏ£¬´óСÊÇÔÚ±àÒëÄÚºËʱµÄ³£Á¿£¬Ä¬ÈÏ´óСΪ 1024
- Ìص㣺
- Á¬½ÓÊýÏÞÖÆ£¬fd_set ¿É±íʾµÄ fd ÊýÁ¿Ì«Ð¡ÁË£»
- ÏßÐÔɨÃ裺ÅÐ¶Ï fd ÊÇ·ñ¾ÍÐ÷£¬ÐèÒª±éÀúÒ»±ß fd_set£»
- Êý¾Ý¸´ÖÆ£ºÓû§¿Õ¼äºÍÄں˿ռ䣬¸´ÖÆÁ¬½Ó¾ÍÐ÷״̬ÐÅÏ¢
poll£º
- ½â¾öÁËÁ¬½ÓÊýÏÞÖÆ£º
- poll Öн« select ÖÐµÄ fd_set Ìæ»»³ÉÁËÒ»¸ö pollfd Êý×é
- ½â¾ö fd ÊýÁ¿¹ýСµÄÎÊÌâ
- Êý¾Ý¸´ÖÆ£ºÓû§¿Õ¼äºÍÄں˿ռ䣬¸´ÖÆÁ¬½Ó¾ÍÐ÷״̬ÐÅÏ¢
- epoll£ºevent ʼþÇý¶¯
epoll£ºevent ʼþÇý¶¯
- ʼþ»úÖÆ£º±ÜÃâÏßÐÔɨÃè
- Ϊÿ¸ö fd£¬×¢²áÒ»¸ö¼àÌýʼþ
- fd ±ä¸üΪ¾ÍÐ÷ʱ£¬½« fd Ìí¼Óµ½¾ÍÐ÷Á´±í
- fd ÊýÁ¿£ºÎÞÏÞÖÆ£¨OS ¼¶±ðµÄÏÞÖÆ£¬µ¥¸ö½ø³ÌÄÜ´ò¿ª¶àÉÙ¸ö fd£©
select£¬poll£¬epoll£º
- I/O¶à·¸´ÓõĻúÖÆ£»
- I/O¶à·¸´ÓþÍͨ¹ýÒ»ÖÖ»úÖÆ£¬¿ÉÒÔ¼àÊÓ¶à¸öÃèÊö·û£¬Ò»µ©Ä³¸öÃèÊö·û¾ÍÐ÷£¨Ò»°ãÊǶÁ¾ÍÐ÷»òÕßд¾ÍÐ÷£©£¬Äܹ»Í¨Öª³ÌÐò½øÐÐÏàÓ¦µÄ¶Áд²Ù×÷¡£
- ¼àÊÓ¶à¸öÎļþÃèÊö·û
- µ«select£¬poll£¬epoll±¾ÖÊÉ϶¼ÊÇͬ²½I/O£º
- Óû§½ø³Ì¸ºÔð¶Áд£¨´ÓÄں˿ռ俽±´µ½Óû§¿Õ¼ä£©£¬¶Áд¹ý³ÌÖУ¬Óû§½ø³ÌÊÇ×èÈûµÄ£»
- Òì²½ IO£¬ÎÞÐèÓû§½ø³Ì¸ºÔð¶Áд£¬Òì²½IO£¬»á¸ºÔð´ÓÄں˿ռ俽±´µ½Óû§¿Õ¼ä£»
Nginx µÄ²¢·¢´¦ÀíÄÜÁ¦
¹ØÓÚ Nginx µÄ²¢·¢´¦ÀíÄÜÁ¦£º
- ²¢·¢Á¬½ÓÊý£¬Ò»°ãÓÅ»¯ºó£¬·åÖµÄܱ£³ÖÔÚ 1~3w ×óÓÒ¡££¨ÄÚ´æºÍ CPU ºËÐÄÊý²»Í¬£¬»áÓнøÒ»²½ÓÅ»¯¿Õ¼ä£©?