目录

设置场景– NGINX流程模型

为什么建筑很重要?

NGINX如何工作?

在NGINX Worker流程内部

调度状态机

阻塞状态机

NGINX是真正的大师

为什么这比阻塞的多进程体系结构要快?

更新配置并升级NGINX

结论


NGINX在网络性能方面处于领先地位,这全归功于该软件的设计方式。尽管许多Web服务器和应用程序服务器使用简单的基于线程或基于进程的体系结构,但NGINX凭借复杂的事件驱动体系结构而脱颖而出,使其能够扩展到现代硬件上成千上万的并发连接。

的内部NGINX信息图钻头从高级别处理架构下以说明NGINX如何处理一个单一的过程中的多个连接。该博客详细解释了所有工作原理。

设置场景– NGINX流程模型

为了更好地理解此设计,您需要了解NGINX如何运行。NGINX有一个主进程(执行特权操作,如读取配置和绑定到端口)以及许多辅助进程。

# service nginx restart
* Restarting nginx
# ps -ef --forest | grep nginx
root     32475     1  0 13:36 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    32476 32475  0 13:36 ?        00:00:00  _ nginx: worker process
nginx    32477 32475  0 13:36 ?        00:00:00  _ nginx: worker process
nginx    32479 32475  0 13:36 ?        00:00:00  _ nginx: worker process
nginx    32480 32475  0 13:36 ?        00:00:00  _ nginx: worker process
nginx    32481 32475  0 13:36 ?        00:00:00  _ nginx: cache manager process
nginx    32482 32475  0 13:36 ?        00:00:00  _ nginx: cache loader process

在此四核服务器上,NGINX主进程创建了四个工作进程和几个缓存帮助程序,用于管理磁盘内容缓存。

为什么建筑很重要?

任何Unix应用程序的基本基础都是线程或进程。(从Linux OS的角度来看,线程和进程几乎是相同的;主要区别在于它们共享内存的程度。)线程或进程是操作系统可以调度在CPU上运行的一组独立的指令。核心。大多数复杂的应用程序并行运行多个线程或进程,原因有两个:

  • 他们可以同时使用更多的计算核心。
  • 线程和进程使并行操作非常容易(例如,同时处理多个连接)。

进程和线程消耗资源。它们每个都使用内存和其他OS资源,并且需要在内核之间进行交换(称为上下文切换)。大多数现代服务器可以同时处理数百个小型活动线程或进程,但是一旦内存耗尽或高I / O负载导致大量上下文切换,性能就会严重下降。

设计网络应用程序的常用方法是为每个连接分配一个线程或进程。该体系结构简单易实现,但是当应用程序需要处理数千个同时连接时,它无法扩展。

NGINX如何工作?

NGINX使用可预测的过程模型,该模型已调整为可用的硬件资源:

  • 过程执行特权操作,例如读取配置和绑定到端口,然后创建一个小的数目的子进程(接下来的三个类型)。
  • 缓存加载器进程在启动时运行,以将基于磁盘的缓存加载到内存中,然后退出。它的计划比较保守,因此其资源需求较低。
  • 高速缓存管理器进程运行从磁盘缓存定期和李子条目,让他们配置的大小范围之内。
  • 工人进程做所有的工作!它们处理网络连接,将内容读取和写入磁盘,并与上游服务器进行通信。

在大多数情况下,建议使用NGINX配置(每个CPU内核运行一个工作进程),以最有效地利用硬件资源。您可以通过autoworker_processes伪指令上设置参数来配置它:

worker_processes auto;

当NGINX服务器处于活动状态时,仅工作进程处于繁忙状态。每个工作进程以非阻塞方式处理多个连接,从而减少了上下文切换的数量。

每个工作进程都是单线程的,并且独立运行,获取新连接并进行处理。进程可以使用共享内存进行通信,以共享缓存数据,会话持久性数据和其他共享资源。

在NGINX Worker流程内部

每个NGINX工作进程都使用NGINX配置初始化,并且由主进程提供一组侦听套接字。

NGINX工作进程始于等待侦听套接字上的事件(accept_mutex和内核套接字分片)。事件由新的传入连接启动。这些连接被分配给状态机  -HTTP状态机是最常用的,但是NGINX还为流(原始TCP)流量和许多邮件协议(SMTP,IMAP和POP3)实现状态机。

状态机本质上是告诉NGINX如何处理请求的指令集。大多数执行与NGINX功能相同的Web服务器都使用类似的状态机-区别在于实现。

调度状态机

将状态机想像成国际象棋的规则。每个HTTP事务都是一个国际象棋游戏。棋盘的一侧是Web服务器-一个可以非常快速地做出决策的大师。另一端是远程客户端,即通过相对较慢的网络访问站点或应用程序的Web浏览器。

但是,游戏规则可能非常复杂。例如,Web服务器可能需要与其他方通信(代理上游应用程序)或与身份验证服务器对话。Web服务器中的第三方模块甚至可以扩展游戏规则。

阻塞状态机

回顾一下我们对进程或线程的描述,它们是操作系统可以调度在CPU内核上运行的一组独立指令。大多数Web服务器和Web应用程序都使用每个连接进程或每个连接线程模型来下棋游戏。每个进程或线程都包含从头至尾玩一个游戏的指令。在服务器运行该过程的过程中,它花费了大部分时间“阻塞” –等待客户端完成下一步。

  1. Web服务器进程在侦听套接字上侦听新的连接(客户端发起的新游戏)。
  2. 当它获得新游戏时,它会玩该游戏,在每次移动后等待客户响应都将阻塞。
  3. 游戏结束后,Web服务器进程可能会等待查看客户端是否要开始新游戏(这与保持连接状态相对应)。如果连接关闭(客户端关闭或发生超时),则Web服务器进程将返回监听新游戏。

要记住的重要一点是,每个活动的HTTP连接(每个国际象棋游戏)都需要一个专用的进程或线程(特级大师)。该体系结构简单易用第三方模块(“新规则”)进行扩展。但是,这存在巨大的不平衡:由文件描述符和少量内存表示的相当轻量级的HTTP连接映射到单独的线程或进程,这是一个非常重的操作系统对象。这是编程上的便利,但是非常浪费。

NGINX是真正的大师

也许您听说过同时进行的展览游戏,其中一位国际象棋大师同时玩几十个对手?

Kiril Georgiev在保加利亚的索非亚同时演奏了360人。他的最终得分是284胜70平6负。

这就是NGINX工作进程扮演“棋子”的方式。每个工作人员(记住-每个CPU内核通常只有一个工作人员)是一位大师,可以同时玩数百(实际上是数十万)个游戏。

  1. 工作程序在侦听和连接套接字上等待事件。
  2. 事件发生在套接字上,并且工作程序处理它们:
    • 监听套接字上的事件表示客户端已开始新的国际象棋游戏。工人创建一个新的连接插座。
    • 连接套接字上的事件表示客户端已采取新措施。工人及时作出反应。

工作人员从不阻塞网络流量,而等待其“对手”(客户端)做出响应。做出动作后,工作人员会立即进入其他等待处理动作的游戏,或者欢迎新玩家加入。

为什么这比阻塞的多进程体系结构要快?

NGINX很好地扩展以支持每个工作进程成千上万的连接。每个新连接都会创建另一个文件描述符,并在工作进程中消耗少量的额外内存。每个连接几乎没有额外的开销。NGINX进程可以保持固定到CPU。上下文切换相对较少,并且在没有工作要做时会发生。

在阻塞式每进程连接方法中,每个连接都需要大量的额外资源和开销,并且上下文切换(从一个进程交换到另一个进程)非常频繁。

有关更详细的说明,请查看NGINX,Inc.公司开发副总裁兼联合创始人Andrew Alexeev 撰写的有关NGINX体系结构的文章。

通过适当的系统调整,NGINX可以扩展为在每个工作进程中处理数十万个并发HTTP连接,并且可以吸收流量峰值(大量新游戏涌入)而不会错过任何机会。

更新配置并升级NGINX

NGINX的进程体系结构具有少量的工作进程,因此可以非常高效地更新配置,甚至可以更新NGINX二进制文件本身。

更新NGINX配置是非常简单,轻巧和可靠的操作。它通常仅意味着运行该nginx -s reload命令,该命令将检查磁盘上的配置并向主进程发送SIGHUP信号。

当主进程收到SIGHUP时,它将执行以下两项操作:

  1. 重新加载配置并派生一组新的工作进程。这些新的工作进程立即开始接受连接和处理流量(使用新的配置设置)。
  2. 指示旧工作进程正常退出。工作进程停止接受新连接。当前的每个HTTP请求完成后,工作进程会干净地关闭连接(即,没有持久的keepalive)。一旦关闭所有连接,工作进程将退出。

这种重新加载过程可能会导致CPU和内存使用量的小幅上升,但是与从活动连接中加载资源相比,这通常是不可察觉的。您可以每秒多次重载配置(许多NGINX用户正是这样做的)。很少有问题出现,当有许多代NGINX工作进程等待关闭连接时,即使这些连接都可以很快解决。

NGINX的二进制升级过程实现了高可用性的圣杯–您可以动态升级软件,而不会出现连接断开,停机或服务中断的情况

二进制升级过程在方法上类似于平稳重新加载配置。新的NGINX主进程与原始主进程并行运行,并且它们共享侦听套接字。这两个进程都处于活动状态,并且它们各自的工作进程都处理流量。然后,您可以指示旧的主机及其工作人员正常退出。

整个过程在“ 控制NGINX”中有更详细的描述。

结论

该内部NGINX信息图表提供的NGINX如何功能的高度概括,但是这背后简单的解释是,经过十多年的创新和优化,使NGINX对范围广泛的硬件提供最佳的性能,同时保持安全性和可靠性现代Web应用程序要求。

如果您想了解有关NGINX中优化的更多信息,请查看以下重要资源:

  • 安装和调整NGINX的性能(网络研讨会;扬声器甲板上的幻灯片)
  • 调整NGINX的性能
  • 开源应用程序的体系结构– NGINX
  • NGINX版本1.9.1中的SO_REUSEPORT套接字分片(使用套接字选项)

NGINX内部:我们如何设计性能和规模相关推荐

  1. 《开源软件架构》--nginx配置与内部(三)

    14.3. nginx配置 nginx的配置系统灵感来自Igor Sysoev使用Apache的经验.他的主要观点是,可伸缩的配置系统对于web服务器非常必要.在维护包含大量虚拟服务器.目录.位置和数 ...

  2. 悠悠二十载,Nginx创始人Igor宣布离职

    2002年春季,Igor Sysoev迈上了Nginx的开发之旅.面对互联网的早期飞速发展,他希望提出一种更好的网络流量处理方式--这将是一种新颖的架构,能够让高流量网站更从容地处理数万个并发连接,并 ...

  3. Nginx upstream模块

    Nginx upstream模块 upstream模块 nginx模块一般被分成三大类:handler.filter和upstream.前面的章节中,读者已经了解了handler.filter.利用这 ...

  4. Nginx 入门指南

    Nginx 入门指南 简介: Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强.本教程根据淘宝核心系统服务器平台组的 ...

  5. 【7W字长文】使用LVS+Keepalived实现Nginx高可用,一文搞懂Nginx

    往期文章一览 分布式会话与单点登录SSO系统CAS,包含完整示例代码实现 [15W字长文]主从复制高可用Redis集群,完整包含Redis所有知识点 使用LVS+Keepalived实现Nginx高可 ...

  6. Nginx服务器--Nginx服务器的使用笔记

    1.Nginx简介 Nginx("engine x") 一个具有高性能的[HTTP]和[反向代理]的[WEB服务器],同时它也是一个[POP3/SMTP/IMAP代理服务器],由伊 ...

  7. Nginx从听说到学会

    第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一 ...

  8. 当初我要是这么学习Nginx就好了!(多图详解)

    " 本文主要帮助大家熟悉 Nginx 有哪些应用场景.Nginx 特点和架构模型以及相关流程.Nginx 定制化开发的几种模块分类.读完本文你将对 Nginx 有一定的认识. 来自:51ct ...

  9. Nginx 变量漫谈

    Nginx 变量漫谈之变量插值(一) Nginx 的配置文件使用的就是一门微型的编程语言,许多真实世界里的 Nginx 配置文件其实就是一个一个的小程序.当然,是不是"图灵完全的" ...

最新文章

  1. ECS 支持 IPv6 啦,快来尝鲜吧~
  2. PIE SDK主成分变换
  3. Spring Resource和ResourceLoader源码解析
  4. ie6不支持png图片的解决办法
  5. 动态添加Table tbody 给option 下拉框动态赋值 逻辑删除
  6. 视频号、抖音、海外Tiktok到底该选择那个平台更好
  7. KPN iTV的敏捷转型之旅
  8. 解决Golang程序运行时占用内存不断增加的问题
  9. 离开,是一个新的开始
  10. SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
  11. FloatingActionButton FAB 悬浮按钮
  12. SylixOS Python扩展库开发
  13. spp色散关系 matlab,表面等离极化激元(SPP)基本原理教案分析.ppt
  14. xinput1_3.dll丢失怎么修复win10_有什么好的修复方法推荐?
  15. java url解码解不了_java – 为什么URL没有完全解码?
  16. jmeter连接数据库查询获取多个参数, 并通过参数化传值,实现jmeter造数
  17. 最全的百度网盘搜索引擎
  18. 统计一行字符串中单词的个数
  19. idea 连接达梦数据库
  20. 用inno Setup做应用程序安装包的示例脚本(.iss文件)(

热门文章

  1. SpringBoot学习(四)
  2. Linux centos7 安装python3.6.5 和 pip3
  3. JavaScript——原生js实现瀑布流
  4. 菜鸟学IT之python3关于列表,元组,字典,集合浅认识!
  5. 使用隐含参数testMappingSpeed排查GoldenGate抽取慢的步骤
  6. Day4 MySql触发器视图索引以及设计优化
  7. AtCoder Regular Contest 088 E - Papple Sort(树状数组+结论)
  8. 第十一天 安装Oracle数据库
  9. 7.js模式-装饰者模式
  10. input重置为空后点击出现上次的值_上次玄乎的问题后续来了