• 深入探索Nginx工作原理


    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进程如何处理:

    root@eg001:~# ps -ef | grep nginx | grep -v grep
    root     16533     1  0 Aug28 ?        00:00:00 nginx: master process nginx
    www-data 16534 16533  0 Aug28 ?        00:00:47 nginx: worker process
    www-data 16535 16533  0 Aug28 ?        00:00:51 nginx: worker process
    www-data 16536 16533  0 Aug28 ?        00:00:53 nginx: worker process
    www-data 16537 16533  0 Aug28 ?        00:00:51 nginx: worker process
    root@eg001:~# kill -HUP 16533
    root@eg001:~# ps -ef | grep nginx | grep -v grep
    root     16533     1  0 Aug28 ?        00:00:00 nginx: master process nginx
    www-data 28194 16533  0 09:40 ?        00:00:00 nginx: worker process
    www-data 28195 16533  0 09:40 ?        00:00:00 nginx: worker process
    www-data 28196 16533  0 09:40 ?        00:00:00 nginx: worker process
    www-data 28197 16533  0 09:40 ?        00:00:00 nginx: worker process
    root@eg001:~# 

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

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

     1 root@eg001:~# nginx -h
     2 nginx version: nginx/1.1.19
     3 Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]
     4 
     5 Options:
     6   -?,-h         : this help
     7   -v            : show version and exit
     8   -V            : show version and configure options then exit
     9   -t            : test configuration and exit
    10   -q            : suppress non-error messages during configuration testing
    11   -s signal     : send signal to a master process: stop, quit, reopen, reload
    12   -p prefix     : set prefix path (default: /etc/nginx/)
    13   -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
    14   -g directives : set global directives out of configuration file

    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中。

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

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

    3. 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 自旋锁来实现。如果操作系统不支持自旋锁,就采用文件锁。

    原文地址:http://kevhu.com/php/555

     

      扫二维码,关注更多PHP资讯!

    qrcode_for_gh_eca2f6d7a005_258.jpg

  • 相关阅读:
    关于匹配的一些问题
    Codeforces Round #396 (Div. 2) A,B,C,D,E
    Codeforces Round #394 (Div. 2) A,B,C,D,E
    HDU 1848 SG函数博弈
    HDU 1536 S-Nim SG博弈
    HDU 2509 Be the Winner nim博弈变形
    HDU 1907 John nim博弈变形
    Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并
    BZOJ 1031: [JSOI2007]字符加密Cipher 后缀数组
    HDU 5769 Substring 后缀数组
  • 原文地址:https://www.cnblogs.com/zhangzhijian/p/11176165.html
Copyright © 2020-2023  润新知