行业新闻

中间件--Web Server--Nginx

中间件--Web Server--Nginx

ngingertion.

事件驱动适用于IO密集型服务(Nginx),多流程或线程适用于CPU密集型服务(Apache),因此Nginx适用于反向代理,而不是web服务器。

基本架构设计

1.接口设计

所有模块都遵循ngx_module_t接口设计规范。

2.Ngnix核心及其常用模块设计关系

总共有四个模块。

首先是配置模块,它是所有模块的基础,实现了最基本的配置项分析功能。

nginx定义了一个基本类型的模块:NGX_CORE_MODULE的核心模块。定义核心模块的目的是使非模块化框架代码只关注和如何调用六个核心模块。

事件模块、HTTP模块和mail模块的共同点是:事实上,它们在核心模块中有一个模块作为代言人,在类似模块中有一个模块作为核心业务和管理功能。

事件模块是HTTP模块和Mail模块的基础。

Nginx核心进程模型

首先,正常执行将有多个过程。基本执行是Pocester(Rocess)(Rocess)(Rocess)(Rocess)(Rocess)(RocesterProcess)。

1.master进程

监控过程作为整个过程组与用户之间的交互接口,同时监控过程。它不需要处理网络事件,也不负责业务的实施。只有通过管理worker过程,才能实现重启服务、平稳升级、更换日志文件、配置文件的实时生效。

TIPS:在master过程中,for(:)无限循环中有一个关键的sigsuspend()函数调用,即master过程的大部分时间都挂起,直到master过程收到信号。

2.worker进程

基本的网络事件是在worker过程中处理的,wenkor之间的过程是平等的,只能在同一个wenkor中处理,一个wenkor过程不能处理其他过程的要求。

一般来说,wenkor的数量与cpu的数量相同,因此当我们在8080端口提供http请求服务时,每个过程都有可能处理此链接。因为更多的worker只会导致过程中对cpu资源的竞争,从而带来不必要的上下文切换

3.处理过程

master(master过程将首先建立需要listen的socket)——–fork生成子过程workers,继承socket(此时workers子过程继承了父亲过程master的所有属性,当然包括已经建立的socket,当然不是同一个socket,但是每个过程的socket将监控在同一个ip地址和端口,允许在网络协议中)——当一个连接进入时,会产生惊喜。

惊喜现象:一般来说,当一个连接进来时,accept上的所有过程都会收到通知,只有一个过程可以连接到accept,其他的则会失败。

处理Nginx的惊喜现象:

当worker过程连接到accept时,开始读取请求,分析请求,处理请求,生成数据,然后返回到客户端,最后断开连接,一个完整的请求。请求完全由worker过程处理,只在worker过程中处理。

Nginx事件处理机制:

首先,网络事件、信号、定时器是web服务器的基本事务类型。

1.非ngnix采用异步阻塞的事件处理机制,通过过程循环处理多个准备好的事件,实现高并发性和轻量级。

通知worker

请将主动转换为未准备的poll:当事件未准备好时,将其放入epol中。如果事件准备好了,那就处理它;如果事件返回EAGAIN,请继续进入epoll。因此,只要事件准备好了,我们就会处理她。只有当我们没有准备好所有的时间时,我们才会在epoll等待。这样,我们就可以并发处理大量的并发性。当然,这里的并发性请求是指只有一个未完成的请求,因此同时处理只有一个请求。当然,这只是一个请求,因为异步准备好了。

这里的切换没有成本,你可以理解为循环处理多个准备好的事件

题外问题

Nginx和Apache在高并发处理区别

对于Apache,每个请求将独占一个工作线程。当并发数达到数千时,数千个线程同时处理请求。这对于操作系统来说占用了很大的内存,线程上下文切换带来的cpu成本也很大,性能很难提高。同时,这些费用毫无意义。

对于Nginx来说,一个过程只有一个主线程,循环处理多个准备好的事件,通过异步非阻塞事件处理机制实现轻量级和高并发性。

Nginx比较Apache:事件驱动适用于IO密集型服务,多过程或线程适用于CPU密集型服务

1.Nginx主要用作反向代理,而不是Web服务器。其网络模式是事件驱动(select、poll、epoll)。

二是IO事件驱动的本质,应用程序在多个IO句柄之间快速切换,实现所谓的异步IO。

3.最适合的事件驱动服务器是这种IO密集型工作,如反向代理,它在客户端和WEB服务器之间发挥数据转移作用,纯粹是IO操作,不涉及复杂的计算。

4.用事件驱动反向代理显然更好。一个工作过程可以run,没有过程和线程管理的费用,CPU和内存消耗都很小。

5.gint也可以是多进程。

6.静态文件nginx的处理效果也很好,因为静态文件本身也是磁盘IO操作,处理过程相同。至于多少万个并发连接,这是毫无意义的。我可以处理数万7个并发程序,但如果大多数客户被阻塞,它就毫无价值了。

让我们来看看像Apache或Resin这样的应用服务器。他们之所以被称为应用服务器,是因为他们真的想运行特定的业务应用程序,如科学计算、图形图像、数据库读写等。它们可能是CPU密集型服务,不适合事件驱动。

1.比如一个计算需要2秒,那么这2秒就完全堵塞了,没用。想想MySQL如果变成事件驱动会发生什么,一个大型join或sort会堵塞所有客户端。

2.此时,多过程或线程反映了优势。每个过程都做自己的事情,不会相互阻塞和干扰。当然,现代CPU越来越快,单个计算阻塞的时间可能很小,但只要有阻塞,事件编程就没有优势。因此,过程和线程技术不会消失,而是与事件机制相辅相成,长期存在。

综上所述,事件驱动适用于IO密集型服务,多流程或线程适用于CPU密集型服务,各有优势,没有取代任何人的倾向。