nginx底层实现有几个主要的模块:

  1. 进程模块
  2. 事件模块
  3. 网络模块

进程模块

默认采用守护模式启动,守护模式让master进程启动后在后台运行,不在窗口上卡住。

Nginx 启动后会有一个 Master 进程和多个Worker 进程,Master 进程主要用来管理 Worker 进程,对网络事件进程进行收集和分发,调度哪个模块可以占用 CPU 资源,从而处理请求。

一般配置Worker进程的个数与机器cpu个数一致,从而达到cpu资源的最大化利用,也避免由于进程资源分配带来的额外开销。

Master进程工作原理

master进程主要用来管理worker进程,如:

  1. 接收来自外界的信号,向各worker进程发送信号;
  2. 监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

Worker进程工作原理

基本的网络事件,则是放在worker进程中来处理了。

worker进程之间是平等的,每个进程,处理请求的机会也是一样的。

当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

(nginx提供了一个accept_mutex(互斥锁),有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,worker进程内部不需要锁)

好处:

  1. 对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
  2. 互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。

事件模块

apache的常用工作方式:每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战,线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,自然性能就上不去了,而这些开销完全是没有意义的。

nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并发,何来高并发呢?非也,这就是nginx的高明之处,nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的。

为什么nginx可以采用异步非阻塞的方式来处理呢,或者异步非阻塞到底是怎么回事呢?

我们先回到原点,看看一个请求的完整过程。

请求过来,要建立连接,然后再接收数据,接收数据后,再发送数据。

nginx里面,最忌讳阻塞的系统调用了。不要阻塞,那就非阻塞喽。非阻塞就是,事件没有准备好,马上返回EAGAIN,告诉你,事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。

虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做更多的事情了,但带来的开销也是不小的。所以,才会有了异步非阻塞的事件处理机制。

我们之前说过,推荐设置worker的个数为cpu的核数,在这里就很容易理解了,更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。

现在,知道了nginx为什么会选择这样的进程模型与事件模型了。对于一个基本的web服务器来说,事件通常有三种类型,网络事件、信号、定时器。从上面的讲解中知道,网络事件通过异步非阻塞可以很好的解决掉。如何处理信号与定时器?

  • 信号的处理。(待补充)
  • 定时器。nginx里面的定时器事件是放在一颗维护定时器的红黑树里面,每次在进入epoll_wait前,先从该红黑树里面拿到所有定时器事件的最小时间,在计算出epoll_wait的超时时间后进入epoll_wait。(待补充)

网络模块

先不提。

参考资料:

  1. Nginx 之实现原理 http://www.jianshu.com/p/b77482d4b670
  2. Nginx 多进程模型是如何实现高并发的? https://www.zhihu.com/question/22062795
  3. nginx平台初探 http://tengine.taobao.org/book/chapter_02.html

转载于:https://www.cnblogs.com/xawei/p/6748315.html

nginx部分实现原理解析相关推荐

  1. Nginx的核心原理解析

    Nginx 反向代理VS正向代理: 反向代理服务器对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置.客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向 ...

  2. 【Nginx那些事】nginx原理解析

    [Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...

  3. Nginx的原理解析

    本文来说下Nginx相关的原理 文章目录 概述 worker 是如何工作的 一个 master 和多个 worker 的好处 设置多少个 worker 合适 相关思考 本文小结 概述 Nginx 启动 ...

  4. flask web开发是前端还是后端_Flask Web开发实战:入门、进阶与原理解析 PDF 全格式版...

    给大家带来的一篇关于Flask相关的电子书资源,介绍了关于Flask.Web.开发实战方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小12.2M,李辉编写,目前豆瓣.亚马逊.当当.京东等 ...

  5. c/s架构nginx+php-fpm通信原理

        FastCGI是一个运用于Http Server和动态脚本语言间通信的接口,多数流行的Http Server都支持FastCGI,包括Apache.Nginx和lighttpd等.同时,Fas ...

  6. nginx的工作原理与nginx的配置

    1.nginx的工作原理 nginx的模块直接被编译进nginx,因此属于静态编译方式. 启动nginx后,nginx的模块被自动加载,与Apache不一样,首先将模块编译为一个so文件,然后在配置文 ...

  7. 详解Nginx的核心原理

    Nginx的核心原理 本节为大家介绍Nginx的核心原理,包含Reactor模型.Nginx的模块化设计.Nginx的请求处理阶段. 虽然本节的知识有一定的理论深度,但是与另一个有名的Java底层通信 ...

  8. Nginx 优化及原理

    nginx原理了解 #04.nginx常用模块 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWaN6T1y-1569743386454)(https://cdn.l ...

  9. 【云计算基础服务-Nginx WEB服务器---原理及简介详解】

    文章目录 前言: 一.云计算基础服务-Nginx WEB服务器 详解 1.Nginx简介及原理 1.1 Nginx web简介 1.2 Nginx工作原理 前言: 本专栏专门讲解云计算服务基础知识,适 ...

最新文章

  1. [译]Kinect for Windows SDK开发入门(九):骨骼追踪进阶 下
  2. disaster——我都做了些什么啊!
  3. 2059. 转化数字的最小运算数
  4. Go:获取命令行参数
  5. 【方案分享】2022线上云年会云会议玩法全案策划.pptx(附下载链接)
  6. 一元流量参数为null_精益SQL —— “NULL”真烦人
  7. 物流货代公司管理系统
  8. 使用 Visual Studio Code 编写 TypeScript
  9. Hibernate 关于配置Mapping不成功 Unknow Entity
  10. ubuntu WeChat 网易云音乐 Mac OS主题 wps 截图链接版
  11. 可以额外获得大量福卡的绝招
  12. 无线网卡驱动正常却搜索不到无线信号
  13. android 后台运行清理,【Android】App在后台被清理后的终极应对手段——重启应用...
  14. volatile的区别
  15. 智慧水务一体化平台建设(解决方案)
  16. ssoj4015: 永琳的竹林迷径(path)
  17. VOC数据集制作 滑窗切分图片 单通道标签调色板
  18. 语音信号处理初学者概念总结
  19. 如何用CANSLIM法则选股
  20. 子域名收集 -- Esd

热门文章

  1. python数据结构推荐书-关于数据结构,有哪些不错的参考书推荐?
  2. 我在学python-我在大学毕业后学习Linux、python的一些经验
  3. python能够做什么软件-python爬虫软件有哪些做的比较好的?
  4. python结果输出到excel-python实现数据导出到excel的示例--普通格式
  5. python数据分析视频网盘-利用Python进行数据分析视频教程云盘下载
  6. a byte of python-A Byte of Python PDF 下载
  7. pythonurllib模块-Python urllib模块与urlopen()函数解析
  8. 风云编程python-首页
  9. python人脸识别毕业设计-用python3.6在电脑上实现用摄像头来人脸识别源程序
  10. python基础代码事例-Python简单基础小程序的实例代码