`

深入浅出Nginx之工作原理

阅读更多

nginx被称为高性能web server,是与其架构和工作原理分不开的

 

nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各个worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu 核数一致。

 

nginx默认是单进程(master进程)提供服务的,运营环境下按照master-worker方式配置同时启动多个进程的好处主要是:

 

1、由于master进程不会对用户请求提供服务,只用于管理真正提供服务的worker进程,所以master进程可以是唯一的,它仅专注于自己的纯管理工作,为管理员提供命令行服务,包括诸如启动服务、停止服务、重载配置文件、平滑升级程序等。master进程需要拥有较大的权限,例如,通常会利用root用户启动master进程。worker进程的权限要小于或等于master进程,这样master进程才可以完全地管理worker进程。当任意一个worker进程出现错误从而导致coredump时,master进程会立刻启动新的worker进程继续服务。

 

2、多个worker进程处理互联网请求不但可以提高服务的健壮性(一个worker进程出错后,其他worker进程仍然可以正常提供服务),最重要的是,这样可以充分利用现在常见的SMP多核架构,从而实现微观上真正的多核并发处理。因此,用一个进程(master进程)来处理互联网请求肯定是不合适的。

 

worker进程的个数设置与机器cpu核数一致的原因大致有两点:

 

一是nginx一般只做高并发代理,基本没用IO操作,算是CPU密集操作,所以在处理时基本是瞬时完成的,很少出现IO阻塞;二是进程与CPU调度的关系,单个核心处理多个进程的时候,是排队处理的,所以将Worker进程个数设置超过cpu核数是没有太大意义的。

 

worker进程是如何处理http请求的呢?

 

首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex(共享锁),抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这就是一个完整的请求了,并且一个请求完全由worker进程来处理,而且只在一个worker进程中处理。采用这种方式的好处是:

 

1、节省锁带来的开销 。对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查上时,也会方便很多。

 

2、独立进程,减少风险 。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断, master进程则很快重新启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

 

nginx的事件处理机制,采用异步非阻塞事件处理机制,一个worker进程只有一个主线程,通过异步非阻塞的事件处理机制,实现了循环处理多个准备好的事件,从而实现轻量级和高并发。

 

异步非阻塞事件处理机制:

 

同步和异步的概念,这两个概念与消息的通知机制有关。同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者。

 

阻塞和非阻塞,这两个概念与程序等待消息(无所谓同步或者异步)时的状态有关。

 

当读写事件没有准备好时,就放入epoll里面。如果有事件准备好了,那么就去处理;如果事件返回的是EAGAIN,那么继续将其放入epoll里 面。从而,只要有事件准备好了,我们就去处理,只有当所有时间都没有准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件。

 

与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。更多的并发数,只是会占用更多的内存而已。

 

 参考原文  http://hzcsky.blog.51cto.com/1560073/1533354

分享到:
评论

相关推荐

    深入浅出Nginx之二【基本配置】

    NULL 博文链接:https://hello-nick-xu.iteye.com/blog/2089724

    Nginx 反向代理工作原理简介与配置详解 - 李雄

    Nginx 反向代理工作原理简介与配置详解 - 李雄 本资料共包含以下附件: Nginx 反向代理工作原理简介与配置详解 - 李雄.pdf

    Nginx反向代理工作原理简介与配置详解-李雄

    Nginx反向代理工作原理简介与配置详解-李雄。

    深入理解Nginx

    接着,综合Nginx框架代码分析了Nginx架构的设计理念和技巧,此外,还新增了如何在模块中支持HTTP变量,以及与slab共享内存等相关的内容,相信通过完善,可进一步帮助读者更好地开发出功能丰富、性能—流的Nginx模块...

    深入剖析Nginx

    《深入剖析Nginx》重点在于通过剖析Nginx的源代码,探究其功能结构及其内部实现原理。全书共14章和3个附录。首先介绍了开始剖析Nginx源代码前的准备工作,以及跟踪和调试的方法;然后,分别深入分析了Nginx的进程...

    深入理解Nginx-配置nginx

    nginx详细介绍。原理剖析

    nginx高并发原理

    如何设计高并发网站?nginx高并发原理以及nginx vs Apache.

    深入理解Nginx模块开发与架构解析.pdf

     在第三部分,将开始介绍Nginx的完整框架,阅读到这里时将会了解第二部分中HTTP模块为何以此种方式开发,同时将可以轻易地开发出Nginx模块。这一部分并不仅仅满足于阐述Nginx架构,而是会探讨其为何如此设计,只有...

    nginx原理介绍与配置

    nginx详尽和全面的介绍 包括原理阐述和配置。

    Nginx组成及工作原理.pdf

    Nginx组成及工作原理.pdfNginx组成及工作原理.pdfNginx组成及工作原理.pdfNginx组成及工作原理.pdfNginx组成及工作原理.pdfNginx组成及工作原理.pdfNginx组成及工作原理.pdfNginx组成及工作原理.pdfNginx组成及工作...

    Nginx组成及工作原理.ppt

    Nginx组成及工作原理.pptNginx组成及工作原理.pptNginx组成及工作原理.pptNginx组成及工作原理.pptNginx组成及工作原理.pptNginx组成及工作原理.pptNginx组成及工作原理.pptNginx组成及工作原理.pptNginx组成及工作...

    nginx实现原理及pic架构

    nginx实现原理及pic架构感悟,多进程高效图片处理

    深入理解nginx part6

    深入理解nginx part6

    深入理解nginx

    本文适合系统架构师和高级工程师阅读,深入掌握nginx!掌握其原理

    详解Nginx 工作原理

    Nginx工作原理 Nginx由内核和模块组成。  Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块...

    nginx高性能web服务器详解

    同时也深入剖析了Nginx服务器的工作原理和实现技术,对其中使用到的数据结构和方法进行了详细阐述,并且结合实际的应用情况给出了多个基于Nginx服务器,同时还部署有其他典型服务器的分布式网站架构部署配置。...

    深入理解Nginx 模块开发与架构解析

    nginx作为一款开源的轻量级高性能web服务器,是非常值得立志从事服务端开发方向的人学习的。...这里先推荐两本有关nginx的书籍:《深入理解Nginx》、《深入剖析Nginx》,后者已经绝版了,可以去网上找pdf阅读

    深入理解Nginx模块开发与架构解析第2版.pdf

    深入理解Nginx模块开发与架构解析第2版LinuxUnix技术丛书

    深入理解nginx part3

    深入理解nginx part3

Global site tag (gtag.js) - Google Analytics