Nginx——工作模型

文章目录

  • 其他文章
  • 1、Master-Worker模式
  • 2、accept_mutex(加锁)
  • 3、为什么使用进程不使用线程?
  • 4、如何处理并发请求?(有请求就处理,没请求就休眠)

其他文章

Nginx——安装Nginx1.6.1
Nginx——工作模型
Nginx——配置文件详解
Nginx——代理
Nginx——调优
Nginx——负载均衡策略
Nginx——Session共享
Nginx——动静分离

1、Master-Worker模式

1、Nginx在启动后,会有一个master进程和多个相互独立的worker进程
2、Master接收来自外界的信号,向worker进程发送账号,每个进程都有可能来处理这个连接
3、Master进程能监控Worker进程的运行状态,当worker进程退出后(异常情况下),会自动启动新的worker进程

在这里插入图片描述

2、accept_mutex(加锁)

由于所有的子进程都继承了父进程sockfd,那么当连接进来时,所有子进程都将收到通知,并“争着”与他建立连接,这就叫“惊群现象”。大量的进程被激活又挂起,只有一个进程可以accept()到这个连接,这当然会消耗系统资源。Nginx提供了一个accept_mutex加载accept上的一把共享锁。即每个worker进程在执行accept之前都需要先获取锁,获取不到就放弃执行accept()。有了这把锁之后,同一时刻,就只会有一个进程去accept(),这样就可以防止惊群现象。
当一个woker进程在accept()这个连接之后。就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,完成一个完成的请求,一个请求,完全由worker进程来处理,而且只能在一个worker进程中处理。

3、为什么使用进程不使用线程?

1、节省锁带来的开销。每个 worker 进程都是独立的进程,不共享资源,不需要加锁。同 时在编程以及问题查上时,也会方便很多。
2、独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后, 其它进程还在工作,服务不会中断,master 进程则很快重新启动新的 worker 进程。当然, worker 进程的也能发生意外退出。

4、如何处理并发请求?(有请求就处理,没请求就休眠)

每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程 度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发 request,并等待请 求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事 件:“如果 upstream 返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会 触发这个事件,worker 才会来接手,这个 request 才会接着往下走。由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中,实际上花费在 server 机器上的时间片不多,这就是几个进程就能解决高并发的秘密所在。

我是小白弟弟,一个在互联网行业的小白,立志成为一名架构师
https://blog.csdn.net/zhouhengzhe?t=1

你可能感兴趣的:(#,Nginx,nginx,http,java,多线程)