模块化结构的思想是一个很久的概念,但也正是成熟的思想造就了Nginx的巨大优越性。
我们知道Nginx从总体上来讲是有许多个模块构成的。习惯将Nginx分为5大模块分别为:核心模块,标准HTTP模块,可选HTTP模块,邮件服务模块和第三方模块。
这5个模块由上到下重要性一次递减。
(1)核心模块;
核心模块是Nginx服务器正常运行必不可少的模块,如同操作系统的内核。它提供了Nginx最基本的核心服务。像进程管理、权限控制、错误日志记录等;
(2)标准HTTP模块;
标准HTTP模块支持标准的HTTP的功能;
(3)可选HTTP模块;
可选HTTP模块主要用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务;
(4)邮件服务模块;
邮件服务模块主要用于支持Nginx的邮件服务;
(5)第三方模块;
第三方模块是为了扩展Nginx服务器应用,完成开发者想要的功能;
*******Nginx中的模块命名有自己的习惯*********
一般以Ngx_作为前缀,——module作为后缀,中间使用一个或者多个英文单词描述模块的工能,例如Ngx_core_module表示该模块提供Nginx的核心功能等;
具体各个模块中包含哪些模块可以自己去源码中查询,这里略过;
从架构设计上说,Nginx服务器是与众不同的。其一在于它的模块化设计;其二也是更重要的一点在于它对与客户端请求的处理机制上;
web服务器和客户端是一对多的关系,Web服务器必须有能力同时为多个客户端提供服务。一般来说完成并行处理请求工作有三种方式:
1.多进程方式;
2.多线程方式;
3.异步方式;
这里简单说明一下这三种方式:
(1)多进程方式
多进程方式指,服务器每当收到一个客户端时。就有服务器主进程生成一个子进程出来和客户端建立连接进行交互。指导连接断开。该子进程就结束了。
多进程方式的优点是设计简单,各个子进程相对独立,处理客户端请求时彼此不受干扰;缺点是操作系统生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定的开销;当有大量请求时,会导致系统性能下降;
(2)多线程方式
多线程方式指每当服务器接收到一个请求后,会由服务器主进程派生出一个线程出来和客户端进行交互。由于操作系统产生出一个线程的开销远远小于一个进程的开销。故多线程方式在很大程度上减轻了Web服务器对系统资源的要求。但同时由于多个线程位于一个进程内,可以访问同样的内存空间。所以需要开发者自己对内存进程管理,增大了难度。
(3)异步方式
异步方式适合多进程和多线程完全不同的一种处理客户端请求的方式。这里有几个概念我们需要熟悉一下: 同步,异步,阻塞,非阻塞 ;
在网络通信中同步和异步是描述通信模式的概念。
同步:发送方发送完请求后,需要等待接收到接收方发回的响应,才能发送下一个请求;所有请求在服务端得到同步,发送方和接收方的步调是一致的;
异步 :和同步机制相反,在异步机制中,发送方发出一个请求后,不等接收方响应这个请求,就继续发送下一个请求;所有来自发送方的请求形成一个队列,接收方处理完成后通知发送方;
在进程处理调度方式上用阻塞与非阻塞。在网络通信中主要指套接字socket的阻塞和非阻塞,而socket的实质就是IO操作。
阻塞 :调用结果返回之前,当前线程从运行状态被挂起,一直等到调用结果返回之后,才进入就绪状态,获取CPU后继续执行。
非阻塞 :和阻塞方式正好相反,如果调用结果不能马上返回,当前线程也不会马上返回,而是立即返回执行下一个调用。
因此就衍生出4中方式:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞
这里简单解释一下异步非阻塞:发送方向接收方发送请求后,不用等待响应,可以继续其他工作;接收方处理请求时进行的IO操作如果不能马上得到结果,也不必等待,而是马上返回去去做其他事情。当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。
与此同时Nginx服务器处理请求是怎样的呢???
Nginx服务器的一个显著的优势就是能够同时处理大量的并发请求。它结合多进程机制和异步机制。异步机制使用的是异步非阻塞方式。(Master-Worker)。
每个工作进程使用异步非阻塞方式,可以处理多个客户端请求。当某个工作进程接收到客户端的请求以后,调用IO进行处理,如果不能立即得到结果,就去处理其他的请求;而客户端在此期间也无需等待响应,可以去处理其他事情;当IO返回时,就会通知此工作进程;该进程得到通知,暂时挂起当前处理的失误去响应客户端请求。
也就是:
Nginx采用异步非阻塞方式来处理请求,处理请求具体到系统底层就是读写事件(所谓阻塞调用方式即请求事件还没准备好,线程只能一直去等,等事件准备好了再处理;而非阻塞即事件没准备好,马上返回ENGAIN,告诉你事件还没准准备好,而在这期间可以先去做其他事,再回头看看事件准备好了吗,时不时会看,需要的开销也是不小的)
异步可以理解为循环处理多个准备好的事件,不会导致无谓的资源浪费,当有更多的并发数只会占用更多的内存而已
从上面我们可以知道,Nginx服务器的工作进程调用IO后,就取进行其他工作了;当IO调用返回后,会通知工作进程。 但IO调用时如何把自己的状态通知给工作进程的呢??
一般解决这个问题有两种方法:
(1)让工作进程在进行其他工作的过程中间隔一段时间就去检查一下IO的状态,如果完成就响应客户端,如果未完成,继续工作。
(2)IO调用在完成后能主动通知工作进程。
当然最好的就是用第二种方法了;像select/poll/epoll等这样的系统调用就是用来支持第二种解决方案的。这些系统调用也常被称为事件驱动模型。他们提供了一种机制就只让进程同时处理多个并发请求,不用关心IO调用的具体状态。IO调用完全由事件驱动模型来管理。
Nginx中的事件驱动模型
就是用事件驱动处理库(多路IO复用),最常用的就是select模型,poll模型,epoll模型。
关于这三个模型的详解在这里可以看到:https://segmentfault.com/a/1190000003063859
通过这个上面的简单讲解,再加上服务器的架构的了解,可以对Nginx有一个简单的了解,希望对之后的源码剖析有帮助。
大致上Nginx的架构就是这样:
1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程;
2.在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和组织;
3.Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将 历史 应答数据缓存到本地。保障对缓存文件的快速访问;
##工作进程##
工作进程的主要工作有以下几项:
接收客户端请求;
将请求一次送入各个功能模块进行过滤处理;
IO调用,获取响应数据;
与后端服务器通信,接收后端服务器处理结果;
数据缓存
响应客户端请求;
##进程交互##
Nginx服务器在使用Master-Worker模型时,会涉及到主进程和工作进程的交互和工作进程之间的交互。这两类交互都依赖于管道机制。
1.Master-Worker交互
这条管道与普通的管道不同,它是由主进程指向工作进程的单向管道,包含主进程向工作进程发出的指令,工作进程ID等;同时主进程与外界通过信号通信;
2.worker-worker交互
这种交互是和Master-Worker交互是基本一致的。但是会通过主进程。工作进程之间是相互隔离的,所以当工作进程W1需要向工作进程W2发指令时,首先找到W2的进程ID,然后将正确的指令写入指向W2的通道。W2收到信号采取相应的措施。
尽管 Web 多年来取得了许多进步,但许多用户仍然担心其当前结构对其施加的限制。因此,除其他外,越来越多的人相信 Web 3.0 提供了卓越的体验,这是您应该了解的有关 Web 3.0 的所有信息。
在互联网的早期,内容是从 ISP(互联网服务提供商)托管的静态网站或 GeoCities 等网站消费的。信息的交换速度比以往任何时候都快得多,但交互性很低。
随着 1999 年服务器技术的进步,互联网连接速度提高,使从 Web 1.0 到 Web 2.0 的过渡更快。
快进到 2000 年代初期 Web 2.0 的曙光,随着越来越多的用户被赋予创建内容的能力,交互性激增。MySpace 和 Facebook 等社交媒体网站鼓励互动,因为人们会生成不同形式的内容。Web 2.0 时代在很大程度上由三件事定义:移动、社交和云。
万维网的创始人蒂姆·伯纳斯·李将 Web 3.0 描述为“读写执行”。它是 Web 的一个版本,它赋予用户创建和执行他们自己的工具和软件的能力,而不是依赖其他人来获取软件。
Web 3.0 虽然仍处于起步阶段,但有望使开放、去信任和无需许可的网络成为可能。它由几个元素组成,这些元素可以作为其成功的基石:边缘计算、分散数据网络、3D 图形和人工智能。
语义网是 1990 年代万维网联盟成员提出的一个概念。它旨在赋予单词以意义,以便机器可以读取网络上的内容。这使程序可以更轻松地在 Web 上共享、连接和创建内容。
有了语义网,程序将能够组织更广泛的数据集来执行任务。例如,目前很多内容都没有标记,这意味着搜索引擎主要依靠关键字来识别相关内容。这可能导致不太准确的搜索结果。在互联网上创建一种通用语言将有助于使内容的组织、创建和使用更加可靠。
人工智能将成为构建未来网络的重要工具。语义网使人工智能更容易执行自然语言处理,从而获得更快、更准确的搜索结果,以及其他好处。
三维设计将成为 Web 3.0 的优先事项,因为用户可以从博物馆指南和计算机 游戏 中增强的交互性中获益。从文本到视觉显示的过渡可能构成 Web 3.0 运动的主要部分。
区块链网络提供了存储和使用数据的新方法。区块链的透明、去中心化网络与其共识系统相结合,可以根据嵌入代码中的商定规则共享可验证的信息。
互联网的当前结构基于大众分类法,这是一种使用用户添加的标签和标签来组织数据和数字内容的方法,以识别内容。
网页是链接的,网站之间共享的数据在很大程度上取决于其内容的人群知识。借助 Web 3.0,机器可以识别更广泛的数据集以对内容进行分类。这使得用更有用的内容吸引用户变得更容易。
在 Web 2.0 上提供数字 社会 信任层的中介往往依赖于价值的提取而不是吸引。他们拥有不成比例的高权力水平,这使人们在他们的平台上面临丢失他们不想泄露的数据的风险。
例如,传输控制协议/互联网协议有助于确定我们的计算机如何从全球服务器上的不同数据库请求数据。很大一部分数据库和服务器是集中式的,这就质疑人们对他们的数据真正拥有多少控制权。
开发人员工具也高度集中,因为它们几乎总是由私人公司所有。这包括 Facebook 等大型 科技 公司拥有的 API。
此外,开发人员制作网站和应用程序所依赖的网络平台默认是私有的,这意味着需要复杂的权限集(通常来自大型 科技 公司)才能使用网络开发软件。这形成了具有严格规则的封闭网络。
去中心化互联网(Web 3.0)的底层数据结构基于区块链而非传统数据库。数据结构消除了对用户名和密码的需要,区块链的防篡改特性使不同组之间在开放项目上的协作变得容易。
项目可以托管在分散的云和独立的数据中心上,这是公共网络和工具的完美结构。这意味着任何人都可以使用此类平台,而无需获得大型 科技 公司或中心化看门人的许可。
网络的透明度意味着可以实现真正免费的互联网,因为人们更难以进行审查或在其应用程序中包含恶意代码。
正如我们所知,网络为我们提供了很好的服务,提供了无尽的信息海洋来改善我们的日常生活。
尽管如此,它还是提出了许多 Web 3.0 可以解决的挑战。尽管 Web 3.0 前景广阔,但仍有很长的路要走。信息的无缝交换需要 Web 3.0 项目之间更加统一。此外,还需要为 Web 3.0 构建更多结构才能真正取得成功。
新的交易系统很可能是 Web 3.0 的产物,因为区块链在定义不同网络的激励措施方面变得越来越重要,在这些网络中人们可以更好地控制自己的数据以及与谁共享数据。
隐私条款
3D人体解剖图谱重视用户的隐私。您在使用我们的产品(包含服务)时,我们可能会收集并使用您的相关信息用以提高服务质量,我们会在商业上合理的范围内尽一切可能保护您的隐私。我们建议您阅读该《隐私条款》以详细了解我们收集何种信息,如何收集信息以及如何处理或使用这些信息。 当您使用我们的产品或服务时,您同意我们在遵循该策略及当地法律的前提下收集,存储并使用您的信息。
该《隐私条款》中将涉及到一些专业性的术语,我们会用尽可能简洁的方式向您解释,以便您理解。
信息的收集与使用
我们收集并存储某些您的个人信息用于创建3D人体解剖图谱帐户,并为后续服务提供必要的支持。如果您不想我们提供这些信息,可能无法注册或无法享受我们提供的某些服务,或者部分功能无法达到最佳体验。未注册用户也可以所有功能,我们不会收集未注册用户的个人信息。
我们获取的个人信息包括
您在注册账户或使用我们的服务时填写的姓名,电子邮箱,邮寄地址,电话号码以及上传的头像图片或银行卡号等。其中银行卡或信用卡用于支付公司名科技的服务或产品。当使用“共享照片流”或“分享”服务时向我们或其他方提供的信息。
我们获取的其他信息包括
您在与服务交互时所使用的电脑设备的地理区域, 您的系统语言,以及您正在使用的设备和软件类型或操作系统版本号,这些信息可以帮助我们更加了解您以便优化服务使您获得更好的体验。
您在使用我们产品时的运行日志,包括统计信息,关键操作路径,错误日志,崩溃记录等。帮助我们更好的了解产品的状况,以便改进服务体验并提供更加优质的产品。
您照片(或同类文件)中包含的地理位置信息及文件创建时间,您照片中包含的粗略人物特征,您照片中包含的内容。我们将利用这些信息为您提供“人物聚合”,“地理位置聚合”,“内容标签”以及由这些基础功能组合而成的其他定制功能。
您可以关闭“3D人体解剖图谱云服务”,这样我们将不会收集与照片(或同类文件)相关的信息。但同样的,你也无法使用需要这些信息支持的功能。
您可以关闭计算机或收集的gps定位功能,这样我们将不会获得您当前的地理位置信息。您需要使用一个电子邮件地址或电话创建一个3D人体解剖图谱账户,这样您才可以充分使用3D人体解剖图谱的完整服务。
我们可能通过电子邮件或系统通知向你发送通知,当你不希望接收这些消息时,可以按照相关提示在设备上或应用内关闭。
您可以随时停止使用我们的服务,当您删除数据后由于电脑系统的运行和持续数据备份及存档特性,服务器中残存的副本可能会过一段时间才能清除。
公开的信息
当您使用3D人体解剖图谱的产品或服务时,我们默认您已经允许并同意该条款。因此,我们不会在除以下任何情况之外与任何第三方分享您的信息,亦不会出售或出租或以其他方式分发给其他人。
我们获得您明确同意我们分享信息
由于必要的原因,如完成支付交易或付费购买3D人体解剖图谱的产品,我们可能会与此行为关联的第三方服务提供商分享您的信息。这些服务提供商仅已获授权在提供服务所必需的范围内使用您的个人信息。
为了维护我们或合作伙伴,客户的合法权益,我们会在法律允许的范围内公开您的个人信息。
为了遵守当地法律法规,维护社会公共利益或其它法律上用于维护他人权益的必要理由,我们会在法律框架内谨慎的公布您的个人信息。
当我们发生合并,收购或其它同类交易时,您的个人信息可能作为交易的资源。若发生此类情况,我们会提前告知您转移或销毁您的个人信息。
数据安全
我们使用多种行业标准的加密技术(如SSL,TLS)来保护您在传输,存储,分享过程中的数据。但请您理解,由于互联网技术的限制,即使使用所有先进的安全技术也无法保证信息100%的安全,因此,我们需要您了解并确认传输信息给我们的所存在的风险。 当您的数据存储至我们的服务器,我们将通过政策,物理,逻辑等多种方式确保数据在我们服务器上的安全。而在您电脑上的数据更多依赖于您设备的安全,我们建议您采取必要的措施保证您本地数据的安全。
条款更新
当您继续使用我们的产品或服务,即默认为同意当下时间有效的条款。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)