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连接,成功建立连接后根 ...
随机推荐
- (一)c#Winform自定义控件-基类控件
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- GoAccess 分析 Nginx 日志
0x00 事件 帮助朋友搭建了博客,运行过了一段时间,准备发个网站分析报告给他. 有效的数据只有 Nginx 的访问日志,于是使用决定 GoAccess 工具对这个日志进行分析, 0x01 安装 吾使 ...
- Ubuntu安装时出现“failed to load ldlinux.c32”
Ubuntu安装时出现“failed to load ldlinux.c32” 利用UltraISO制作了ubuntu 18.04的U盘启动,开机F12键USB启动时出现 1 2 Failed to ...
- Java面向对象特性总结
1.面对对象与面对过程的区别 什么是封装?我看到过这样一个例子: 我要用洗衣机洗衣服,只需要按一下开关和洗涤模式就可以了.有必要了解洗衣机内 部的结构吗?有必要碰电动机吗?有必要了解如何通电的吗? 如 ...
- 40 篇原创干货,带你进入 Spring Boot 殿堂!
两个月前,松哥总结过一次已经完成的 Spring Boot 教程,当时感受到了小伙伴们巨大的热情. 两个月过去了,松哥的 Spring Boot 教程又更新了不少,为了方便小伙伴们查找,这里再给大家做 ...
- 多渠道推广场景下,如何实现 App 用户增长的精准归因?
为了实现用户的快速增长,以推广 App 为目标的线上广告投放是很多平台获取新用户的重要方式.随道移动互联网的发展,现在 App 推广的渠道越来越丰富,除了 WAP 站点.第三方 App 之外,HTML ...
- 使用base64编码把背景添加到CSS文件中
最近博客背景图片的外链挂了,没办法,只好另找办法. 在博客园后台,有一个“文件”菜单,可以上传自己的文件,我就打算把图片传到里面.但却发现了一个很反人性的设置:不允许上传jpg,png文件,允许上传的 ...
- js设置,取得,清除cookie
//取得cookie function getCookie(name) { var nameEQ = name + "="; var ca = document.cookie. ...
- 【转】[Python小记] 通俗的理解闭包 闭包能帮我们做什么?
https://blog.csdn.net/sc_lilei/article/details/80464645
- 【码上开心】Windows环境mysql数据库使用(一) 安装Mysql数据库
[下载MySql] https://dev.mysql.com/downloads/mysql/ 如下图,选择版本,本教程仅演示ZIP压缩包下载配置. 2.[解压到指定目录] 3.[配置环境变量] 4 ...