Nginx学习笔记(一) Nginx架构

Nginx架构

  Nginx全程是什么? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。html

daemon守护线程

  nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。nginx

  固然nginx也是支持多线程的方式的,只是咱们主流的方式仍是多进程的方式,也是nginx的默认方式。apache

  master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常状况下),会自动从新启动新的worker进程。编程

  worker进程则是处理基本的网络事件。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。服务器

  worker进程的个数是能够设置的,通常咱们会设置与机器cpu核数一致。更多的worker数,只会致使进程来竞争cpu资源了,从而带来没必要要的上下文切换。并且,nginx为了更好的利用多核特性,具备cpu绑定选项,咱们能够将某一个进程绑定在某一个核上,这样就不会由于进程的切换带来cache的失效。网络

  惊群现象

  每一个worker进程都是从master进程fork过来。在master进程里面,先创建好须要listen的socket以后,而后再fork出多个worker进程,这样每一个worker进程均可以去accept这个socket(固然不是同一个socket,只是每一个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是容许的)。通常来讲,当一个链接进来后,全部在accept在这个socket上面的进程,都会收到通知,而只有一个进程能够accept这个链接,其它的则accept失败。多线程

相对于线程,采用进程的优势

  进程之间不共享资源,不须要加锁,因此省掉了锁带来的开销。架构

  采用独立的进程,可让互相之间不会影响,一个进程退出后,其它进程还在工做,服务不会中断,master进程则很快从新启动新的worker进程。并发

  编程上更加容易。异步

  多线程的问题

  而多线程在多并发状况下,线程的内存占用大,线程上下文切换形成CPU大量的开销。想一想apache的经常使用工做方式(apache也有异步非阻塞版本,但因其与自带某些模块冲突,因此不经常使用),每一个请求会独占一个工做线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操做系统来讲,是个不小的挑战,线程带来的内存占用很是大,线程的上下文切换带来的cpu开销很大,天然性能就上不去了,而这些开销彻底是没有意义的。

异步非阻塞

  异步的概念和同步相对的,也就是否是事件之间不是同时发生的。

  非阻塞的概念是和阻塞对应的,阻塞是事件按顺序执行,每一事件都要等待上一事件的完成,而非阻塞是若是事件没有准备好,这个事件能够直接返回,过一段时间再进行处理询问,这期间能够作其余事情。可是,屡次询问也会带来额外的开销。

  总的来讲,Nginx采用异步非阻塞的好处在于:

  • 不须要建立线程,每一个请求只占用少许的内存
  • 没有上下文切换,事件处理很是轻量

  淘宝tengine团队说测试结果是“24G内存机器上,处理并发请求可达200万”。

  

  参考:http://tengine.taobao.org/book/#id2


Nginx学习笔记(一) Nginx架构cococo点点 创做,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自: cococo点点 http://www.cnblogs.com/coder2012
相关文章
相关标签/搜索