apache和nginx的区别

  1. nginx、apache各自的优缺点

    nginx相对于apache的优点:

    1. 轻量级,同样起web 服务,比apache 占用更少的内存及资源

    2. nginx采用epoll IO复用模型;异步处理请求;线程与请求是一对多关系。

    3. 抗并发,nginx以epoll and kueue作为开发模型,处理请求是异步非阻塞的,负载能力比apache高很多,而apache 则是阻塞型的。在高并发下nginx 能保持低资源低消耗高性能 ,而apache在php处理慢或者前端压力很大的情况下,很容易出现进程飙升,从而拒绝服务。

    4. nginx处理静态文件好,静态处理性能比apache高三倍以上,,Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用 ,

    5. 高度模块化的设计,编写模块相对简单

    6. nginx配置简洁,正则配置使很多配置变的简单,并且配置完成可以使用-t进行检测配置有没有问题,而apache配置复杂,拥有多个配置文件,没有配置文件检测

    7. 社区活跃,各种高性能模块出品迅速啊

    8. 可以做反向代理服务器、负载均衡服务器,支持七层负载均衡

    9. 可以7*24不间断运行,还能够在不间断服务的情况下进行平滑升级

    apache相对于nginx的优点:

    1. rewrite 能力比nginx强大

    2. 模块超多,比如ssl 的模块就比前者好

    3. 稳定性更高

    4. nginx几乎没有处理动态请求的能力,apache相对于nginx而言在处理动态请求时,有优势

    总结:

    1. apache稳定、对动态请求处理强,但同时高并发时性能较弱,耗费资源多;nginx高并发处理能力强、擅长处理静态请求、反向代理、均衡负载。需要性能的web服务,用nginx 。如果不需要性能只求稳定,那就apache。

    2. nginx+apache结合使用。nginx做前端负责进行抗并发、负载均衡、做静态文件缓存,后端采用apache处理动态请求。

    3. 大部分情况下nginx都优于APACHE,比如说静态文件处理、PHP-CGI的支持、反向代理功能、前端Cache、维持连接等等。在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。apache的缺陷,抗压不行,且由于线程数飙升,资源需求量也是极大

  2. 在高并发的情况下,nginx 比 apache 快,低并发下并不明显;快的原因得益于 nginx 的 epoll 模型。

    • apache 是多线程或者多进程,在工作的时候,当来了一个 http 响应,一个进程接收(listen)–>识别处理—>返回请求,在此过程中,一个进程全部处理,apache 对于套接字的 I/O读或者写,但是读或者写都是阻塞的,阻塞意味着进程就得挂起进入 sleep 状态,那么一旦连接数很多,apache 必然要生成更多的进程来响应请求,一旦进程多了,CPU 对于进程的切换就频繁了,很耗资源和时间,所以就导致apache 性能下降了,说白了就是处理不过来这么多进程了。

    • Nginx 采用 epoll 模型,异步非阻塞。对于 Nginx 来说,把一个完整的连接请求处理都划分成了一个一个的事件。比如 accept()、receive()、磁盘 I/O、send()等,每部分都有相应的模块去处理,一个完整的请求可能是由几百个模块去处理。真正核心的就是事件收集和分发模块,这就是管理所有模块的核心。只有核心模块的调度才能让对应的模块占用 CPU 资源,从而处理请求。拿一个 HTTP请求来说,首先在事件收集分发模块注册感兴趣的监听事件,注册好之后不阻塞直接返回,接下来就不需要再管了,等待有连接来了内核会通知你(epoll 的轮询会告诉进程),cpu 就可以处理其他事情去了。一旦有请求来,那么对整个请求分配相应的上下文(其实已经预先分配好),这时候再注册新的感兴趣的事件(read 函数),同样客户端数据来了内核会自动通知进程可以去读数据了,读了数据之后就是解析,解析完后去磁盘找资源(I/O),一旦 I/O 完成会通知进程,进程开始给客户端发回数据 send(),这时候也不是阻塞的,调用后就等内核发回通知发送的结果就行。整个下来把一个请求分成了很多个阶段,每个阶段都到很多模块去注册,然后处理,都是异步非阻塞。异步这里指的就是做一个事情,不需要等返回结果,做好了会自动通知你。

    • 但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的select 模型或许比epoll 更高性能。

你可能感兴趣的:(运维)