Nginx对web请求的处理机制

首先说一下web服务器处理请求共有三种:多进程、多线程、异步
Nginx如何处理请求呢?
nginx采用多进程+异步(无阻塞)的方式对请求进行处理,当nginx服务启动时,会产生一个主进程,和多个工作进程(worker process在配置文件中进行配置)。工作进程用于接受用户的请求,这些工作进程使用异步非阻塞方式,当接受到请求时,对请求进行处理,如果不能立即得到结果,不会等待,而是去处理其他请求,当IO调用有返回值时,就会通知工作进程,该工作进程得到结果,会暂停处理其他事务,相应客户端的请求。nginx使用异步调用减少了再IO请求中的时间延时。保证了处理能力
Nginx的事务处理方法
Nginx服务器的工作进程调用IO后,不会等待返回值,而是去进行其他工作了。当IO调用返回后,会通知工作进程。这里有一个问题,IO调用时如何把自己的状态通知给工作进程的呢?
有两种方式,1、间隔检查;2、回调
第一种方法就是隔断时间检查是否有返回值,如果有,就响应客户端,如果没有,继续工作
第二种方法是提供回调接口,当IO调用在完成时,主动通知工作进程。
select/poll/epoll/kqueue等这样的系统调用就是用来支持第二种解决方案的。这些系统调用,也被称为时间驱动模型,它们提供了一种机制,让进程可以同时处理多个并发请求,不用关心IO调用的具体状态。
web服务器处理请求的方式
多进程方式
多进程方式是指,服务器每当接收到一个客户端时,就由服务器主进程生成一个子进程出来和客户端建立连接进行交互,直到连接断开,该子进程就结束。
多进程方式的优点在于,设计和实现相对简单,各个子进程之间相互独立,处理客户端请求的过程彼此不受到干扰,并且当一个子进程产生问题时,不容易将影响漫延到其他进程中,这保证了提供服务的稳定性。当子进程退出时,其占用资源会被操作系统回收,也不会留下任何垃圾。而其缺点也是明显的。操作系统中生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定的额外开销,因此,如果Web服务器接收大量并发请求,就会对系统资源造成压力,导致系统性能下降。
初期的Apache服务器就是采用这种方式对外提供服务的。为了应对大量并发请求,Apache服务器采用“预生成进程”的机制对多线程方式进行了改进。“预生成进程”的工作方式很好理解。它将生成子进程的时机提前,在客户端请求还没有到来之前就预先生成好,当请求到来时,主进程分配一个子进程和该客户端进行交互,交互完成之后,该进程也不结束,而被主进程管理起来等待下一个客户端请求的到来。改进的多进程方式在一定程度上缓解了大量并发请求情形下Web服务器对系统资源造成的压力。但是由于Apache服务器在最终的架构设计上采用了多进程方式,因此这不能从根本上解决问题。
多线程方式
多线程方式和多进程方式相似,它是指,服务器每当接收到一个客户端时,会有服务器主进程派生一个线程出来和该客户端进行交互。
由于操作系统产生一个线程的开销远远小于产生一个进程的开销,所以多线程方式在很大程度上减轻了Web服务器对系统资源的要求。该方式使用线程进行任务调度,开发方面可以遵循一定的标准,这相对来说比较规范和有利于协作。但在线程管理方面,该方式有一定的不足。多个线程位于同一个进程内,可以访问同样的内存空间,彼此之间相互影响。同时,在开发过程中不可避免地要由开发者自己对内存进行管理,其增加了出错的风险。服务器系统需要长时间连续不停的运转,错误的逐渐积累可能最终对整个服务器产生重大影响。
IIS服务器使用了多线程方式对外提供服务,它的稳定性相对来说还是不错的,但对于经验丰富的Web服务器管理人员而言,他们通常还是会定期检查和重启服务器,以预防不可预料的故障发生。
异步方式
异步方式是和多进程方式及多线程方式完全不同的一种处理客户端请求的方式。在介绍该方式之前,我们先复习一下同步、异步以及阻塞、非阻塞的概念。
网络通信中的同步机制和异步机制是描述通信模式的概念。同步机制,是指发送方发送请求后,需要等待接收到接收方发回的响应后,才接着发送下一个请求。异步机制,和同步机制正好相反,在异步机制中,发送方发出一个请求后,不等待接收方响应这个请求,就继续发送下个请求。在同步机制中,所有的请求在服务器端得到同步,发送方和接收方对请求的处理步调是一致的。在异步机制中,所有来自发送方的请求形成一个队列,接收方处理完成后通知发送方。
阻塞和非阻塞用来描述进程处理调用的方式,在网络通信中,主要指网络套接字Socket的实质也就是IO操作。Socket的阻塞调用方式为,调用结果返回之前,当前线程从运行状态被挂起,一定等到调用结果返回之后,才进入就绪状态,获取CPU后继续执行。Socket的非阻塞调用方式和阻塞调用方式正好相反,在非阻塞方式中,如果调用结果不能马上返回,当前线程也不会被挂起,而是立即返回执行下一个调用。
在网络通信中,经常可以看到有人将同步和阻塞等同、异步和非阻塞等同。事实上,这两对概念有一定的区别,不能混淆。两对概念的组合,就会产生四个新的概念,同步阻塞、异步阻塞、同步非阻塞、异步非阻塞。
  • 同步阻塞方式,发送方接收方发送请求后,一直等待响应。接收方处理请求时进行的IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作。比如,在超市排队付账时,客户(发送方)向收款员(接收方)付款(发送请求)后需要等待收款员找零,期间不能做其他的事情。而收款员要等待收款机返回结果(IO操作)后才能把零钱取出来交给客户(响应请求),期间也只能等待,不能做其他事情。这种方式实现简单,但是效率不高。
  • 同步非阻塞方式,发送方向接收方发送请求后,一直等待响应。接收方处理请求时进行的IO操作如果补鞥呢马上得到结果,就立刻返回,去做其他事情,但由于没有得到请求处理结果,不响应发送方,发送方一直等待,一直到IO操作完成后,接收方获得结果响应发送方后,接收方才进入下一次请求过程。在实际中不适用这种方式。
  • 异步阻塞方式,发送方向接收方发送请求后,不用等待响应,可以接着进行其他工作。接收方处理请求时进行的IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作。这种方式在实际中也不使用。
  • 异步非阻塞方式,发送方向接收方发送请求后,不用等待响应,可以继续其他工作。接收方处理请求时进行的IO操作如果不能马上得到结果,也不等待,而是马上返回去做其他事情,当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。继续使用在超市排队付账的例子。客户(发送方)向收款员(接收方)付款(发送请求)后在等待收款员找零的过程中,还可以做其他事情,比如打电话、聊天等。而收款员在等待收款机产生结果后,收款员给客户端结账(响应请求)。在四种方式中,这种方式是发送方和接收方通信效率最高的一种。
白发渔樵

白发渔樵

发表评论

电子邮件地址不会被公开。 必填项已用*标注