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间负载不均衡的问题。

原文地址:https://www.cnblogs.com/green-technology/p/nginx_first.html

时间: 2024-10-02 18:12:35

Nginx的架构及工作流程的相关文章

Hive的架构和工作流程

架构 1.hive是数据仓库,在hadoop基础上处理结构化数据:它驻留在hadoop之上,用户对数据的统计,查询和简单的分析操作. 2.hive不是 a.关系型数据库 b.OLTP c.实时查询和行级更新操作 3.hive特点 a.表模型存储在database(关系型)中,处理的数据存储在HDFS上: b.设计模式遵循OLAP c.它提供了一套类SQL的语言(HiveQL or HQL),用于执行查询 d.它是简单的,快速的,可扩展的和易伸缩的 4.hive架构 a.(用户接口)User In

docker架构及工作流程

一.概念docker是开源容器引擎,基于cgroup,namespace,unionFS等技术实现,对应用进行封装的虚拟化技术 什么是cgroup? 对系统资源限制,创建容器的过程其实就是在创建进程,对资源的分配和维护使用cgroup来管理,包括cpu,内存,io等? 什么是namespace? 创建容器时,对容器来说就是一个全新的系统,容器内的文件系统要和宿主机文件系统隔离,网络空间隔离,用户权限隔离,这些隔离操作都是有namespace 来管理完成的 什么是unionFS? 联合文件系统,简

2.nginx架构及工作流程

nginx是模块化设计: 模块大致可以分为: 1.核心模块(core) 2.基础模块(http,mail) 3.第三方模块(upstream,proxy,fastcgi) 功能:1.核心模块为nginx作为webserver,web or mail proxy提供一个大的基础 2.基础模块是核心模块与扩展模块的抽象衔接,同时完成某协议的功能 3.第三方模块,在对应基础模块的基础上,完成特定功能 nginx架构: nginx对于一个http请求的处理流程: 1.tcp/ip连接建立 2.woerk

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

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boot 源码 : http://download.csdn.net/detail/han1202012/8342761 -- S3C2440 文档 : http://download.csdn.net/detail/han1202012/8342701 -- S5PV210_iROM_Applicati

ansible架构原理及工作流程

一.ansible介绍 ansible是一种自动化运维工具,基于paramiko模块开发,用于批量执行任务和发布工作,被广泛用于日常运维工作当中. 二.ansible架构架构图: ansible核心模块介绍:core models: ansible自带的模块,file,shell,copy等custom models: ansible自带模块不足以满足工作需要时,用户添加扩展模块host inventory: 由ansible 管理的主机,包括主机名,ip,端口等playbook: yaml格式

【Nginx】Nginx基础架构

一.Nginx的架构设计 1)优秀的模块化设计 2)事件驱动架构 事件驱动架构是指由一些事件发生源来产生事件,由一个或多个事件收集器来收集.分发事件,然后许多事件处理器会注册自己感兴趣的事件,同时会消费这些事件. 对于Nginx而言,一般会由网卡.磁盘产生事件,事件模块将负责事件的收集.分发操作,而所有的模块都可能是事件消费者. Nginx采用完全的事件驱动架构来处理业务.对于传统web服务器而言,事件驱动往往局限在TCP链接建立.关闭事件上,一个连接建立以后,在其关闭之前的所有操作逗不再是事件

大数据技术之_10_Kafka学习_Kafka概述+Kafka集群部署+Kafka工作流程分析+Kafka API实战+Kafka Producer拦截器+Kafka Streams

第1章 Kafka概述1.1 消息队列1.2 为什么需要消息队列1.3 什么是Kafka1.4 Kafka架构第2章 Kafka集群部署2.1 环境准备2.1.1 集群规划2.1.2 jar包下载2.2 Kafka集群部署2.3 Kafka命令行操作第3章 Kafka工作流程分析3.1 Kafka 生产过程分析3.1.1 写入方式3.1.2 分区(Partition)3.1.3 副本(Replication)3.1.4 写入流程3.2 Broker 保存消息3.2.1 存储方式3.2.2 存储策

Citrix PVS架构和工作原理

Citrix PVS产品一直在Citrix的产品体系中存在着重要的位置,在中大型的VDI环境中,绝大部分都是基于PVS架构部署的,足以证明PVS架构的稳定.高效和便捷. 本文从底层架构和原理的角度分析了Citrix PVS组件,使得我们能够得窥PVS架构稳定.高效和便捷的背后,支撑的机制到底是什么? 一.Citrix PVS简介 Citrix Provisioning Services组件简称Citrix PVS,是通过创建一个标准的虚拟机镜像,该镜像就如同一个虚拟磁盘一样,里面包含了虚拟机的配

RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍

RDIFramework.NET ━ .NET快速信息化系统开发框架 工作流程组件介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 1.RDIFramework.NET框架介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,为企业或个人在.NET环境下快速开发系统提供了强大的支持,开发人员不需要开发系统的基础功能和公共模块,框架自身提供了强大的函数库和开发包,开发人员只须集中精力专注于业