nginx 跟 apache 处理请求的对比

链接:https://www.zhihu.com/question/22062795/answer/20197329
来源:知乎

两种server 的工作方式:

1. apache:一个server采用一个进程负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。其缺点题主应该也感觉到了,此处不述。

2. nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。

简单来说:

    同样的4个进程,

    apache 采用一个进程负责一个request的方式,那么,同时进来4个request之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第5个request进来了。就无法及时反应了,因为4个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个request,就新开个进程来处理。

    nginx不这样,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。

    由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。

apache处理请求 专篇:

作者:酒窝
链接:https://www.zhihu.com/question/23786410/answer/153455460
来源:知乎

prefork工作模式是linux下apache安装时候的默认工作模式,是使用最普遍的工作模式。为了能够简单的明白他的工作原理,下面是一个假设:

有一台正在运行的apache服务器,用户A访问该apache的时候apache建立一个新的进程1处理用户A的请求。

这时又有一个用户B访问该apache,apache又建立一个新的进程2处理用户B的请求。

后来又有用户C,D,E访问该apache,apache又建立三个进程3,4,5处理他们的请求。

如果每当一个新用户访问该apache,apache再建立一个新的进程处理用户的请求,是不是太慢了呢?

所以apache的prefork模式在apache第一次启动的时候就建立5个进程,等待用户的连接请求,有一个用户访问,就有一个进程处理他的请求。

那么如果有5个用户同时访问apache,apache第一次建立的5个进程全部用光了,所以apache就再从新在建立5个进程,等待下一批用户的请求。


阅读更多
文章标签: nginx
上一篇Linux下搭建MySQL集群 / Mysql“集群”和”主从“两者的区别
下一篇mysql 开启远程登陆及修改密码
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭