0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Nginx 如何实现高性能低消耗

科技绿洲 来源:Linux开发架构之路 作者:Linux开发架构之路 2023-11-11 11:31 次阅读

Nginx 是一个轻量级的HTTP 服务程序,相比其他服务器程序如Apache,Nginx占用内存少,稳定性高,并发处理能力强。同时Nginx 还是一个反向代理服务程序,和邮件代理服务程序。Nginx具有丰富的模块库、灵活的配置、较低资源消耗等优点。下面,我们一起深入看一下Nginx的工作机制

1. Nginx 如何实现高性能低消耗的呢?

我们从以下几个方面说明以下:

网络事件处理机制

  • Nginx 采用异步非阻塞的方式处理请求,可以同时处理上万的请求
  • Nginx 支持 select/epoll 等流行事件处理机制,根据系统环境自动选择
  • Nginx 采用独立于系统的事件处理机制,能够高效处理请求

资源分配技术

  • Nginx 采用分阶段资源分配技术,使得它的CPU和内存消耗非常低

多核处理优化

  • Nginx 默认采用多进程启动模式
  • Nginx 包含Master 进程 和 Worker 进程
  • 能够充分利用 SMP 对称多处理的优势,减少Worker进程磁盘I/O的阻塞
  • Nginx 支持Worker进程和CPU内核 一一对应绑定,避免进程上下文的切换致使cache失效

基于上面提到技术,以及Nginx很多地方的优化,让Nginx成为最快的HTTP服务器。

2.Nginx的进程模型

在Nginx的技术架构中,进程模型是至关重要的一部分。接下来,我们一起看看Nginx进程模型,以及它们的工作机制。

Linux 系统中,Nginx默认以守护进程daemon方式启动,默认采用多进程方式。Nginx包括两种类型的进程:

  • Master 进程,数量只有一个,管理Nginx本身和Worker进程
  • Worker 进程,数量一般和CPU核数相等,Nginx的所有请求处理,均是在Worker进程中完成

下面,我们分别深入看一下Master和Worker进程。

2.1 Master 进程工作机制

在Nginx启动时,Master进程创建,主要负责初始化Nginx和相关模块、fork Worker进程、接收处理外界信号等工作。

Nginx的初始化过程:

  • 解析配置文件,这是Nginx初始化最重要的一个环节
  • 调用各个配置指令回调函数,完成各个模块的配置、相互关联等
  • 建立listen 的 socket(listenfd)
  • 准备工作都完成后,fork worker子进程和cache子进程

Master 进程信号处理机制

我们通过kill命令发送信号给Nignx Master 进程,看看Master进程如何处理:

图片

分析流程:

  • Master 进程接收到 HUP 信号
  • Master 进程重新加载配置文件
  • Master 进程启动新的Worker进程
  • Master 进程发送信号给Worker 进程
  • 老的Worker进程不再接收新的请求
  • 老的Worker进程处理完当前请求,退出
  • 至此,Nginx完成平滑重启

注意:Nginx 0.8 版本以后,提供了 -s参数,用于管理Nginx服务的停止和重启,注意line 11:

图片

2.2 Worker 进程工作机制

Worker进程负责所有请求的处理工作,我们通过一个HTTP请求,来梳理一下Worker的工作流程:

  • 新的请求到来:所有的Work进程的listenfd都会变得可读
  • 竟抢互斥锁:所有 Worker 进程在注册listenfd读事件前,要先抢accept_mutex
  • 抢到互斥锁的Worker,注册listenfd读事件,在事件中调用accept接受该连接
  • 拿到请求后,Worker进程开始读取请求,解析请求,处理请求,产生数据,再返回给客户端
  • Worker进程断开连接

需要注意:一个HTTP请求,完全由Worker进程处理,而且只在一个Worker中处理

2.3 Master-Worker 进程架构机制的优势有哪些??

对于每个Worker 进程来说,独立的进程,不需要加锁,节约锁导致的资源开销;worker进程之间,互不干扰,平滑重启就是很好的例子,服务不中断。

2.4 网络事件处理机制

Nginx 采用的是异步非阻塞事件处理机制,支持select/poll/epoll/kqueue 等等。Nginx 同时会监控多个事件,调用他们是阻塞的。但是调用有超时时间,在超时时间内,如果有事件准备好了,就返回,否则重新放入epoll中。当读写返回EAGAIN时,事件将会被再次放入epoll中。

处理线程只有一个,同时处理的请求也只有一个,所谓多请求并发,只是在不断的切换请求而已。虽然是切换,但这种切换不涉及上下文切换,相比十分轻量。更多的并发,只是会占用更多的内存。

进程相关的还有,信号和定时器,这部分另外单独讲解。

  1. Nginx 包含哪些模块

Nginx是模块化架构的服务,丰富的模块,松散耦合,也让Nginx更加强大!我看看Nginx 都有哪些模块

内核模块

实现了底层的通讯协议,为其他模块/进程构建运行环境、协作基础,打开listen 的端口,启动worker进程

HTTP/Mail模块

两个特殊模块,位于内核模块和各功能模块间;在内核模块之上实现了另一层的抽象;处理HTTP/MAIL协议事件;确保调用功能模块顺序正确。

Event模块

负责监听accept后建立的连接,对读写事件进行添加删除;与非阻塞 I/O 模型结合使用;支持select/poll/epoll/kqueue等;注意惊群效应,后面有解释。

Handler模块

负责接受客户端请求并产生输出;通过配置文件中location指令配置 content handler 模块。

Filter模块

负责输出内容处理,修改输出内容;Fiter模块在获取回复内容之后,向用户发送响应之前,执行处理动作;调用顺序在编译时就确定了。

Upstream模块

实现反向代理的功能,负责将请求转发到后端服务器上,并读取响应,发回客户端;跨越单机的限制,完成网络数据的接收、处理和转发;

LoadBalancer模块

根据配置指定算法,在众多的后端服务器中选择一个,完成请求的转发服务器;都有哪些算法呢?

惊群效应:

  • 当内核 accept 一个连接时,会唤醒所有等待中的进程
  • 但实际上只有一个进程能获取连接,其他的进程都是被无效唤醒的
  • 所以 Nginx 采用了自有的一套 accept 加锁机制,避免多个进程同时调用 accept
  • Nginx 多进程的锁在底层默认是通过 CPU 自旋锁来实现。如果操作系统不支持自旋锁,就采用文件锁。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211088
  • 内存
    +关注

    关注

    8

    文章

    2996

    浏览量

    73868
  • 网络
    +关注

    关注

    14

    文章

    7511

    浏览量

    88605
  • nginx
    +关注

    关注

    0

    文章

    142

    浏览量

    12161
收藏 人收藏

    评论

    相关推荐

    解析keepalived+nginx实现高可用方案技术

    之前讲了Nginx 如何实现负载均衡以及如何实现动静分离,实现系统的分布式部署,提高系统的并发性能。但是,有个问题:如果
    的头像 发表于 09-30 15:52 3731次阅读
    解析keepalived+<b class='flag-5'>nginx</b><b class='flag-5'>实现</b>高可用方案技术

    高性能负载均衡Tomcat集群的实现

    Nginx+Tomcat搭建高性能负载均衡集群
    发表于 08-21 14:31

    使用nginx实现tomcat负载均衡

    Nginx+tomcat+memcached实现负载均衡及session(交叉存储)
    发表于 08-28 08:52

    nginx实现的负载均衡

    nginx实现负载均衡
    发表于 05-04 13:42

    低消耗电流电压调整器 XC6503

      特瑞仕半导体 (TOREX SEMICONDUCTOR LTD.) 开发了不需要输出电容、最大输出电流500mA 的低消耗电流电压调整器、XC6503 系
    发表于 10-19 10:13 968次阅读

    Apache与Nginx 简单对比 以及Nginx 基本使用方法

    Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个目前运维必备的工具之一。
    的头像 发表于 01-31 14:42 8268次阅读
    Apache与<b class='flag-5'>Nginx</b> 简单对比  以及<b class='flag-5'>Nginx</b> 基本使用方法

    低消耗降压PFM同步整流 DC/DC转换器

    XC9265系列产品可对应陶瓷电容,内置了0.5Ω(TYP.)P沟道驱动晶体管,及0.5Ω (TYP.)N沟道同步整流开关晶体管,超低消耗的降压PFM同步整流DC/DC转换器。采用了PFM控制而实现了超低消耗电流,最适用于重视在
    的头像 发表于 08-22 12:46 7108次阅读
    超<b class='flag-5'>低消耗</b>降压PFM同步整流 DC/DC转换器

    软件开发工程师的进阶之路

    轻量级,同样起web 服务,比apache 占用更少的内存及资源 ,抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
    的头像 发表于 07-02 17:27 2368次阅读

    XC6237:超低消耗电流,适用于物联网设备和可穿戴设备

    低消耗电流 0.6μA LDO稳压器
    的头像 发表于 07-03 09:43 3117次阅读

    分析Nginx为什么快的原因

    Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 Nginx 为什么这么快!
    的头像 发表于 05-04 14:26 2626次阅读
    分析<b class='flag-5'>Nginx</b>为什么快的原因

    低消耗电流CMOS运算放大器系列的应用特点及优势

    此次开发的超低消耗电流类型,根据电路技术大幅度提升了传统产品,实现业界最高级别的超低消耗电流0.35μA。当中的Ground Sense类型BU7411G/SG,实现了从1.6v开始的
    发表于 02-23 10:56 1910次阅读
    <b class='flag-5'>低消耗</b>电流CMOS运算放大器系列的应用特点及优势

    详解Nginx高性能的HTTP和反向代理服务器

    Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好。
    的头像 发表于 03-16 11:23 2401次阅读

    TOREX:了解的IoT器件(电池工作、低消耗)解决方案

    因此,在为传感器、MCU、无线通信各功能供应超低消耗工作且高效电源的同时,电池控制、监视也变得重要。
    的头像 发表于 05-22 00:38 612次阅读
    TOREX:了解的IoT器件(电池工作、<b class='flag-5'>低消耗</b>)解决方案

    Nginx目录结构有哪些

    什么是NginxNginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用
    的头像 发表于 11-11 11:27 598次阅读
    <b class='flag-5'>Nginx</b>目录结构有哪些

    实现业界最低消耗电流~ 用于 GNSS的低功耗宽频带 LNA“NT1195”开始供样品

    产品特点 1. 同时实现低消耗电流和低噪声系数(NF)、高增益特性 通过我们多年培育的独特技术,实现了1.9mA的超低消耗电流和0.7dB的低噪声系数(NF)以及18dB的高增益特性。
    的头像 发表于 04-23 13:43 365次阅读
    ~<b class='flag-5'>实现</b>业界最<b class='flag-5'>低消耗</b>电流~ 用于 GNSS的低功耗宽频带 LNA“NT1195”开始供样品