nginx技术底层

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、进程模型
  • 二、事件驱动与异步IO
    • 事件通知机制
      • 多路复用
      • 非阻塞IO
      • 事件处理循环
  • 四、内存管理
    • 内存池机制
    • 对象复用
  • 五、零拷贝技术
  • 六、模块化设计
  • 七、与操作系统交互
    • 系统调用
    • 信号处理
    • 内存映射


前言

nginx采用异步,事件驱动,非阻塞I/O模型,旨在应对高并发连接请求,保证低延迟和高吞吐量,设计理念包括:
异步事件驱动:通过事件通知机制(epoll/kqueue)处理大量并发连接,无需为每个连接分配一个线程或进程,降低资源占用
模块化架构:各个功能如(http, 反向代理,负载均衡,缓存)都以模块形式实现
高效内存管理:采用内存池(memory pool)技术减少频繁的内存分配的性能开销
零拷贝技术:利用sendfile等系统调用,避免数据拷贝,实现高效数据传输

一、进程模型

nginx有一个主进程和多个工作进程

  1. 主进程负责读取解析配置文件,管理工作进程及信号处理,不直接处理网络请求,只负责控制和管理服务
  2. 工作进程负责网络IO和处理客户端请求,每个工作进程采用单线程事件驱动模型,通过异步IO多路复用同时处理多个并发请求,多个工作进程互相独立,避免单点故障
  3. 该模型充分利用多核CPU,也能降低上下文切换和进程通信的开销

二、事件驱动与异步IO

事件通知机制

多路复用

nginx使用epoll, 运行一个进程或线程同时监听大量的文件描述符上的事件,事件发生后,通过回调函数通知应用程序进行处理

非阻塞IO

  1. socket采用非阻塞模式,读写操作不会因数据未就绪而挂起,而是立即返回
  2. 数据就绪后,通过事件通知机制触发回调,完成后续处理
  3. 避免因阻塞等待IO占用CPU事件,提高并发能力

事件处理循环

  1. 每个工作进程进入一个事件循环,使用epoll_wait等系统调用等待事件
  2. 连接有事件发生时,事件循环会调用对应的处理函数

四、内存管理

内存池机制

nginx为请求和模块创建内存池,通过预先分配内存满足短期内存分配需求
内存池避免频繁调用系统内存分配函数(malloc/free)的开销,并减少内存碎片,提供分配速度

对象复用

设计了多种对象 连接请求缓冲区等的缓存机制,通过对象复用降低内存分配和释放频率

五、零拷贝技术

nginx采用sendfile函数,直接在内核空间将文件数据发送到网络连接,避免了用户态和内核态的数据拷贝

六、模块化设计

所有功能都以模块方式实现

  1. 核心功能与扩展功能解耦,模块之间通过预定义的接口通信
  2. 模块可以动态加载,方便定制化需求和二开
  3. 能按需启用功能,降低不必要的资源占用

七、与操作系统交互

系统调用

  1. socket 、bind listen accept: 用于建立网络连接
  2. epoll_create epoll_ctl epoll_wait:用于实现IO多路复用,监听大量socket事件
  3. sendfile:通过零拷贝技术在内核空间将文件内容发送到网络连接

信号处理

  1. 主进程利用信号(SIGHUP、SIGTERM)来实现配置重新加载,平滑升级,工作进程管理等
  2. 信号处理机制要求尽量在异步安全的上下文中完成工作,通常将信号转发到工作进程或通过自定义事件通知实现

内存映射

可能利用mmap映射文件到内存加速文件读取

你可能感兴趣的:(nginx,php,网络)