Nginx学习笔记之Nginx的进程结构及实例演示

声明:图片来自  github:https://github.com/russelltao/geektime-nginx 

Nginx的进程结构

  • Nginx有两种进程结构:
    • 单进程结构
    • 多进程结构
  • 单进程结构不适合生产环境,只适合做开发调试使用
  • 在生产环境中我们必须保证Nginx足够健壮,以及Nginx可以利用多核的特性,而单进程的Nginx是做不到这一点的,所以默认额配置中都是打开多进程的Nginx。

  • 多进程的Nginx的进程模型:

  • Nginx的进程是这样的,会有一个父进程叫MASTER PROCESS,master进程,它会有很多子进程,这些子进程会分为两类
    • 一类叫做worker进程
    • 一类叫做cache相关的进程。
  • 为什么Nginx采用多进程结构而不是多线程结构?
    • 这要从Nginx最核心的一个目的,Nginx要保证它的高可用性和高可靠性,如果Nginx采用的是多线程的结构时,因为线程之间是共享同一个地址空间的,若某一个第三方模块引发了地址空间导致的段错误时,在地址越界出现时,会导致整个Nginx进程全部挂掉。当采用多进程这样的Nginx进程模型时,往往就不会出现这样的问题。
  • Ngin在做它的进程设计时,同样遵循了高可用,高可靠的目的
    • 比如说,在master进程中,通常第三方模块是不会在这里加入自己的功能和代码的
    • 虽然Nginx在设计时允许第三方模块在master进程中添加自己独有的自定义的一些方法,但是通常没有第三方模块会这样做。
    • master进程被设计来的目的是用来管理worker进程的,也就是说所有的worker进程是处理真正的请求的,mater进程负责监控每个worker进程是不是在正常的工作,需不需要做重新载入配置文件,需不需要做热部署。
    • 当我们说到cache,也就说到缓存的时候,缓存要在多个worker之间共享的,而且缓存不仅要被worker进程使用,还要被Cache Manager 和 Cache Loader 进程使用
    • Cache Manager 和 Cache Loader也是为反向代理时,后端发来的动态请求做缓存所使用的, Cache Loader做缓存的载入,Cache Manager做缓存的管理,实际上每一个请求处理时,使用的缓存还是由worker进程来进行的,这些进程间的通信都是使用共享内存来解决的。
  • 为什么work进程要很多?
    • 从图中可以看到Cache Manager 和 Cache Loader各有一个进程,mater因为是父进程,所以也是一个。
    • worker进程为什么很多是因为Nginx采用了事件驱动模型以后,它希望每个worker进程从头到尾占一个CPU,所以往往我们不止要把worker数量配置与我们服务器上的CPU核数一致以外,我们还需要把每一个worker进程和某一颗CPU核绑定在一起,这样可以更好的使用每个CPU核上面的CPU缓存来减少缓存失效的命中率

Nginx的进程结构实例演示

  • Nginx使用的是多进程模型,由maser作为父进程启动许多子进程,Nginx父子进行之间是通过信号进行管理的。

  • master进程id是9170,两个worker进程还有cache进程它们都是由9170进程起来的。
  • 下面在sbin目录下执行  ./nginx -s reload   (结果见下图)
  • 这会把之前的worker进程和cache进程优雅的退出,然后使用新的配置项去启动新的worker进程。这里虽然没有改变配置,我们可以看到老的三个子进程将会退出,还会生成新的三个子进程。

  • 可以看到三个子进程id与之前不一样了。
  • reload和hup信号它们的作用是相同的,现在我们向Nginx的master进程9170发送hup信号,是否会发生相同的结果呢?
  • 输入  kill -SIGHUP 9170     (结果见下图)

  • 可以看到三个子进程id与之前不一样了。
  • 向quit,stop对应的也有信号,如果我向一个worker进程,如16982发送一个让它退出的信号,那么这个worker进程就会退出,但是进程在退出时会自动的让它的父进程9170也就是master进程发送一个SIGCHILD,这样一个信号收到以后,mater就知道它的子进程已经退出了,它会新起一个worker进程,维持总共两个worker进程这样一个进程结构。
  • 输入 kill -SIGTERM 16982     (结果见下图)

  • 向16982发送SIGTERM信号后,1698进程就退出了,Nginx又重新起了一个进程叫17004。
  • 从上面一系列操作可以看到,Nginx的进程架构,以及Nginx使用信号的方式所以其实命令行中的许多子命令就是在向master进程发送信号而已。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值