Ngnx工作原理(1)
Nginx 是一个轻量级的HTTP 服务程序,相比其他服务器程序如Apache,Nginx占用内存少,稳定性高,并发处理能力强。同时Nginx 还是一个反向代理服务程序,和邮件代理服务程序。Nginx具有丰富的模块库、灵活的配置、较低资源消耗等优点。下面,我们一起深入看一下Nginx的工作机制
1. Nginx 如何实现高性能低消耗的呢?
我们从以下几个方面说明以下:
网络事件处理机制
Nginx 采用异步非阻塞的方式处理请求,可以同时处理上万的请求
Nginx 支持 select/epoll 等流行事件处理机制,根据系统环境自动选择
Nginx 采用独立于系统的事件处理机制,能够高效处理请求
资源分配技术
Nginx 采用分阶段资源分配技术,使得它的CPU和内存消耗非常低
多核处理优化
Nginx 默认采用多进程启动模式
Nginx 包含Master 进程 和 Worker 进程
能够充分利用 SMP 对称多处理的优势,减少Worker进程磁盘I/O的阻塞
Nginx 支持Worker进程和CPU内核 一一对应绑定,避免进程上下文的切换致使cache失效
基于上面提到技术,以及Nginx很多地方的优化,让Nginx成为最快的HTTP服务器。
2.Nginx的进程模型
在Nginx的技术架构中,进程模型是至关重要的一部分。接下来,我们一起看看Nginx进程模型,以及它们的工作机制。
Linux 系统中,Nginx默认以守护进程daemon方式启动,默认采用多进程方式。Nginx包括两种类型的进程:
Master 进程,数量只有一个,管理Nginx本身和Worker进程
Worker 进程,数量一般和CPU核数相等,Nginx的所有请求处理,均是在Worker进程中完成
下面,我们分别深入看一下Master和Worker进程。
2.1 Master 进程工作机制
在Nginx启动时,Master进程创建,主要负责初始化Nginx和相关模块、fork Worker进程、接收处理外界信号等工作。
Nginx的初始化过程:
解析配置文件,这是Nginx初始化最重要的一个环节
调用各个配置指令回调函数,完成各个模块的配置、相互关联等
建立listen 的 socket(listenfd)
准备工作都完成后,fork worker子进程和cache子进程
Master 进程信号处理机制
我们通过kill命令发送信号给Nignx Master 进程,看看Master进程如何处理:
分析流程:
Master 进程接收到 HUP 信号
Master 进程重新加载配置文件
Master 进程启动新的Worker进程
Master 进程发送信号给Worker 进程
老的Worker进程不再接收新的请求
老的Worker进程处理完当前请求,退出
至此,Nginx完成平滑重启
注意:Nginx 0.8 版本以后,提供了 -s参数,用于管理Nginx服务的停止和重启,注意line 11:
2.2 Worker 进程工作机制
Worker进程负责所有请求的处理工作,我们通过一个HTTP请求,来梳理一下Worker的工作流程:
新的请求到来:所有的Work进程的listenfd都会变得可读
竟抢互斥锁:所有 Worker 进程在注册listenfd读事件前,要先抢accept_mutex
抢到互斥锁的Worker,注册listenfd读事件,在事件中调用accept接受该连接
拿到请求后,Worker进程开始读取请求,解析请求,处理请求,产生数据,再返回给客户端
Worker进程断开连接
需要注意:一个HTTP请求,完全由Worker进程处理,而且只在一个Worker中处理
2.3 Master-Worker 进程架构机制的优势有哪些??
对于每个Worker 进程来说,独立的进程,不需要加锁,节约锁导致的资源开销;worker进程之间,互不干扰,平滑重启就是很好的例子,服务不中断。
2.4 网络事件处理机制
Nginx 采用的是异步非阻塞事件处理机制,支持select/poll/epoll/kqueue 等等。Nginx 同时会监控多个事件,调用他们是阻塞的。但是调用有超时时间,在超时时间内,如果有事件准备好了,就返回,否则重新放入epoll中。当读写返回EAGAIN时,事件将会被再次放入epoll中。
处理线程只有一个,同时处理的请求也只有一个,所谓多请求并发,只是在不断的切换请求而已。虽然是切换,但这种切换不涉及上下文切换,相比十分轻量。更多的并发,只是会占用更多的内存。
进程相关的还有,信号和定时器,这部分另外单独讲解。
3. Nginx 包含哪些模块
Nginx是模块化架构的服务,丰富的模块,松散耦合,也让Nginx更加强大!我看看Nginx 都有哪些模块
内核模块
实现了底层的通讯协议,为其他模块/进程构建运行环境、协作基础,打开listen 的端口,启动worker进程HTTP/Mail模块
两个特殊模块,位于内核模块和各功能模块间;在内核模块之上实现了另一层的抽象;处理HTTP/MAIL协议事件;确保调用功能模块顺序正确。Event模块
负责监听accept后建立的连接,对读写事件进行添加删除;与非阻塞 I/O 模型结合使用;支持select/poll/epoll/kqueue等;注意惊群效应,后面有解释。Handler模块
负责接受客户端请求并产生输出;通过配置文件中location指令配置 content handler 模块。Filter模块
负责输出内容处理,修改输出内容;Fiter模块在获取回复内容之后,向用户发送响应之前,执行处理动作;调用顺序在编译时就确定了。Upstream模块
实现反向代理的功能,负责将请求转发到后端服务器上,并读取响应,发回客户端;跨越单机的限制,完成网络数据的接收、处理和转发;LoadBalancer模块
根据配置指定算法,在众多的后端服务器中选择一个,完成请求的转发服务器;都有哪些算法呢?
惊群效应:
当内核 accept 一个连接时,会唤醒所有等待中的进程
但实际上只有一个进程能获取连接,其他的进程都是被无效唤醒的
所以 Nginx 采用了自有的一套 accept 加锁机制,避免多个进程同时调用 accept
Nginx 多进程的锁在底层默认是通过 CPU 自旋锁来实现。如果操作系统不支持自旋锁,就采用文件锁。
多路复用-select、epoll
select
I/O多路复用采用的是select 模型,即系统发出select系统调用,等待内核主动将可
用的文件描述符信息发送给应用一端,fd未准备好,应用会block住socket请
求,当fd就许后,select 会遍历维护的文件描述符发现可用的文件描述符。
epoll
每当fd就绪,系统采用回调函数将fd放入就绪列表,效率非常高。
举例:
告诉服务员,用餐结束,服务员告知老板,说有几桌要结账,老板需要询问
告诉服务员,用餐结束,服务员告知老板,说哪号桌要结账,老板不需要询问。
select epoll 优缺点总结
模型 | 优点 | 缺点 |
---|---|---|
select | 1.采用线性遍历的方式获取可用的fd文件描述符 2.可维护文件描述符大小有限制为1024 |
|
epoll | 1.每当fd就绪,系统采用回调函数将fd放入就绪列表,效率非常高。 2.最大连接数没有限制 |
Ngnx工作原理(1)的更多相关文章
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 【夯实Nginx基础】Nginx工作原理和优化、漏洞
本文地址 原文地址 本文提纲: 1. Nginx的模块与工作原理 2. Nginx的进程模型 3 . NginxFastCGI运行原理 3.1 什么是 FastCGI ...
- HashMap的工作原理
HashMap的工作原理 HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- ThreadLocal 工作原理、部分源码分析
1.大概去哪里看 ThreadLocal 其根本实现方法,是在Thread里面,有一个ThreadLocal.ThreadLocalMap属性 ThreadLocal.ThreadLocalMap t ...
- Servlet的生命周期及工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- 代码管理工具 --- git的学习笔记二《git的工作原理》
通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 浏览器内部工作原理--作者:Tali Garsiel
本篇内容为转载,主要用于个人学习使用,作者:Tali Garsiel 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到 ...
随机推荐
- redux异步
在一个项目中 redux 是必不可少的,redux 中没有提供异步的操作,但是异步又是项目开发中重要的一部分,所以我们的 redux 对此有进行了拓展: 所以我们需要 redux-thunk 的插件, ...
- linux升级安装openssh时出现依赖冲突
通过如下方式下载到openssh安装包 https://www.cnblogs.com/qq931399960/p/11120429.html -rwxrwxrwx. root root Jul : ...
- Jenkins Publish FTP远程部署过程
步骤: 1.安装FileZilla FTP Server 2.添加FTP账号: 1.Edit——Users——Add 2.Edit——Users——Shared folders 3.下载FileZil ...
- 日志框架之Logger
概述 在我们日常的开发中,肯定是少不了要和 Log 打交道,回想一下我们是怎么使用 Log 的:先定义一个静态常量 TAG,TAG 的值通常是当前类的类名,然后在需要打印 Log 的地方,调用 Log ...
- Appium移动自动化测试(四)之元素定位
做过UI自动化测试的童鞋都会发现, 在上一篇文章中居然没有万能定位方式Xpath. 是滴, 确实没有! ADT自带的uiautomatorviewer里面并没有属性xpath, 如果我们需要的话,还需 ...
- qt liunx 安装命令
qt SDK : apt-get install qt-sdkqt 安装 : apt-get install qtcreator文档安装 : cmake kdelibs5-data subversio ...
- YII :将oracle中timestamp 字段正常显示在页面中
'value'=>'DateTime::createFromFormat("d#M#y H#i#s*A", $data["START_TIME"])-&g ...
- centos 7安装python3及相关模块
一.python3安装 1.cd /usr/bin 2.mv python python.bak 3.https://www.python.org/ftp/python/网站选择合适的版本 4.wge ...
- JobHandle和依赖项
要当您调用作业的Schedule方法时,它将返回JobHandle.您可以在代码中使用一个JobHandle作为其他作业的依赖项.如果作业取决于另一个作业的结果,您可以将第一个作业JobHandle作 ...
- C++学习笔记-多态的实现原理
深入了解多态的实现原理,有助于提高对于多态的认识 多态基础 多态的实现效果 多态:同样的调用语句有多种不同的表现形态 多态实现的三个条件 有继承.有virtual重写.有父类指针(引用)指向子类对象 ...