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的架构及工作流程的更多相关文章

  1. MySQL:基础架构和工作流程

    [参考文章]:01|基础架构:一条查询语句的执行流程 1. 基本架构 大体来说,MySQL可以分为Server层和存储引擎两部分. Server层包括链接器,分析器,优化器,执行器等,涵盖大多数核心服 ...

  2. J2EE进阶(十八)基于留言板分析SSH工作流程

    J2EE进阶(十八)基于留言板分析SSH工作流程   留言板采用SSH(Struts1.2 + Spring3.0 + Hibernate3.0)架构.   工作流程(以用户登录为例):   首先是用 ...

  3. Apache Druid 的集群设计与工作流程

    导读:本文将描述 Apache Druid 的基本集群架构,说明架构中各进程的作用.并从数据写入和数据查询两个角度来说明 Druid 架构的工作流程. 关注公众号 MageByte,设置星标点「在看」 ...

  4. 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boo ...

  5. BS架构下使用消息队列的工作流程

    异步通信 对于BS(Browser-Server 浏览器)架构,很多情景下server的处理时间较长. 如果浏览器发送请求后,保持跟server的连接,等待server响应,那么一方面会对用户的体验有 ...

  6. 我收藏的技术知识图(每张都是大图)关于XX背后的知识、技术图,例如:Linux、Nginx架构、PHP知识卡、机会、HTML5移动、Android系统架构、YII架构的典型流程、Css知识表

    我收藏的技术知识图(每张都是大图) HTML5Linux/Unix系统设计思想读书笔记 LinuxMVCJava线程MVCSpring MVCCSS3Nginx架构VimCliCommandsPHP知 ...

  7. celery 基础教程(一):工作流程,架构以及概念

    1.工作流程 celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的 ...

  8. Kafka架构深入:Kafka 工作流程及文件存储机制

    kafka工作流程: 每个分区都有一个offset消费偏移量,kafka并不能保证全局有序性. Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic 的 ...

  9. 【Nginx】Nginx基础架构

    调用HTTP模块的流程: Worker进程会在一个for循环语句中反复调用事件模块检测网络事件.当事件模块检测到某个客户端发起的TCP请求时(接收到SYN包),将会为它建立TCP连接,成功建立连接后根 ...

随机推荐

  1. 安利一个免费下载VIP文档神器

    今天安利给大伙一个非非非常好用的可以免费下载VIP文档的下载神器------冰点文库下载器,用过的人都说好.操作简单,小巧轻便,完全免费.支持百度.豆丁.畅享.mbalib.hp009.max.boo ...

  2. JMeter的JTL大文件解析

    1.背景 不知大家在使用JMeter工具进行性能测试时,是否遇到过JTL结果文件过大导致GUI页面长时间解析无响应的问题.这种情况往往出现在稳定性测试场景下,此时的JTL文件大小可能已经达到G级别了. ...

  3. wordpress修改登录密码

    wordpress忘记密码更改 网上搜到的方法: 1.后台邮件重置: 2,phpmyadmin登录数据库,执行mysql语句或者在wp_users表中重置密码: 3,利用php文件重置. 这是提供一种 ...

  4. 解决Sklearn中使用数据集MNIST无法获取的问题(WinError 10060)

    今天在学习PCA的时候,使用mnist数据集遇到一个问题,代码是这样的: import numpy as np from sklearn.datasets import fetch_mldata mn ...

  5. Python 參考網站

    Python 3 Readiness : http://py3readiness.org/ Python Speed Center : https://speed.python.org/ Python ...

  6. vue生成element左侧菜单

    首先来总结element ui 官方文档的左侧菜单结构,带有el-submenu为子级节点,el-menu-item表示没有下级.当然,菜单不能写死,因为菜单也许不止两级,所以我们需要递归来实现.根据 ...

  7. mac下面有epoll?

    没有的,但是mac下面有kqueue,跟epoll原理是差不多的. 这个是没办法的,如果实在需要,就用Ubuntu吧,这个也可以无缝迁移. 更多资源,更多文章由小白技术社提供(是我啦)

  8. TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘

    原文出处:阿里云RDS-数据库内核组 HybridDB for MySQL(原名petadata)是面向在线事务(OLTP)和在线分析(OLAP)混合场景的关系型数据库.HybridDB采用一份数据存 ...

  9. egret之粒子系统

    1.添加粒子库,放在项目同级目录下(必须!!必须!!) 2.添加路径: 3.添加代码: private creatParticle(_pname: string, _target, _x: numbe ...

  10. CodeForces 909E

    题意略. 思路:一个拓扑排序的题目吧.肯定是要先处理后面那个任务,再处理前面那个任务,我的思路是尽力先把主处理器能操作的先操作完,然后再把副处理器能操作完的再操作完,这样循环,直到处理完全部. 定义t ...