Nginx的架构及工作流程
NGINX是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器。NGINX以其高性能,稳定性,丰富的功能集,简单的配置和低资源消耗而闻名,也是为解决C10K问题而编写的服务器之一。本文主要介绍Nginx的架构及工作流程。
一、Nginx的架构如下图

1.nginx启动后会有一个master进程和多个worker进程(woeker进程数量可配置,一般设置与机器的核心数一致),master进程负责管理worker进程(接收外界信号,发送信号到各worker进程,监控worker进程的运行状态)。
2.基本的网络事件,由worker进程负责处理,各worker进程之间是对等和相互独立的,共同竞争来至客户端的请求。
3.nginx是基于多进程模式、事件驱动的异步非阻塞IO模型。
二、nginx多进程+异步非阻塞IO模型的优点
1.进程之间相互独立,一个进程异常,其他进程不会受到影响,能够继续服务,保证服务的稳定性。
2.独立进程之间资源隔离,避免了很多不必要的锁操作,提高程序处理效率。
3.避免了多线程模型下常见的上下文切换问题,虽然多进程模型会导致服务并发数降低,但异步非阻塞IO解决了这个问题。
三、多进程间如何协作
1.多进程工作可能会产生的‘惊群效应’问题
多进程工作模式如下图:

一个连接进来,每个worker进程都有可能处理这个连接,怎么做到的呢?首先每个worker进程都由master进程fork过来,在master进程里面,先建立好需要listen的socket之后,再fork出多个worker进程,这样每个worker进程都可以accept这个socket(注意:不是同一个socket,仅仅是每个进程获取的socket连接来源于同一个ip地址和端口),所以,一个请求进来后,所有accept在这个socket上的worker都会收到通知,但是只有一个worker成功接收到请求并处理,其他worker都会接收失败,这就是‘惊群效应’。
另外,这种工作模式也会引发另外一个问题,那就是‘worker间负载不均衡’!多个worker同时争抢请求任务,如果有的worker进程比较勤快,而且运气也比较好,那么其他进程可能就很少有干活机会,而这些勤快的进程却很忙碌,从而降低服务器的并发和性能。那么Nginx是怎么解决这两个问题的呢?
2.Nginx中worker间协作问题解决方案

将epoll产生的ngx_posted_accept_events(accept事件)放入accept队列,普通事件ngx_posted_events(read事件)放入posted队列,worker进程都从accept队列获取连接事件,从posted队列获取每个worker自己的事件进行处理。
a.在从accept队列获取连接事件时,需要先获取锁(accept_mutex锁),只有获取锁的进程可以从accept队列中取连接事件,从而避免了‘惊群效应’。
b.上述抢占锁的判断是根据worker进程负载阈值的判断值(处理的连接总数有没有达到总连接数<worker_connections>的7/8,没有达到时不会抢锁,直接取事件,达到时需要先拿到锁再获取事件),从而解决了worker间负载不均衡的问题。
Nginx的架构及工作流程的更多相关文章
- MySQL:基础架构和工作流程
[参考文章]:01|基础架构:一条查询语句的执行流程 1. 基本架构 大体来说,MySQL可以分为Server层和存储引擎两部分. Server层包括链接器,分析器,优化器,执行器等,涵盖大多数核心服 ...
- J2EE进阶(十八)基于留言板分析SSH工作流程
J2EE进阶(十八)基于留言板分析SSH工作流程 留言板采用SSH(Struts1.2 + Spring3.0 + Hibernate3.0)架构. 工作流程(以用户登录为例): 首先是用 ...
- Apache Druid 的集群设计与工作流程
导读:本文将描述 Apache Druid 的基本集群架构,说明架构中各进程的作用.并从数据写入和数据查询两个角度来说明 Druid 架构的工作流程. 关注公众号 MageByte,设置星标点「在看」 ...
- 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 : -- u-boo ...
- BS架构下使用消息队列的工作流程
异步通信 对于BS(Browser-Server 浏览器)架构,很多情景下server的处理时间较长. 如果浏览器发送请求后,保持跟server的连接,等待server响应,那么一方面会对用户的体验有 ...
- 我收藏的技术知识图(每张都是大图)关于XX背后的知识、技术图,例如:Linux、Nginx架构、PHP知识卡、机会、HTML5移动、Android系统架构、YII架构的典型流程、Css知识表
我收藏的技术知识图(每张都是大图) HTML5Linux/Unix系统设计思想读书笔记 LinuxMVCJava线程MVCSpring MVCCSS3Nginx架构VimCliCommandsPHP知 ...
- celery 基础教程(一):工作流程,架构以及概念
1.工作流程 celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的 ...
- Kafka架构深入:Kafka 工作流程及文件存储机制
kafka工作流程: 每个分区都有一个offset消费偏移量,kafka并不能保证全局有序性. Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic 的 ...
- 【Nginx】Nginx基础架构
调用HTTP模块的流程: Worker进程会在一个for循环语句中反复调用事件模块检测网络事件.当事件模块检测到某个客户端发起的TCP请求时(接收到SYN包),将会为它建立TCP连接,成功建立连接后根 ...
随机推荐
- 夯实Java基础(十七)——注解(Annotation)
1.注解概述 从JDK5.0开始,Java增加对元数据(MetaData)的支持,也就是注解(Annotation).其实我们早就已经接触过注解了,例如我们经常在Java代码中可以看到 “@Overr ...
- 8.15 day33 进程池与线程池_协程_IO模型(了解)
进程池和线程池 开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度地利用计算机 ...
- 阿里巴巴JAVA开发规范学习笔记
一.编程规约 (一)命名规约 1.类名驼峰.领域模型除外VO.BO.DTO.DO统称POJO 4.数组String[] args 8.枚举类 Enum ,其实就是特殊的常量类,构造方法强制私有 ( 二 ...
- egret项目发布为微信小程序
1.更改游戏的缩放模式 因为微信小游戏不支持showAll,如果你使用了showAll模式.可以改成fixedWidth或fixedHeight.在index.html里修改,如下图 但这个又涉及到了 ...
- Facebook的早期历史
Facemash:谁更有吸引力?Facebook的起源 2003年,当时扎克伯格还是一名哈佛大学的二年级学生,他编写了一个名为Facemash的网站.他利用黑客技术入侵了学校管理部门的网站,并从中 ...
- Selenium3 + Python3自动化测试系列六——等待方式
等待 一.等待是什么,为什么要等待 在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等, 这时候,我们就需要使用等待,来判断上一步操 ...
- 良许 | 命令的输出不会保存?居然连 tee 命令都不会用!
很多情况下,我们需要保存程序/命令的输出到本地,常用的一种方法是重定向,这也是一种很好的方法.但有个问题,如果你想要做后续操作,比如要统计输出的行数等,重定向就有困难了. 这时候,tee 命令就派上用 ...
- C#开发BIMFACE系列5 服务端API之文件直传
BIMFACE使用了分布式对象存储来存储用户上传的模型/图纸文件.如使用普通的文件上传接口, 文件流会通过BIMFACE的服务器,再流向最终的分布式存储系统,整个上传过程会受BIMFACE服务器的带宽 ...
- Java异常机制及异常处理建议
1.Java异常机制 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通过API中Throwable类的众多子类 ...
- unity之游戏特效
一.运动轨迹 运动轨迹常常用于表现武器的挥舞效果,在提高速度感的同时又能让玩家看清楚招式动作,所以是常见的一种格斗特效. Unity中可以直接使用TrailRender来实现该效果. 二.运动模糊 运 ...