nginx服务器的web请求机制
web服务器与客户端是一对多的关系,web服务器必须有能力同时为多个客户端提供服务。一般来说完成处理请求工作有多进程方式、多线程方式、异步方式。
多进程方式
服务器每接收到一个客户端请求时,就有服务器主进程生成一个子进程来于该客户端建立连接进行交互,知道连接断开,子进程结束。
多进程的有点在于设计简单 、各个子进程之间相互独立,处理客户端的请求过程彼此互不干扰,当一个进程出现问题不会用影响其他进程,保证服务的稳定。
多进程的缺点在于创建一个子进程需要进行内存复制等操作,产生额外的资源开销,因此大量的web请求会对系统资源造成很大的压力,导致系统性能下降。apache服务器采用多进程方式,并采用预生成子进程的方式应对高并发,但是并没有解决根本问题
多线程方式
多线程是指客户端接收请求时由主进程派生一个线程出来与其交互。从系统的开销上有明显的减少,从而符合web服务器对系统资源的要求。
但是使用线程进行任务调度,开发上要遵循一定的标准,多个进程位于一个进程内同时要彼此之间相互不影响,开发难度上以及管理上会有一定困难。IIS服务器及时采取多线程方式,为了提供未定的服务。通常会定期检查和从启服务器以防止意外的发生。
异步方式
发送方向接收方发送请求不用等待相应,可以继续其他的工作,接收方处理请求进行IO操作如果不能立马等到结果也不用等待。当IO处理完后通知接收方,接收方再响应给发送方。
nginx采取的方式
nginx采取的是多进程和异步非阻塞方式。我们知道nginx启动时会生成一个主进程以及多个工作进程(在nginx配置文件中指定),nginx的所有工作进程多可以接收和处理客户端的请求。这类似于apache使用进程池机制预先生成多个进程等待处理客户端请求。而异步非阻塞方式方式通过每个工作进程处理客户端请求后调用IO进行处理时可以去处理其他的事情。当客户端请求增长并发量高的时候能够保证不增长系统资源同时保证不降低请求的处理能力。