Nginx和Apache的不同之处

Apache 是什么?

使用HTTP协议,从Web浏览器接收到像”GET”和”POST”等请求,并根据该请求进行处理的服务器。

Nginx 是什么?

这是一个专注于高并发性、处理能力和内存利用率的开发的开源Web服务器。

Web服务器连接处理的架构

多进程模型

每次从客户端进行连接时,都会派生一个新的进程进行处理。
由于派生进程的成本较高,通常采用预先派生(预先派生进程)模型。

<利点>
– 由于每个子进程具有独立的内存空间,因此容易嵌入脚本语言等
例如:Apache HTTP Server mod_php

<缺点>
– 由于无法共享内存空间,进程间信息共享困难
– 当同时连接数增加时,子进程数量也会相应增加
→ 大量消耗内存
→ 上下文切换开销增大
※ 上下文切换…为了让多个进程能够共享一个CPU,保存和恢复CPU状态(上下文信息工程的信息)的过程

多线程模型

・对于每个客户端连接都生成一个线程来处理
・还有混合模型,例如多进程和多线程的混合模型
例)Apache HTTP服务器 – MPM worker
<优点>
・各个线程之间可以共享内存空间
・与多进程模型相比,内存消耗和上下文切换开销较小
<缺点>
・由于共享内存空间,可能无法嵌入脚本语言
→为什么?
・当同时连接数增加时,线程数也会随之增加
→ 上下文切换开销变得更大。(由于没有切换内存空间,相比多进程模型要小)

事件驱动模型

・每个客户端连接都进行事件处理
・由于每个进程只能使用一个CPU,所以需要使用工作模型来准备与CPU数量相同的进程,如Apache HTTP Server – MPM event和Nginx
<优点>
・可以共享内存空间
・即使并发连接数增加,进程或线程数也不会增加
→ 内存消耗和上下文切换开销较小
<缺点>
・由于只有一个内存空间,可能无法嵌入脚本语言
→为什么?

▼Nginx
・「C10K问题」-客户端1万台问题

・多进程模型或多线程模型的Web服务器
同时连接增加
→ 进程数或线程数增加
→ 上下文切换的开销增加
→ 无法将足够的时间用于本来的处理

为什么要使用「Nginx」呢?

・事件驱动模型
上下文切换的开销很小
→ 解决”C10K问题”的方案
・内存空间仅为一个,因此即使连接数增加,内存使用量也很小
→ 可以减小虚拟机实例的大小
→ 资源的高效利用

Nginx和Apache有什么不同。

①内存消耗量
尺寸小巧
→ 什么是“尺寸”?
Apache2.4引入了MPM,但是
→ 什么是“MPM”?

②同时访问人数
设计考虑到C10K问题

③速度
在静态文件方面,速度较快。
而在动态内容方面,使用通过mod_*集成的apache的prefork MPM可以避免额外开销,因此更快。