ngxin 相对于 apache 来说,占用资源更少,这是高度模块化设计的优势。 nginx 模块编写相对简单,各种高性能模块在社区上频繁亮相。 由于 apache 是同步多进程模型,每个连接对应一个进程,而 nginx 是异步非阻塞模型,因此在资源消耗和并发能力上都优于 apache,而 apache 不仅因为在连接量大时需要为每个连接提供一个处理进程而需要消耗大量资源,进程的创建和销毁也会伴随着较大的代价。 当然了,apache 的 prefork 机制在一定程度上缓解了这个问题。
与 apache 的阻塞式IO相比,nginx 使用异步非阻塞的IO模型处理请求,实现了高性能、高并发的事件处理。 根本上,nginx 使用的是 epoll(linux)、kqueue(bsd),而 apache 使用的是 select IO 复用模型。 当 socket 活跃数量比较高的时候,select 性能要高于 epoll,但对于 web 服务器来说,大多数连接并不会长时间处于连接通讯状态,短连接比例较大,这样的情况下,epoll 的性能要明显由于 select,而在网游服务器等长连接为主,连接少而活跃的应用场景中,select 性能就较为突出了。 同时,由于 select 的性能随连接数量增长而显著下降,因此对于大量连接的应用场景,epoll 是最好的选择。
nginx 模块编写相对简单,配置文件逻辑清晰、简洁,使用较为方便。
虽然 nginx 在静态页面和反向代理的应用场景中表现突出,但是对于动态请求的处理,由于 nginx 并不原生支持 php 而是使用 php-fpm 处理,nginx 将客户端请求发送给 php-fpm 进程,如果 php-fpm 此时处理的连接过多,则会返回 502 错误。 而原生支持 php 的 apache,由于他使用同步多进程模型,并没有这样的问题。 不过同样的,在 apache 中如果 php 请求过多且处理较慢,也会出现 apache 进程数飙升服务端压力过大而拒绝服务的情况。
apache 的同步多进程模型及其历久弥新的工程质量都成为了其稳定性的保障,作为后起之秀的 nginx 在稳定性方面还是与行业老大哥有着一定的差距,当然,这很大程度上存在于人们的心理上。
apache 的 rewrite 规则通常写在分布式配置文件 .htaccess 里面,而 nginx 则写在统一的配置文件中。 在编写上,nginx rewrite 规则编写较为简单,但 RewriteRule 反向引用等用法是 apache 特有的。 一般来说,对于大量 rewrite 的网站,推荐使用 apache