您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

时间:2020-04-28 12:20:05  来源:  作者:

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

来源 | https://urlify.cn/UN3eUb

Nginx相关文章:

  1. 基于Nginx实现访问控制、连接限制

  2. Ngxix | 超详细!Nginx 日志配置实践

  3. Nginx为什么快到根本停不下来?

  4. Nginx在高并发下的性能优化点!有这篇就够了!

今天,再给大家讲讲Nginx的整体架构,以及进程模型。Nginx是一个免费的,开源的,高性能的HTTP服务器和反向代理。以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。Nginx是一个Web服务器,也可以用作负载均衡器和HTTP缓存。

很多高知名度的网站都使用Nginx,比如:Netflix,GitHub,SoundCloud,MaxCDN等。

 

1.Nginx的整体架构

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

 

1.1.主进程

Nginx启动时,会生成两种类型的进程,一个是主进程(master),一个(windows版本的目前只有一个)或多个工作进程(worker)。

主进程并不处理网络请求,主要负责调度工作进程,也就是图示的3项:加载配置、启动工作进程、非停升级

因此,Nginx启动以后,查看操作系统的进程列表,我们就能看到至少有两个Nginx进程。

 

1.2.工作进程

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

 

1.3.模块化设计

Nginx的worker进程,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能。

比如:网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。

而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。

 

1.4.事件驱动模型

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

 

1.5.代理(proxy)设计

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

 

2.Nginx的模块化设计

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

如下图所示:

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

 

2.1.核心模块

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

 

2.2.标准HTTP模块

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

 

2.3.可选HTTP模块

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

 

2.4.邮件服务模块

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

 

2.5.第三方模块

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

 

3.Nginx的请求方式处理

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

 

3.1.多进程机制

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

使用进程的好处是各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成影响,同时降低编程的复杂度,降低开发成本。

其次,采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master进程则很快启动新的worker进程,确保服务不会中断,从而将风险降到最低。

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

 

3.2.异步非阻塞机制

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

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

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

 

4.Nginx事件驱动模型

在Nginx的异步非阻塞机制中,工作进程在调用IO后,就去处理其他的请求,当IO调用返回后,会通知该工作进程。

对于这样的系统调用,主要使用Nginx服务器的事件驱动模型来实现,如下图所示:

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

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

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

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

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

事件发送器将每个请求放入一个待处理事件列表,使用非阻塞I/O方式调用事件处理器来处理该请求。

其处理方式称为“多路IO复用方法”,常见的包括以下三种:select模型、poll模型、epoll模型。

 

5.Nginx进程处理模型

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

主程序Masterprocess启动后,通过一个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 牛逼,却不知道它怎么支持百万并发?

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

 

5.1.主进程与工作进程交互

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

 

5.2.工作进程与工作进程交互

这种交互和主进程-工作进程交互基本一致,但是会通过主进程间接完成,工作进程之间是相互隔离的。

所以当工作进程W1需要向工作进程W2发指令时,首先找到W2的进程ID,然后将正确的指令写入指向W2的通道,W2收到信号采取相应的措施。



Tags: Nginx   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
为什么要优化 Ngin HTTPS 延迟Nginx 常作为最常见的服务器,常被用作负载均衡 (Load Balancer)、反向代理 (Reverse Proxy),以及网关 (Gateway) 等等。一个配置得当的 Nginx 服...【详细内容】
2021-08-11  Tags: Nginx  点击:(53)  评论:(0)  加入收藏
作者:vbirdbestblog.csdn.net/vbirdbest/article/details/80913319一、HTTP服务器Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一...【详细内容】
2021-07-06  Tags: Nginx  点击:(94)  评论:(0)  加入收藏
今天总结一下负载均衡中LVS与Nginx的区别,好几篇博文一开始就说LVS是单向的,Nginx是双向的,我个人认为这是不准确的,LVS三种模式中,虽然DR模式以及TUN模式只有请求的报文经过Director,但是NAT模式,Real Server回复的...【详细内容】
2021-06-08  Tags: Nginx  点击:(113)  评论:(0)  加入收藏
之前有很多朋友问关于 Nginx 的 upstream 模块中 max_fails 及 fail_timeout,这两个指令,分别是配置关于负载均衡过程中,对于上游(后端)服务器的失败尝试次数和不可用时间,很多...【详细内容】
2021-04-15  Tags: Nginx  点击:(206)  评论:(0)  加入收藏
Caddy 简介Caddy 是一个 Go 编写的 Web 服务器,类似于 Nginx,Caddy 提供了更加强大的功能,随着 v2 版本发布 Caddy 已经可以作为中小型站点 Web 服务器的另一个选择;相较于 Ngin...【详细内容】
2021-03-01  Tags: Nginx  点击:(168)  评论:(0)  加入收藏
有时候我们需要将服务器上的某些目录共享出来,让其他人可以直接通过浏览器去访问、浏览或者下载这些目录里的一些文件。最近我就正好需要将一些静态的 HTML 页面部署到服务器...【详细内容】
2020-10-23  Tags: Nginx  点击:(129)  评论:(0)  加入收藏
对于开发人员来说,要学习很多的容器、缓存、消息中间件、数据库等。比如:tomcat,jboss,websphere,redis,mongoDB,mq,mysql等。但是在自己项目中不一定都会用到,为了学习,经常会在自己...【详细内容】
2020-09-10  Tags: Nginx  点击:(83)  评论:(0)  加入收藏
报告编号:B6-2020-090302报告来源:360CERT报告作者:360CERT更新日期:2020-09-030x01 漏洞简述2020年09月03日,360CERT监测发现 phpstudy 发布了 phpstudy 安全配置错误漏洞 的风...【详细内容】
2020-09-04  Tags: Nginx  点击:(182)  评论:(0)  加入收藏
什么是Nginx?Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 什么是反向代理?反向代理(Reverse Proxy)方式是指以代理服务器来...【详细内容】
2020-07-21  Tags: Nginx  点击:(42)  评论:(0)  加入收藏
一、试验目的无论是阿里云,还是腾讯云,无论是华为云,还是天翼云……无论是“哪朵云”,肯定都会有“负载均衡”这个服务,这究竟是个什么东东呢?产品介绍、功能特性等信...【详细内容】
2020-07-17  Tags: Nginx  点击:(90)  评论:(0)  加入收藏
▌简易百科推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  干程序那些事    Tags:CentOS7镜像   点击:(1)  评论:(0)  加入收藏
前言在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? 如何实现断线后重...【详细内容】
2021-12-24  程序猿阿嘴  CSDN  Tags:Netty   点击:(12)  评论:(0)  加入收藏
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  有云转晴    Tags:chrome   点击:(7)  评论:(0)  加入收藏
一. HTTP gzip压缩,概述 request header中声明Accept-Encoding : gzip,告知服务器客户端接受gzip的数据 response body,同时加入以下header:Content-Encoding: gzip:表明bo...【详细内容】
2021-12-22  java乐园    Tags:gzip压缩   点击:(9)  评论:(0)  加入收藏
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  SofM    Tags:Centos7   点击:(7)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  卷毛琴姨    Tags:云服务器   点击:(6)  评论:(0)  加入收藏
参考资料:Hive3.1.2安装指南_厦大数据库实验室博客Hive学习(一) 安装 环境:CentOS 7 + Hadoop3.2 + Hive3.1 - 一个人、一座城 - 博客园1.安装hive1.1下载地址hive镜像路径 ht...【详细内容】
2021-12-20  zebra-08    Tags:Hive   点击:(9)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  网安人    Tags:服务器   点击:(7)  评论:(0)  加入收藏
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  mdong    Tags:Nginx   点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  LaLiLi    Tags:SSH连接   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条