Nginx 原理

Web服务器处理并发连接请求的工作模型有以下几种方式:

1、单线程web服务器(Single-threaded web servers)
此种架构方式中,web服务器一次处理一个请求,结束后读取并处理下一个请求。在某请求处理过程中,其它所有的请求将被忽略,因此,在并发请求较多的场景中将会出现严重的性能问题。(即一次只能处理一个请求)
 
2、多进程/多线程web服务器
此种架构方式中,web服务器生成多个进程或线程并行处理多个用户请求,进程或线程可以按需或事先生成。有的web服务器应用程序为每个用户请求生成一个单独的进程或线程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程或线程将会消耗大量的系统资源。(即每个进程只能响应一个请求,并且一个进程对应一个线程)
 
3、I/O多路复用web服务器
为了能够支持更多的并发用户请求,越来越多的web服务器正在采用多种复用的架构———即同步监控所有的连接请求的活动状态,当一个连接的状态发生改变时(如数据准备完毕或发生某错误),将为其执行一系列特定操作;在操作完成后,此连接将重新变回暂时的稳定态并返回至打开的连接列表中,直到下一次的状态改变。由于其多路复用的特性,进程或线程不会被空闲的连接所占用,因而可以提供高效的工作模式。(这种架构可以理解为一个进程可以生成多个线程,每个请求交给一个线程进行处理)
 
4、多路复用多线程web服务器
将多进程和多路复用的功能结合起来形成的web服务器架构,其避免了让一个进程服务于过多的用户请求,并能充分利用多CPU主机所提供的计算能力。(这种架构可以理解为有多个进程,并且一个进程又生成多个线程,每个线程处理一个请求)
 
linux下常用的I/O模型(这里借用下在网上查阅的资料,感觉还好理解):
先引入select和epoll概念:
select和epoll是两个处理I/O模型的机制,可以加速请求处理,2者处理方式不同:通俗的讲,select机制是对没有处理好的I/O请求在一段时间内进行检测,并将其状态通知给用户,即有没有完成都会通知。而epool机制则是在该I/O请求完成后才通知给用户。
 
在Unix/Linux下共有五种I/O模型,分别是:
1)阻塞I/O
2)非阻塞I/O
3)I/O复用(select和poll)
4)信号驱动I/O(SIGIO)
5)异步I/O(Posix.1的aio_系列函数)
 
对以上模型的比较:
阻塞I/O:
应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示
 
非阻塞I/O:
我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。
 
I/O复用(select和poll):
I/O复用模型会用到select或者poll函数,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。
 
信号驱动I/O(SIGIO):
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
 
异步I/O(Posix.1的aio_系列函数):
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作
 
apache的工作模块:
prefork:多进程,每个请求用一个进程响应,这个过程会用到select机制来通知。
worker:多进程,一个进程可以生成多个线程,每个线程响应一个请求。
event:一个进程,每个进程响应多个用户请求,它是基于事件实现的。
 
基于事件机制的特性:
一个进程响应多个用户请求,利用run-loop机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过select或epoll机制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求。
 
 
对于高并发请求的实现:
1、基于线程:即一个进程生成多个线程,每个线程响应用户的每个请求。如worker模型
2、基于事件的模型,一个进程处理多个请求,并且通过epoll机制来通知用户请求完成。如event模型
 
web服务器工作流程:
我们知道web服务器是工作在用户空间的,用户空间通过系统调用来与内核打交道。
用户请求–>送达用户空间–>系统调用–>内核空间–>内核到磁盘上读取网页资源(在此过程中就牵涉到了以上几种模型的运用)

原创文章,作者:SDS,如若转载,请注明出处:http://www.178linux.com/74977

(1)
SDSSDS
上一篇 2017-05-07
下一篇 2017-05-07

相关推荐

  • ​第五周作业

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@localhost ~]# grep  -E "^[[:space:]]+" /boot/grub/grub.conf  root (hd0,0) kernel&nbs…

    Linux干货 2017-02-05
  • Linux ssh安全远程登录

                   Linux ssh安全远程登录 本章内容:     构建SSH远程登录系统     SSH(secure shell)是标准的网络协议,主要用于实现字符界面的远程登录管理…

    Linux干货 2016-10-10
  • 到处都是Unix的胎记

    一说起Unix编程,不必多说,最著名的系统调用就是fork,pipe,exec,kill或是socket了(fork(2),execve(2), pipe(2), socketpair(2), select(2), kill(2), sigaction(2))这些系统调用都像是Unix编程的胎记或签名一样,表…

    Linux干货 2015-04-03
  • Linux运维基础

    正则表达式

    Linux干货 2018-03-19
  • N26-第二周博客作业

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。    查看类    pwd : print name of current/working directory  打印当前工作目录;        &n…

    Linux干货 2017-02-17
  • zabbix表分区(适用于zabbix2.0.x,zabbix2.2.x和zabbix2.4.x)

    本文主要介绍了zabbix进行数据库表分区的方法:         在系统监控中,zabbix已经代替了nagios+cacti,zabbix以其良好的图形展示和高度自定义赢得了很多运维人员的喜爱。但是由于在工作中,zabbix跑的时间过长(我们公司跑了将近3年),web页面经常卡顿,监控…

    Linux干货 2015-10-27