Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 Nginx 为什么这么快!
    Nginx 的进程模型
    Nginx底层原理:一文解析Nginx为什么并发数可以达到3w(转) - 图1

    Nginx 服务器,正常运行过程中:
    多进程:一个 Master 进程、多个 Worker 进程。
    Master 进程:管理 Worker 进程。对外接口:接收外部的操作(信号);对内转发:根据外部的操作的不同,通过信号管理 Worker;监控:监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程。
    Worker 进程:所有 Worker 进程都是平等的。实际处理:网络请求,由 Worker 进程处理。Worker 进程数量在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。
    思考:
    请求是连接到 Nginx,Master 进程负责处理和转发?
    如何选定哪个 Worker 进程处理请求?请求的处理结果,是否还要经过 Master 进程?
    Nginx底层原理:一文解析Nginx为什么并发数可以达到3w(转) - 图2

    HTTP 连接建立和请求处理过程
    HTTP 连接建立和请求处理过程如下:
    Nginx 启动时,Master 进程,加载配置文件。
    Master 进程,初始化监听的 Socket。
    Master 进程,Fork 出多个 Worker 进程。
    Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求。
    Nginx 高性能、高并发
    Nginx 为什么拥有高性能并且能够支撑高并发?
    Nginx 采用多进程+异步非阻塞方式(IO 多路复用 Epoll)。
    请求的完整过程:建立连接→读取请求→解析请求→处理请求→响应请求。
    请求的完整过程对应到底层就是:读写 Socket 事件。
    Nginx 的事件处理模型
    Request:Nginx 中 HTTP 请求。
    基本的 HTTP Web Server 工作模式:
    接收请求:逐行读取请求行和请求头,判断段有请求体后,读取请求体。
    处理请求。
    返回响应:根据处理结果,生成相应的 HTTP 请求(响应行、响应头、响应体)。
    Nginx 也是这个套路,整体流程一致:
    Nginx底层原理:一文解析Nginx为什么并发数可以达到3w(转) - 图3

    模块化体系结构
    Nginx底层原理:一文解析Nginx为什么并发数可以达到3w(转) - 图4

    // poll 系统调用
    int poll(struct pollfd fds[], nfds_t nfds, int timeout);
    select:
    查询 fd_set 中,是否有就绪的 fd,可以设定一个超时时间,当有 fd (File descripter) 就绪或超时返回。
    fd_set 是一个位集合,大小是在编译内核时的常量,默认大小为 1024。
    特点:连接数限制,fd_set 可表示的 fd 数量太小了;线性扫描:判断 fd 是否就绪,需要遍历一遍 fd_set;数据复制:用户空间和内核空间,复制连接就绪状态信息。
    poll:
    解决了连接数限制:poll 中将 select 中的 fd_set 替换成了一个 pollfd 数组,解决 fd 数量过小的问题。
    数据复制:用户空间和内核空间,复制连接就绪状态信息。
    epoll,event 事件驱动:
    事件机制:避免线性扫描,为每个 fd,注册一个监听事件,fd 变更为就绪时,将 fd 添加到就绪链表。
    fd 数量:无限制(OS 级别的限制,单个进程能打开多少个 fd)。
    select,poll,epoll:
    I/O 多路复用的机制。
    I/O 多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作;监视多个文件描述符。
    但 select,poll,epoll 本质上都是同步 I/O:用户进程负责读写(从内核空间拷贝到用户空间),读写过程中,用户进程是阻塞的;异步 IO,无需用户进程负责读写,异步 IO,会负责从内核空间拷贝到用户空间。
    Nginx 的并发处理能力
    关于 Nginx 的并发处理能力:并发连接数,一般优化后,峰值能保持在 1~3w 左右。(内存和 CPU 核心数不同,会有进一步优化空间)。

    https://blog.csdn.net/weixin_46329358/article/details/105010184