服务器-Nginx的Web请求处理机制

并行处理请求的三种方式

web服务器和客户端是一对多的关系,所以web服务器要能同时为多个客户端提供服务。一般有三种方式:多进程方式、多线程方式和异步方式。

多进程方式

服务器每接收到一个客户端时,就由服务器主进程生成一个子进程与该客户端交互 ,直到连接断开,子进程结束。

  • 优点:设计和实现相对简单、子进程之间相互独立,处理客户端请求的过程彼此不干扰,一个有问题不会影响其他的。保证了稳定性。子进程退出时,资源会被系统回收,不会留下垃圾。
  • 缺点:每生成一个子进程,都要进行内存复制的操作,在资源和时间上会有额外的开销。
    Apache采用的“预生成进程”可以稍微解决大并发请求,但是本质是多进程,无法解决多并发的问题。
    多线程方式
    服务器每接收到一个客户端时,会由服务器主进程派生一个线程出来和该客户端进行交互。
  • 优点:产生一个线程的开销要小于一个进程,比较规范,利于协作。
  • 缺点:多个线程在一个内存空间中,彼此互相影响,对内存的管理增加了出错的风险。

    异步方式

    同步、异步与阻塞、非阻塞
    同步和异步描述的是通信模式的概念
    同步:发送方发送请求后,需要等待接收到接收方发回的响应后,才接着发送下一个请求。所有的请求在服务器端得到同步,发送方和接收方对请求的处理步调是一致的。
    异步:发送方发送请求后,不等待接收方响应这个请求,就继续发送下一个请求。所有来自发送方的请求形成一个队列,接收方处理完后通知发送方。

阻塞和非阻塞描述的是进程处理调用的方式,在网络通信中,主要指的是网络套接字socket的阻塞和非阻塞方式,socket实质上就是IO操作
阻塞:调用结果返回之前,当前的线程从运行状态被挂起,一直等到调用结果返回之后,才进入就绪状态,获取CPU继续执行。
非阻塞:调用结果返回之前,线程不会被挂起,而是立即返回执行下一个周期。

所以共有四种方式:

  • 同步阻塞:发送方发送请求后,一直等待响应;接收方处理请求时不能立即等到结果的时候,就会一直等待返回结果,才响应发送方,期间不能执行任何其他工作。
  • 同步非阻塞:发送方发送请求后,一直等待响应;接收方处理请求时不能立即等到结果的时候,就会立即返回,去做别的事情,但是由于没有得到结果,也不响应发送方,发送方一直等待。
  • 异步阻塞:发送方发送请求后,不等待响应;接收方处理请求时不能立即等到结果的时候,就会一直等待返回结果,才响应发送方,期间不能执行任何其他工作。
  • 异步非阻塞:发送方发送请求后,不等待响应;接收方处理请求时不能立即等到结果的时候,就会立即返回,去做别的事情,但是由于没有得到结果,也不响应发送方,发送方一直等待。
Nginx如何处理请求

Nginx采用的是异步非阻塞的方式。采用Master-work模型(其实实际也有single的单进程模式,但是性能较差,很少使用)。每个工作进程采用异步非阻塞的方式。
Nginx服务器的工作进程调用IO后,就去进行其他工作,当IO调用返回,会通知工作进程。接下来就是怎么通知给工作进程了。