Nginx 究竟如何处理事件?

在了解了网络事件以及事件分发、收集器之后,让咱们来了解 Nginx 是怎么样处理事件的!浏览器

Nginx 事件循环

Nginx 究竟如何处理事件?

当 Nginx 刚刚启动时,在等待事件部分,也就是打开了 80 或 443 端口,这个时候在等待新的事件进来,好比新的客户端连上了 Nginx 向咱们发起了链接,此步每每对应 epoll 的 epoll wait 方法,这个时候的 Nginx 实际上是处于 sleep 这样一个进程状态的。当操做系统收到了一个创建 TCP 链接的握手报文时而且处理完握手流程之后,操做系统就会通知 epoll wait 这个阻塞方法,告诉它能够往下走了,同时唤醒 Nginx worker 进程。缓存

接着往下走以后,会去找操做系统索要要事件,操做系统会把他准备好的事件,放在事件队列中,从这个事件队列中能够获取到须要处理的事件。好比创建链接或者收到一个 TCP 请求报文。网络

Nginx 究竟如何处理事件?

取出之后就会进行循环处理事件,如上就是处理事件的一个循环:当发现队列中不为空,就把事件取出来开始处理事件;在处理事件的过程当中,可能又生成新的事件,好比说发现一个链接新创建了,可能要添加一个超时时间,好比默认的 60 秒,也就是说 60 秒以内若是浏览器不向 Nginx 发送请求的话,Nginx 就会把这个链接关掉;又好比说当 Nginx 发现已经收完了完整的 HTTP 请求之后,能够生成 HTTP 响应了,那么这个生成响应是须要 Nginx 能够向操做系统的写缓存中内心面去把响应写进去,要求操做系统尽快的把这样一段响应内容发到浏览器上,也就是说可能在处理过程当中可能会产生新的事件,就是循环处理事件部分指向的事件队列部分,等待下一次来处理。架构

若是全部的事件都处理完成之后呢,又会返回到等待事件部分。ide

在学习了 Nginx 事件循环后,咱们再去理解有时候使用一些第三方模块,这些第三方模块可能会作大量的 CPU 运算,这样的计算任务会致使处理一个事件的时间很是的长;在上面的一个流程图中,能够看到会致使队列中的大量事件会长时间得不处处理,从而引起恶性循环,也就是他们的超时时间可能到了;大量的 CPU、Nginx 的任务都消耗在处理链接不正常的断开,因此 Nginx 不能容忍有些第三方模块长时间的消耗大量的 CPU 进行计算任务就是这样一个缘由。咱们能够看到像 GZIP 这样的模块,他们都不会在一次使用大量的 CPU 而是分段使用,这些都与 Nginx 的事件循环有关的。学习

总结

本篇文章主要讲解了 Nginx 是如何处理事件的以及 Nginx 事件循环的流程是怎么样的,为下一步讲解 Nginx 事件循环流程中是如何从操做系统中获取等待处理的事件作铺垫,而且经过事件循环了解到为何 Nginx 不指望第三方模块中出现大量 CPU 的计算任务。操作系统

3d

●浅析 Nginx 网络事件
●一篇文章带你了解 ZooKeeper 架构
●ZooKeeper 入门看这篇就够了
●你真的了解 volatile 关键字吗?
●Java中Set集合是如何实现添加元素保证不重复的?
●一条SQL查询语句是如何执行的?blog

Nginx 究竟如何处理事件?

武培轩
有帮助?在看,转发走一波
喜欢做者队列

相关文章
相关标签/搜索