nginx的事件驱动模型

2024-08-24 16:18
文章标签 模型 nginx 事件驱动

本文主要是介绍nginx的事件驱动模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


nginx的事件驱动机制:
    事件发生源产生事件->事件收集器来收集分发事件(选择自己感兴趣的)->消费事件.

传统web服务器(例如apache)的事件驱动机制:
    当一个连接到来时候,事件驱动,建立连接.当连接建立以后直到关闭之前进程将退化成按顺序执行每个操作的批处理模式.每个请求的始终占据资源,无论是否进行数据传输.尤其是中途的阻塞,会造成资源的极大浪费.这种传统的web服务器常常把一个线程或者进程作为一个事件的消费者,在进程阻塞的时候会休眠,而休眠占用的资源第不到有效的利用,并且当有上百万连接时候,进程(线程)间频繁的切换将成为服务器的瓶颈.

传统web服务器的瓶颈原因:进程切换占用过多资源+进程睡眠浪费资源
nginx解决之道:单个进程+多阶段异步处理
    nginx采用单个或者几个进程(一般是cpu的数目)来处理事件,这样就不会由于进程间的频繁切换而造成服务器的瓶颈,
    nginx采用多阶段异步处理,这样就不会造成进程睡眠而产生的资源浪费.

nginx的事件驱动+多阶段异步处理机制:
    nginx完全采用事件驱动架构来处理业务,他不同于传统的事件驱动模型.他不会为单个消费事件去创建一个线程或进程,他只是把消费事件当作一个模块,只有收集分发器才会占用资源,他们会分发某个事件时候调用消费模块使用当前占用的进程资源.
nginx多阶段的划分方法:
  1.将阻塞方法根据触发事件划分成多个阶段
    第一阶段:将阻塞方法转换成非阻塞方法,第二阶段将处理返回结果.
  2.将阻塞方法根据时间划分成多个阶段
    如果阻塞方法没有对应的非阻塞方法,并且阻塞方法消耗的时间是可测并且可划分的,那么->第一阶段分解阻塞方法划分成多个极短时间的阻塞方法,第二个阶段处理结果,并在一定情况下再次调用第一步.
  3.对于空转的情况,使用定时器解决.
  4.对于无法将阻塞方法划分的情况,只能将阻塞调用放在一个独立的进程,等到阻塞方法调用完成后在通知原进程.(慎用,这条违反了nginx的设计规则)

多阶段请求异步连接提高了网络性能,降低了请求延时.
(web影响并发的因素:睡眠+线程(进程)切换)
传统web与nginx的比较:
    传统web服务器的每个事件消费者独占一个进程(线程)资源,这种情况对于用户规模较小的情况来说,用户响应速度快,但是当并发规模达到数十万上百万的时候,由于线程(进程)数目过多,会频繁的切换,而且当线程阻塞的时候会进行睡眠,也会造成资源的浪费,这样服务器就会产生瓶颈.
    nginx服务器采用的事件驱动机制不同,他不会为每个消费事件创建一个进程或线程,这样就不会产生由于进程间频繁切换占用cpu而产生的瓶颈,而且nginx不会让事件阻塞,即采用无阻塞事件驱动模型,这样就不会因为事件阻塞使进程睡眠而造成的资源浪费.
nginx将一个请求划分成多个阶段异步处理,每个阶段仅仅完成一个请求中的一部分,当本阶段任务完成后进入下一阶段.等待事件发生不是阻塞的等待,等待事件发生时候内核通知,在等待阶段继续处理其他任务.


nginx优点:
  对阶段异步处理+事件驱动机制可以是并发达到百万以上,极大的提高服务器的响应速度,增加了用户体验.

这篇关于nginx的事件驱动模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102979

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Nginx配置location+rewrite实现隐性域名配置

《Nginx配置location+rewrite实现隐性域名配置》本文主要介绍了Nginx配置location+rewrite实现隐性域名配置,包括基于根目录、条件和反向代理+rewrite配置的隐性... 目录1、配置基于根目录的隐性域名(就是nginx反向代理)2、配置基于条件的隐性域名2.1、基于条件

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

Nginx如何进行流量按比例转发

《Nginx如何进行流量按比例转发》Nginx可以借助split_clients指令或通过weight参数以及Lua脚本实现流量按比例转发,下面小编就为大家介绍一下两种方式具体的操作步骤吧... 目录方式一:借助split_clients指令1. 配置split_clients2. 配置后端服务器组3. 配

Nginx实现前端灰度发布

《Nginx实现前端灰度发布》灰度发布是一种重要的策略,它允许我们在不影响所有用户的情况下,逐步推出新功能或更新,通过灰度发布,我们可以测试新版本的稳定性和性能,下面就来介绍一下前端灰度发布的使用,感... 目录前言一、基于权重的流量分配二、基于 Cookie 的分流三、基于请求头的分流四、基于请求参数的分

一文详解Nginx的强缓存和协商缓存

《一文详解Nginx的强缓存和协商缓存》这篇文章主要为大家详细介绍了Nginx中强缓存和协商缓存的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、强缓存(Strong Cache)1. 定义2. 响应头3. Nginx 配置示例4. 行为5. 适用场景二、协商缓存(协

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co