Apache和Nginx是什么?|Nginx和Reactor是什么?|网路IO的本质|阻塞队列|异步非阻塞IO

news2024/11/25 7:14:15

前言

那么这里博主先安利一些干货满满的专栏了!

首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。

高质量干货博客汇总https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482


前期概念准备

首先,想要搞明白Nginx和Apache,我们首先要对网络IO的相关概念做了解,这是非常重要的。什么是阻塞IO,什么是非阻塞IO,什么是异步IO,什么是多路转接,什么是reactor模式,这些大家都要先搞清楚,本期博客的内容,大家才能明白。

因此对于上面这些内容,博主做了详细的解释和讲解,在上一篇博客中,如果对网络IO相关概念还不了解的伙伴们,先看完上一篇,再来学习这一篇

什么是IO?IO的本质?|如何让IO变得高效?何为高效?|异步IO|多路转接|reactor模式https://blog.csdn.net/Yu_Cblog/article/details/131778346?spm=1001.2014.3001.5501

Apache和Nginx

Apache HTTP服务器的底层原理

Apache HTTP服务器采用了经典的多进程/多线程模型。它的主要组件包括主进程/线程(Master Process/thread)和工作进程线程(Worker Process/thread)。当Apache启动时,主进程首先被创建,并监听指定的端口,等待客户端连接。当有新的连接请求到达时,主进程接受该连接并将其分派给一个可用的工作进程。

通俗来说,就是多线程或者多进程,当然一般是用线程的,因为线程占用cpu资源少。其实就是一个主线程,在统一管理一些新线程。服务器启动,一个主线程被创建,如果底层来链接了,则创建一个新线程,调用accept,则这个新线程专门用于处理这一个特定的链接,直到链接关闭。来一个链接,主线程就创建一个新线程,本质就是用新线程去接任务的道理。当然这种方案是可以优化的,一般会做一个线程池去完成这些事情,先创建好一堆线程,然后来链接了,则一个线程去领任务,如果线程池线程不够了,可以选择创建,或者阻塞等其他线程释放。

那么这种方法问题在哪呢?如果一个链接来了,是一个长链接,我赖着不走,也不给你发消息,那你这领任务线程咋办?就只能被这个占着坑位不干活的链接吊着,既不能释放,也不能工作。如果这样的长链接很多,这是非常吃CPU资源的!

Nginx的底层原理

Nginx采用了事件驱动的、异步的单进程模型。它的底层结构由多个模块组成,包括事件模块、HTTP模块、反向代理模块等。

核心组件是事件模块,它利用操作系统提供的异步I/O机制(如epoll、kqueue)来实现高效的事件处理。Nginx的主进程是一个事件驱动的Reactor,通过事件循环(Event Loop)监听和接受客户端连接。当有新的连接到达时,主进程会将连接分发给一个可用的工作进程。

工作进程(Worker Process)是Nginx实际处理请求的执行者。每个工作进程都是独立的,并且在多个连接间共享相同的事件循环。工作进程通过事件驱动的方式处理请求,包括读取请求、解析请求头、处理请求逻辑、生成响应等。在处理请求的过程中,Nginx使用非阻塞I/O操作,充分利用异步I/O机制来提高并发处理能力。

reactor(用linux下的epoll为例)

其中reactor就是Nginx的核心构件,我直接举一个例子解释,什么是事件循环,什么是监听这些东西。直接举例子,大家就明白了。对于一个HTTP请求而言:

对于一个服务器,肯定有一个监听套接字listensock。当服务器开启之后,肯定会有其他地方来的许多链接,想和我们这个服务器三次握手,因此我们有连接来了,应该去accept对吧?但是现在在epoll多路转接模式下,不能直接让listensock去accept!为什么,因为我不知道什么时候来链接啊,如果链接没来,我调用accept不就阻塞了?因此,我们应该把listensock放到epoll里面去注册!!然后直接返回,不用阻塞!注册好之后,如果链接来了,也就是说listensock套接字(套接字的本质就是文件描述符,这些基本的概念博主也不赘述了)的读事件就绪了!epoll就会通知我!我此时再去accept,此时是一定不会被阻塞了!因为epoll告诉我,listensock的读事件已经就绪了!

那么我们知道accept之后的套接字,也就是普通套接字,可能会给我们发消息的,那么按照之前的方法,直接调用read行吗?肯定是不行的!没消息来你read什么,没消息你read不就阻塞了?epoll里面不能有这么低级的操作。因此,同样,注册到epoll里面去!啥时候来消息了,epoll告诉你,你就不用管了,直接返回。

整个过程将一个请求分成了多个阶段,每个阶段都会在许多模块中注册并进行处理,而且所有的操作都是异步非阻塞的。异步在这里表示服务器执行一个任务后无需等待返回结果,而是在完成后自动接收通知。

整个过程是单进程单线程的,但是高并发!长链接来了我不怕啊,你只是注册在epoll里面,你不来消息,我就不在你身上花时间(调用read),因此这种方式非常的高效!!!!!这种方式使得服务器能够高效处理多个并发请求,并能在等待I/O操作期间执行其他任务,以提高整体性能。

epoll的底层是什么?相比于select和poll的优势在哪?这些可以看博主在github上关于多路转接的一个项目,里面说的非常的清晰了!

Multiplexing-high-performance-IO-serverhttps://github.com/Yufccode/Multiplexing-high-performance-IO-server

reactor只有epoll吗?

Reactor模式是一种设计模式,用于构建事件驱动的应用程序。在Reactor模式中,有一个事件循环(Event Loop)负责监听事件并调度对应的处理程序。具体的底层实现可以采用多种技术和系统调用,其中epoll是Linux系统下常用的事件通知机制之一。

在Linux系统中,epoll提供了高效的I/O事件通知机制,使得服务器能够处理大量的并发连接。因此,很多Reactor模式的实现会选择使用epoll作为底层的事件通知机制,以实现高性能的事件驱动。

然而,Reactor模式的底层实现并不仅限于epoll,它也可以使用其他的事件通知机制,如select、poll等,或者在其他操作系统上使用相应的机制,如kqueue(在FreeBSD和Mac OS X上)或IOCP(在Windows上)。

因此,Reactor模式并不依赖于特定的底层实现,而是关注于事件驱动的设计思想和模式。具体的底层实现取决于操作系统和开发者选择的事件通知机制。

Nginx的一些其他功能

此外,Nginx还提供了强大的模块化架构,用户可以根据需求选择和配置不同的模块。Nginx的模块可以实现诸如负载均衡、缓存、反向代理、SSL/TLS加密等功能。模块可以通过配置文件进行加载和配置,使得Nginx具有很高的灵活性和可扩展性。

一个基于Reactor模型的Http服务器

最近博主就在做一个这样的http服务器,基于Reactor异步IO,底层多路转接的方式实现的,可以达到高效率的要求。

现在这个项目的后端已经基本完善了,现在还在完善一些细节,希望大家多多支持这个项目~~

Reactor-based-HyperWebServerhttps://github.com/Yufccode/Reactor-based-HyperWebServer

总结

无论是Nginx还是Squid等反向代理服务器,它们都采用了事件驱动的网络模式。事件驱动实际上是一项古老的技术,早期使用的是select和poll等机制。随后,基于内核通知的更高级事件机制出现,例如libevent中的epoll,这提高了事件驱动的性能。事件驱动的核心仍然是I/O事件,应用程序能够快速切换在多个I/O句柄之间,实现所谓的异步I/O。事件驱动服务器非常适合处理I/O密集型任务,例如反向代理,它充当客户端和Web服务器之间的数据中转站,仅涉及纯粹的I/O操作,而不涉及复杂的计算。使用事件驱动来构建反向代理是更好的选择,一个工作进程即可运行,无需管理进程和线程带来的开销,同时CPU和内存消耗也较小。

因此,Nginx和Squid等服务器都是采用这种方式实现的。当然,Nginx也可以采用多进程加事件驱动的模式,几个进程运行libevent,而无需像Apache那样需要数百个进程。Nginx在处理静态文件时也表现出色,这是因为静态文件本身也属于磁盘I/O操作,处理方式相同。至于所谓的数万并发连接,这并没有多大意义。随手编写一个网络程序就可以处理数万个并发连接,但如果大多数客户端都被阻塞在某处,那就没有多少价值了。

再来看看像Apache或Resin这样的应用服务器,它们之所以被称为应用服务器,是因为它们需要运行具体的业务应用程序,如科学计算、图形图像处理、数据库读写等。它们很可能是CPU密集型的服务,而事件驱动并不适合此类情况。举个例子,如果某项计算需要2秒的耗时,那么这2秒将完全阻塞进程,事件机制毫无作用。想象一下,如果MySQL改用事件驱动,一个大型的join或sort操作将阻塞所有客户端。在这种情况下,多进程或多线程展现出优势,每个进程可以独立地执行任务,彼此不会阻塞或干扰。当然,现代CPU速度越来越快,单个计算的阻塞时间可能很短,但只要存在阻塞,事件编程就不具备优势。因此,进程和线程等技术不会消失,而是与事件机制相辅相成,并将长期存在。

总而言之,事件驱动适用于I/O密集型服务,而多进程或多线程适用于CPU密集型服务。它们各自具有优势,并不存在取代彼此的趋势。

本段文字参考:

版权声明:本文为CSDN博主「席飞剑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:Apache与Nginx网络模型_nginx和apache什么网络模型_席飞剑的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/775014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pandas 笔记:melt函数

和pivot_index 相反,前者是长表转宽表,melt是宽表转长表 pandas 笔记:pivot_table 数据透视表_UQI-LIUWJ的博客-CSDN博客 1 基本使用方法 pandas.melt(frame, id_varsNone, value_varsNone, var_nameNone, value_namevalue, col_levelNone…

【Linux】Zookeeper集群 + Fafka集群

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Zookeeper集群 Fafka集群 Zookeeper 概述Zookeeper 定义Zookeeper 工作机制Zookeeper 特点Zookeeper 数据结构Zookeeper 应用场景Zookeeper 选举机制 Kafka 概述为什么需要消…

⚡【C语言趣味教程】(3) 浮点类型:单精度浮点数 | 双精度浮点型 | IEEE754 标准 | 介绍雷神之锤 III 源码中的平方根倒数速算法 | 浮点数类型的表达方式

🔗 《C语言趣味教程》👈 猛戳订阅!!! ​—— 热门专栏《维生素C语言》的重制版 —— 💭 写在前面:这是一套 C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅&#…

laravel 的SQL使用正则匹配

案例场景 精准正则匹配 查询结果 代码如下 $regexp ^ . $new_str . [^0-9];$info Test::query()->where(is_del, 0)->whereRaw("name REGEXP $regexp")->pluck(name, id)->toArray();字符 “^” 匹配以特定字符或者字符串开头的文本 name 字段值包含…

国产单片机(沁恒微WCH)CH32V307评估板初探

国产单片机(沁恒微WCH)CH32V307评估板初探 关于沁恒微:国产芯厂家、官网链接 公司简介 - 南京沁恒微电子股份有限公司 (wch.cn) 开发板资源: 评估板应用于 CH32V307 芯片的开发,IDE 使用 MounRiver 编译器,可选择使用板载或独…

Python自动化办公:docx篇

文章目录 简介官方demo读取并修改已存在的docx参考文献 202201笔记迁移 简介 python的docx包是可以用来自动化处理docx文件,可以从无到有生成一个docx文件,也可以对已有的docx文件做批量修改。(但印象里是只能操作.docx文件,如果…

【电路原理学习笔记】第5章:串联电路:5.2 串联电路的总电阻

第5章:串联电路 5.2 串联电路的总电阻 5.2.1 串联电阻相加 由于每个电阻对电流的阻力与其阻值成正比,因此,当电阻串联时,电阻值要相加串联电阻的数量越多,对电流的阻力就越大,也就意味着更大的电阻。因此…

收入下滑,亏损严重,面临法律诉讼的中驰车福申请纳斯达克IPO上市

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,来自北京的汽车产业供应链数字化服务商【中驰车福】(Autozi Internet Technology (Global) Ltd)近期已向美国证券交易委员会(SEC)提交招股书&#x…

新建Mybatis流程

删除src目录 pom文件夹下导入依赖 这样的话每次只用改父项目的内容,就不必每次都导包 1.修改这三个文件 2.mybatis-config.xml的配置文件有顺序的规定,properties需要写在最上面。 3.类型别名

Bridging the Gap Between Anchor-based and Anchor-free Detection via ATSS 论文学习

1. 解决了什么问题? Anchor-based 和 anchor-free 方法的本质差异其实是如何定义正负样本,如果训练过程中它们采用相同的正负样本定义,最终的表现是差不多的。也就是说,如何选取正负样本才是最重要的。 以单阶段 anchor-based 方…

C++初探

目录 经典开头 — C的历史 作用域运算符 using的用法 命名空间 - namespace 命名空间的基本使用 特殊的命名空间 - 无名命名空间 全部展开和部分展开 std — C所有的标准库都在std命名空间内 省缺值 - 默认参数 占位参数 内联函数 - inline 函数重载 函数重载的用…

MySQL八股学习过程2行的存储 from 小林coding

MySQL八股学习过程2行的存储 from 小林coding MySQL数据的存放MySQL表结构InnoDB行格式记录的额外信息记录的真实数据 MySQL数据的存放 下面的命令能够查询到MySQL数据库文件的存放位置 SHOW VARIABLES LIKE datadir;一张表的结构会保存在表同名.frm中,数据会保存在表同名.ib…

导轨式 称重传感器 压力应变桥信号处理 隔离变送器

主要特性 DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源,向输入端和输…

Kyuubi的介绍优势(官网链接)

官网链接:https://kyuubi.apache.org/ Apache Kyuubi™ 是一个分布式多租户网关,用于在数据仓库和 Lakehouse 上提供无服务器 SQL。 Kyuubi 在各种现代计算框架(例如 Apache Spark、 Flink、 Doris、 Hive和Trino等)之上构建分布…

CMU 15-445 Project #2 - B+Tree(CHECKPOINT #2)

CHECKPOINT #2 一、题目链接二、准备工作三、部分实现1.锁操作操作类型定义安全页面判断加锁操作解锁操作叶子页面查找操作 2.查找操作3.插入操作4.删除操作 四、评测结果 一、题目链接 二、准备工作 见 CMU 15-445 Project #0 - C Primer 中的准备工作。 三、部分实现 1.锁操…

linux安装conda

linux安装conda 卸载conda 在主目录下,使用普通权限安装: ./Anaconda3-2023.03-1-Linux-x86_64.shanaconda的目录是ENTER

139. 单词拆分

139. 单词拆分 原题链接:完成情况:解题思路:参考代码: 原题链接: 139. 单词拆分 https://leetcode.cn/problems/word-break/ 完成情况: 解题思路: dp动态递归去接,算0-n所有范围…

Xshell 7 评估期已过继续免费使用方法

1. 评估期已过的示例 2.解决方法 如果需要继续使用,一是去网上寻找绿色版本的Xshell,但是可能不安全。 二是重新下载一个免费版本,覆盖安装即可。 2.1 官网下载地址:https://www.xshell.com/zh/free-for-home-school/ 2.2下载安…

Pytorch:利用torchvision调用各种网络的预训练模型,完成CIFAR10数据集的各种分类任务

2023.7.19 cifar10百科: [ 数据集 ] CIFAR-10 数据集介绍_cifar10_Horizon Max的博客-CSDN博客 torchvision各种预训练模型的调用方法: pytorch最全预训练模型下载与调用_pytorch预训练模型下载_Jorbol的博客-CSDN博客 CIFAR10数据集下载并转换为图片&am…

gitlab配置公钥

1、打开本地git bash,使用如下命令生成ssh公钥和私钥对 ssh-keygen -t rsa -C yourEmailgitlab.com2、然后打开~/.ssh/id_rsa.pub文件,复制里面的内容 cd ~/.ssh ls cat ./id_rsa.pub3、打开gitlab,找到Profile Settings–>SSH Keys—>Add SSH Key,并把上一…