PHP 语言,Web容器选Nginx还是Apache

二者简述:

Apache 和 Nginx 的最大不同在于对连接的处理方式不同。

Apache 提供了mpmprefork、mpmworker、mpm_envent这三种模式来处理。

Nginx 则是异步、非阻塞的事件驱动模型。

Apache处理方式:

mpm_prefork:模块生成多个子进程,每个子进程都是单线程的,每个线程处理一个请求。当请求数量大于进程数时,性能就差许多了。如果进程数量足够,用户量小,那又是最好的了。

mpm_worker:与prefork不同的是,worker每个子进程创建多个线程,每个请求分配一个线程来处理,线程相对于进程开销更小,  高并发的场景下会比prefork拥有更多的可用线程。相反的如果某个子线程出问题了,也会导致同一个子进程下的线程出问题。

mpm_event:与worker相似,区别在于event可以处理长连接(keep-alive),以避免线程被请求长期占用而造成资源浪费,同时也增强了高并发场景下的请求处理能力。前两种方式都存在,处理长连接的问题时,哪怕没有请求线程也会一直被占用的问题。

Nginx处理方式:

Nginx由多个工作进程组成,每个进程互相独立,每个工作进程是单线程的,由基本的事件收集器、事件分发器、事件处理器,这三部分组成。 事件分发器每发送一个请求,“目标对象”就将其放入一个待处理事件的列表,使用非阻塞I/O方式调用“事件处理器”来处理该请求,又称多路IO复用方法。

进程数一般根据CPU核心线程数来配置,查看如下:

小结:

无论动态还是静态内容Apache都可以处理,Apache内置了多种动态脚本语言(PHP、Python、Perl等)的处理器,而Nginx需要借助外部处理器才可以处理动态内容。

通过Nginx和Apache二者的工作方式也可以看出,Apache倾向于为每个请求分配一个线程,开销大,但处理计算耗时的动态内容时优势很大。而Nginx则更倾向于大量的请求,请求来了分发给指定的处理者,开销小,尤其大量静态内容的时候更高效。也就是说Apache更适合动态语言的业务处理,Nginx更适合大量请求的分发、负载均衡。

对于Nextcloud来说,官网推荐Apache。不过个人情况不同,有的更适合Nginx,有的更适合Apache。或者二者一起用,具体看个人的服务器的实际情况、以及服务规模而定。

 

 

评论列表: