page contents

深入探索Nginx工作原理

Nginx具有丰富的模块库、灵活的配置、较低资源消耗等优点。下面,我们一起深入看一下Nginx的工作机制。

attachments-2020-03-FMS0zVsc5e7abcf5b9a5d.jpg

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:


root@eg001:~# nginx -h
nginx version: nginx/1.1.19
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /etc/nginx/)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -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 都有哪些模块

v2-05d41a1fcb3b489c4530bb33bbfdee62_720w.jpg


惊群效应:

- 当内核 accept 一个连接时,会唤醒所有等待中的进程

- 但实际上只有一个进程能获取连接,其他的进程都是被无效唤醒的

- 所以 Nginx 采用了自有的一套 accept 加锁机制,避免多个进程同时调用 accept

- Nginx 多进程的锁在底层默认是通过 CPU 自旋锁来实现。如果操作系统不支持自旋锁,就采用文件锁。



attachments-2020-03-dtNReyAm5e7abd4052ef1.jpg

  • 发表于 2020-03-25 10:09
  • 阅读 ( 490 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章