Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅谈Nginx服务器的内部核心架构设计!

浅谈Nginx服务器的内部核心架构设计!

原创
作者头像
JAVA高级架构开发
修改于 2018-10-10 01:46:28
修改于 2018-10-10 01:46:28
1.1K0
举报

一、前言

Nginx---Ngine X,是一款免费的、自由的、开源的、高性能HTTP服务器和反向代理服务器;也是一个IMAP、POP3、SMTP代理服务器;Nginx以其高性能、稳定性、丰富的功能、简单的配置和低资源消耗而闻名。

也就是说Nginx本身就可以托管网站(类似于Tomcat一样),进行Http服务处理,也可以作为反向代理服务器 、负载均衡器和HTTP缓存。

Nginx 解决了服务器的C10K(就是在一秒之内连接客户端的数目为10k即1万)问题。它的设计不像传统的服务器那样使用线程处理请求,而是一个更加高级的机制—事件驱动机制,是一种异步事件驱动结构。

二、Nginx的特点

跨平台:可以在大多数Unix like 系统编译运行。而且也有Windows的移植版本。

配置异常简单:非常的简单,易上手。

非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能支持5万并发连接,实际生产中能跑2~3万并发连接数(得益于Nginx采用了最新的epoll事件处理模型(消息队列)。

Nginx代理和后端Web服务器间无需长连接;

Nginx接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送到后端Web服务器,极大减轻后端Web服务器的压力。

发送响应报文时,是边接收来自后端Web服务器的数据,边发送给客户端。

网络依赖性低,理论上只要能够ping通就可以实施负载均衡,而且可以有效区分内网、外网流量。

支持内置服务器检测。Nginx能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其它节点上。

此外还有内存消耗小、成本低廉(比F5硬件负载均衡器廉价太多)、节省带宽、稳定性高等特点。

说到这里,也给大家推荐一个架构交流学习群:835544715 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,相信对于已经工作和遇到技术瓶颈的码友,在这个群里会有你需要的内容。

三、Nginx的整体架构

1、模块化设计

Nginx 的Worker 进程,包括核心和功能性模块 ,核心模块负责维持一个运行循环( run-loop ),执行网络请求处理的不同阶段的模块功能,比如:存储读写、内容传输 、网络读写 、外出过滤 ,以及将请求发往上游服务器等。而其代码的模块化设计 ,也使得我们可以根据需要对功能模块进行适当的选择和修改 ,编译成具有特定功能的服务器。

2、代理设计

代理(proxy)设计,可以说是 Nginx 深入骨髓的设计,无论是对于HTTP,还是对于Memcache 、Redis、FastCGI 等的网络请求或响应,本质上都采用了代理机制 。所以,Nginx 天生就是高性能的代理服务器 。

3、事件驱动模型

基于异步及非阻塞的事件驱动模型 ,可以说是 Nginx 得以获得 高并发 、 高性能 的关键因素,同时也得益于对 LinuxSolaris 及类 BSD 等操作系统内核中 事件通知 及 I/O 性能增强功能 的采用,如kqueue 、 epoll 及 event ports 。

4、主进程模型

Nginx 启动时,会生成两种类型的进程,一个是主进程 ( Master ), 一个或多个工作进程 ( Worker )。主进程并不处理网络请求,主要负责调度工作进程 ,也就是图示的3项:加载配置 、 启动工作进程及非停升级。所以Nginx启动以后,查看操作系统的进程列表,我们就能看到至少有两个Nginx进程。

5、工作进程模型

服务器实际处理网络请求及响应的是工作进程,在类Unix 系统上,Nginx可以配置多个Worker ,而每个Worker 进程都可以同时处理数以千计的网络请求。

四、Nginx的模块化设计

高度模块化的设计是 Nginx 的架构基础。 Nginx 服务器被分解为多个模块 ,每个模块就是一个功能模块 ,只负责自身的功能,模块之间严格遵循 “高内聚,低耦合” 的原则。

1、核心模块

核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析、事件驱动机制、进程管理等核心功能。

2、标准HTTP模块

标准 HTTP 模块提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等。

3、可选HTTP模块

可选 HTTP 模块主要用于 扩展 标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等。

4、邮件服务模块

邮件服务模块主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持。

5、第三方模块

第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等。

五、代理设计中的正向代理和反向代理

首先,代理服务器一般指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端。例如:GoAgent访问外国网站软件。我们的客户端在进行访问外国网站操作的时候,我们使用的正是正向代理,通过正向代理的方式,在我们的客户端运行一个软件,将我们的HTTP请求转发到其他不同的服务器端,实现请求的分发。

反向代理服务器作用在服务器端,它在服务器端接收客户端的请求,然后将请求分发给具体的服务器进行处理,然后再将服务器的相应结果反馈给客户端。Nginx就是一个反向代理服务器软件。

从上图可以看出:客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。 反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。

六、Nginx事件驱动模型

在 Nginx 的异步非阻塞机制中,工作进程在调用 IO 后,就去处理其他的请求,当 IO 调用返回后,会通知该工作进程 。对于这样的系统调用,主要使用 Nginx 服务器的事件驱动模型来实现。

如上图所示, Nginx 的 事件驱动模型由事件发送器、事件收集器和事件处理器三部分基本单元组成:

事件发送器:负责将 IO 事件发送到事件处理器 ;

事件收集器:负责收集Worker 进程的各种 IO 请求;

事件处理器:负责各种事件的响应工作 。

事件发送器将每个请求放入一个 待处理事件列表 ,使用非阻塞 I/O 方式调用 事件处理器来处理该请求。其处理方式称为 “多路 IO 复用方法” ,常见的包括以下三种: select 模型、 poll模型、 epoll 模型。

七、Nginx的请求方式处理

Nginx 是一个高性能的 Web 服务器,能够同时处理大量的并发请求。它结合多进程机制和异步机制 ,异步机制使用的是异步非阻塞方式 ,接下来就给大家介绍一下 Nginx 的多线程机制和异步非阻塞机制 。

1、多进程机制

服务器每当收到一个客户端时,就有 服务器主进程 ( master process )生成一个 子进程( worker process )出来和客户端建立连接进行交互,直到连接断开,该子进程就结束了。

使用进程的好处是各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成影响,同时降低编程的复杂度,降低开发成本。其次,采用独立的进程,可以让进程互相之间不会影响 ,如果一个进程发生异常退出时,其它进程正常工作, master 进程则很快启动新的 worker 进程,确保服务不会中断,从而将风险降到最低。

缺点是操作系统生成一个子进程需要进行 内存复制等操作,在资源和时间上会产生一定的开销。当有大量请求时,会导致系统性能下降 。

2、异步非阻塞机制

每个工作进程 使用 异步非阻塞方式 ,可以处理 多个客户端请求 。

当某个 工作进程 接收到客户端的请求以后,调用 IO 进行处理,如果不能立即得到结果,就去 处理其他请求 (即为 非阻塞 );而 客户端 在此期间也 无需等待响应 ,可以去处理其他事情(即为 异步 )。

当 IO 返回时,就会通知此 工作进程 ;该进程得到通知,暂时 挂起 当前处理的事务去 响应客户端请求 。

八、Nginx进程处理模型

Nginx 服务器使用 master/worker 多进程模式 。多线程启动和执行的流程如下:

主程序 Master process 启动后,通过一个 for 循环来 接收 和 处理外部信号 ;

主进程通过 fork() 函数产生 worker 子进程 ,每个 子进程 执行一个 for 循环来实现 Nginx 服务器 对事件的接收 和 处理 。

一般推荐 worker 进程数与CPU内核数一致,这样一来不存在大量的子进程生成和管理任务,避免了进程之间竞争CPU 资源和进程切换的开销。而且 Nginx 为了更好的利用 多核特性 ,提供了 CPU 亲缘性的绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来 Cache 的失效。

对于每个请求,有且只有一个工作进程 对其处理。首先,每个 worker 进程都是从 master进程 fork 过来。在 master 进程里面,先建立好需要 listen 的 socket(listenfd) 之后,然后再 fork 出多个 worker 进程。

所有 worker 进程的 listenfd 会在新连接到来时变得可读 ,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢占 accept_mutex ,抢到互斥锁的那个进程注册 listenfd 读事件 ,在读事件里调用 accept 接受该连接。

当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求,产生数据后,再返回给客户端 ,最后才断开连接。这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。

在 Nginx 服务器的运行过程中, 主进程和工作进程 需要进程交互。交互依赖于 Socket 实现的管道来实现。

1、主进程与工作进程交互

这条管道与普通的管道不同,它是由主进程指向工作进程的单向管道,包含主进程向工作进程发出的指令,工作进程 ID 等;同时主进程与外界通过信号通信;每个 子进程具备接收信号,并处理相应的事件的能力。

2、工作进程与工作进程交互

这种交互是和主进程-工作进程交互是基本一致的,但是会通过主进程间接完成。 工作进程之间是相互隔离的,所以当工作进程 W1 需要向工作进程 W2 发指令时,首先找到 W2 的 进程ID,然后将正确的指令写入指向 W2 的 通道。 W2 收到信号采取相应的措施。

想要学习Java高架构、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取 架构群:835544715

九、小结

通过这篇文章,我们对 Nginx 服务器的整体架构有了一个整体的认识。包括其模块化的设计、多进程和异步非阻塞的请求处理方式、事件驱动模型等。通过这些理论知识,才能更好地领悟 Nginx 的设计思想。对于我们学习 Nginx 来说有很大的帮助。

作者:JAVA架构开发 链接:https://juejin.im/post/5bbc92b0f265da0aca332868 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nginx 面试中最常见的 18 道题
Nginx的并发能力在同类型网页服务器中的表现,相对而言是比较好的,因此受到了很多企业的青睐,我国使用Nginx网站的知名用户包括腾讯、淘宝、百度、京东、新浪、网易等等。Nginx是网页服务器运维人员必备技能之一,下面为大家整理了一些比较常见的Nginx相关面试题,仅供参考:
用户8639654
2021/08/26
6930
Nginx 面试中最常见的 18 道题
来源 | https://segmentfault.com/a/1190000010677483
程序猿DD
2021/11/10
1.3K0
Nginx 核心架构设计和原理
Nginx 是一个免费的、开源的、高性能 Http 服务器和反向代理。Nginx 的架构设计是为了提供高性能、稳定性和可扩展性。
码哥字节
2024/03/02
6580
Nginx 核心架构设计和原理
Nginx(1):入门篇,技术点铺开
哈哈,我终于对nginx下手了嘛。第一篇不知道要起个什么名字,入门吧,又不是很小白。设计与架构吧,又不是很深刻,而且不知道哪天就被我的另外的博客给吞了,就无题吧。
看、未来
2021/10/09
2520
Nginx(1):入门篇,技术点铺开
架构师详解:Nginx 架构
引言:众所周知,Nginx 服务器是一个高性能的 Web 和反向代理服务器。Nginx 在激烈的 Web 服务器竞争中依旧保持良好的发展势头,一度成为 Web 服务器市场的后期之秀,这一切跟 Ngin
用户1263954
2018/06/22
6350
面试官常问的Nginx的几个问题
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器
李红
2019/07/15
3730
nginx面试常见问题_面试官应该问哪些问题
1.什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器 目前使用的最多的web服务器或者代理服务器,像淘宝、新浪、网易、迅雷等都在使用
全栈程序员站长
2022/09/27
2250
Nginx初探
Nginx——Ngine X,是一款自由的、开源的、高性能HTTP服务器和反向代理服务器;也是一个IMAP、POP3、SMTP代理服务器;也就是说Nginx本身就可以托管网站(类似于Tomcat一样),进行Http服务处理,也可以作为反向代理服务器使用。
Java后端技术
2018/08/09
2860
Nginx初探
Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
Nginx ,是一个 Web 服务器和反向代理服务器用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。
HaC
2020/12/09
1.5K0
只知道 Nginx 牛逼,却不知道它怎么支持百万并发?
今天,再给大家讲讲Nginx的整体架构,以及进程模型。Nginx是一个免费的,开源的,高性能的HTTP服务器和反向代理。以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。Nginx是一个Web服务器,也可以用作负载均衡器和HTTP缓存。
java进阶架构师
2020/05/05
7750
java面试题及答案整理_nginx优化面试
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
全栈程序员站长
2022/09/27
4200
渐进深入理解Nginx
正向代理也是大家最常接触的到的代理模式,那究竟什么是正向代理呢?我们都知道Google在国内是无法正常访问的,但是某些时候我们由于技术问题需要去访问Google时,我们会先找到一个可以访问Google的代理服务器,我们将请求发送到代理服务器,代理服务器去访问Google,然后将访问到的数据返回给我们,这样的过程就是正向代理。
创译科技
2019/08/26
8130
Nginx初探
http://blog.csdn.net/xlgen157387/article/details/49781487
bear_fish
2018/09/20
4180
Nginx初探
通俗易懂的Nginx工作原理
作者:Rick617原文:https://www.jianshu.com/p/6215e5d24553
Bug开发工程师
2019/05/16
14K1
通俗易懂的Nginx工作原理
Nginx--面试基础必会
最近一直在更新关于Nginx的系列文章,终于将Nginx的几个关键知识点讲的差不多了。本篇作为Nginx系列的结尾篇幅,主要是列举一些面试时经常问到的Nginx知识点。其实Nginx适合提问的面试点并不多,问来问去基本都是类似的问题。接下来我们一起来看看Nginx基本的面试题。
创译科技
2019/09/10
6160
Nginx--面试基础必会
Nginx服务器架构简析
模块化结构的思想是一个很久的概念,但也正是成熟的思想造就了Nginx的巨大优越性。
后端技术探索
2018/08/10
6040
Nginx基础篇--docker搭建nginx
Nginx是一个轻量级,高性能,基于HTTP的,反向代理服务器,同时还是一个电子邮件服务器,Nginx是有俄罗斯人用c语言开发的,2004年10月发布第一个版本,国内很多大公司都在使用例如百度,京东,淘宝等等。
小土豆Yuki
2020/06/15
1.2K1
深入浅出Nginx
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
lyb-geek
2018/07/26
1.2K0
深入浅出Nginx
相关推荐
Nginx 面试中最常见的 18 道题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档