Apache和Nginx性能优化对比,为什么 Nginx 比 Apache 更牛逼

Apache和Nginx性能优化对比,为什么 Nginx 比 Apache 更牛逼,Nginx才短短几年,就拿下了Web服务器大壁江山,众所周知,Nginx在处理大并发静态请求方面,效率明显高于Httpd,甚至能轻松解决C10K问题 。
在高并发连接的情况下,Nginx是Apache服务器不错的替代品 。Nginx同时也可以作为7层负载均衡服务器来使用 。根据我的测试结果,Nginx + PHP(FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍 。
一般来说,4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们将占用3GB以上的内存,还得为系统预留1GB的内存 。我曾经就有两台Apache服务器,因为在配置文件中设置的MaxClients为4000,当Apache并发连接数达到3800时,导致服务器内存和Swap空间用满而崩溃 。
而这台 Nginx + PHP(FastCGI) 服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存 。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M 。
在3万并发连接下,访问Nginx+ PHP(FastCGI) 服务器的PHP程序,仍然速度飞快 。
为什么Nginx在处理高并发方面要优于httpd,我们先从两种web服务器的工作原理以及工作模式说起 。
一、Apache三种工作模式我们都知道Apache有三种工作模块,分别为:prefork、worker、event 。

  • prefork: 多进程,每个请求用一个进程响应,这个过程会用到select机制来通知 。
  • worker: 多线程,一个进程可以生成多个线程,每个线程响应一个请求,但通知机制还是select不过可以接受更多的请求 。event: 基于异步I/O模型,一个进程或线程,每个进程或线程响应多个用户请求,它是基于事件驱动(也就是epoll机制)实现的 。
1、prefork的工作原理如果不用“–with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM 。它所采用的预派生子进程方式也是 Apache1.3中采用的模式 。
prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一 。
2、worker的工作原理相对于prefork,worker是2.0版中全新的支持多线程和多进程混合模型的MPM 。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器 。
但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性,这种MPM的工作方 式将是Apache2.0的发展趋势 。
3、event 基于事件机制的特性一个进程响应多个用户请求,利用callback机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过epoll机制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求 。可以实现一个进程程响应多个用户请求 。支持持海量并发连接数,消耗更少的资源 。
二、如何提高Web服务器的并发连接处理能力有几个基本条件:
1、基于线程,即一个进程生成多个线程,每个线程响应用户的每个请求 。
2、基于事件的模型,一个进程处理多个请求,并且通过epoll机制来通知用户请求完成 。
3、基于磁盘的AIO(异步I/O)
4、支持mmap内存映射,mmap传统的web服务器,进行页面输入时,都是将磁盘的页面先输入到内核缓存中,再由内核缓存中复制一份到web服务器上,mmap机制就是让内核缓存与磁盘进行映射,web服务器,直接复制页面内容即可 。不需要先把磁盘的上的页面先输入到内核缓存去 。

推荐阅读