nginx部分实现原理解析
nginx底层实现有几个主要的模块:
- 进程模块
- 事件模块
- 网络模块
进程模块
默认采用守护模式启动,守护模式让master进程启动后在后台运行,不在窗口上卡住。
Nginx 启动后会有一个 Master 进程和多个Worker 进程,Master 进程主要用来管理 Worker 进程,对网络事件进程进行收集和分发,调度哪个模块可以占用 CPU 资源,从而处理请求。
一般配置Worker进程的个数与机器cpu个数一致,从而达到cpu资源的最大化利用,也避免由于进程资源分配带来的额外开销。
Master进程工作原理
master进程主要用来管理worker进程,如:
- 接收来自外界的信号,向各worker进程发送信号;
- 监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
Worker进程工作原理
基本的网络事件,则是放在worker进程中来处理了。
worker进程之间是平等的,每个进程,处理请求的机会也是一样的。
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。
(nginx提供了一个accept_mutex(互斥锁),有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,worker进程内部不需要锁)
好处:
- 对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
- 互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,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。(待补充)
网络模块
先不提。
参考资料:
- Nginx 之实现原理 http://www.jianshu.com/p/b77482d4b670
- Nginx 多进程模型是如何实现高并发的? https://www.zhihu.com/question/22062795
- nginx平台初探 http://tengine.taobao.org/book/chapter_02.html
转载于:https://www.cnblogs.com/xawei/p/6748315.html
nginx部分实现原理解析相关推荐
- Nginx的核心原理解析
Nginx 反向代理VS正向代理: 反向代理服务器对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置.客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向 ...
- 【Nginx那些事】nginx原理解析
[Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...
- Nginx的原理解析
本文来说下Nginx相关的原理 文章目录 概述 worker 是如何工作的 一个 master 和多个 worker 的好处 设置多少个 worker 合适 相关思考 本文小结 概述 Nginx 启动 ...
- flask web开发是前端还是后端_Flask Web开发实战:入门、进阶与原理解析 PDF 全格式版...
给大家带来的一篇关于Flask相关的电子书资源,介绍了关于Flask.Web.开发实战方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小12.2M,李辉编写,目前豆瓣.亚马逊.当当.京东等 ...
- c/s架构nginx+php-fpm通信原理
FastCGI是一个运用于Http Server和动态脚本语言间通信的接口,多数流行的Http Server都支持FastCGI,包括Apache.Nginx和lighttpd等.同时,Fas ...
- nginx的工作原理与nginx的配置
1.nginx的工作原理 nginx的模块直接被编译进nginx,因此属于静态编译方式. 启动nginx后,nginx的模块被自动加载,与Apache不一样,首先将模块编译为一个so文件,然后在配置文 ...
- 详解Nginx的核心原理
Nginx的核心原理 本节为大家介绍Nginx的核心原理,包含Reactor模型.Nginx的模块化设计.Nginx的请求处理阶段. 虽然本节的知识有一定的理论深度,但是与另一个有名的Java底层通信 ...
- Nginx 优化及原理
nginx原理了解 #04.nginx常用模块 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWaN6T1y-1569743386454)(https://cdn.l ...
- 【云计算基础服务-Nginx WEB服务器---原理及简介详解】
文章目录 前言: 一.云计算基础服务-Nginx WEB服务器 详解 1.Nginx简介及原理 1.1 Nginx web简介 1.2 Nginx工作原理 前言: 本专栏专门讲解云计算服务基础知识,适 ...
最新文章
- [译]Kinect for Windows SDK开发入门(九):骨骼追踪进阶 下
- disaster——我都做了些什么啊!
- 2059. 转化数字的最小运算数
- Go:获取命令行参数
- 【方案分享】2022线上云年会云会议玩法全案策划.pptx(附下载链接)
- 一元流量参数为null_精益SQL —— “NULL”真烦人
- 物流货代公司管理系统
- 使用 Visual Studio Code 编写 TypeScript
- Hibernate 关于配置Mapping不成功 Unknow Entity
- ubuntu WeChat 网易云音乐 Mac OS主题 wps 截图链接版
- 可以额外获得大量福卡的绝招
- 无线网卡驱动正常却搜索不到无线信号
- android 后台运行清理,【Android】App在后台被清理后的终极应对手段——重启应用...
- volatile的区别
- 智慧水务一体化平台建设(解决方案)
- ssoj4015: 永琳的竹林迷径(path)
- VOC数据集制作 滑窗切分图片 单通道标签调色板
- 语音信号处理初学者概念总结
- 如何用CANSLIM法则选股
- 子域名收集 -- Esd
热门文章
- python数据结构推荐书-关于数据结构,有哪些不错的参考书推荐?
- 我在学python-我在大学毕业后学习Linux、python的一些经验
- python能够做什么软件-python爬虫软件有哪些做的比较好的?
- python结果输出到excel-python实现数据导出到excel的示例--普通格式
- python数据分析视频网盘-利用Python进行数据分析视频教程云盘下载
- a byte of python-A Byte of Python PDF 下载
- pythonurllib模块-Python urllib模块与urlopen()函数解析
- 风云编程python-首页
- python人脸识别毕业设计-用python3.6在电脑上实现用摄像头来人脸识别源程序
- python基础代码事例-Python简单基础小程序的实例代码