Nginx 与 Apache 对比
前面两个小节我们讲述了 的一些优点,这一节我们来与 Web 服务器领域的另霸主 Apache 做一下比较。如果说 是新生代霸主的话,那么 Apache 就是当之无愧的老霸主。至少在前几年 在 Web 服务器领域只是占据老二的位置。
但是随着互联网的发展,越来越多的人和企业开始转向 的怀抱,从而使得 的市场占有率逐年上升,直到牢牢占据第一的宝座。那么这一对新老技术的代表之间,究竟有着怎样的差别呢?
1. 进程模型
的进程模型前面已经提到过,它是通过异步的、非阻塞的、事件驱动的方式实现的。 的工作进程是多进程的,每个 Worker 进程可以异步处理大量的请求,因此在高并发下 能保持低资源低消耗高。
Apache 有一共有三种稳定的 MPM(Multi-Processing Module,多进程处理模块)模式,其中最常用和认的是 prefork 模式。prefork 是非线程型的、预派生的 MPM,使用多个进程,每个进程在某个确定的时间只单独处理连接,效率高,但内存使用比较大。进程相对占用更多的系统资源,消耗更多的内存。
因此,Apache 并不擅长处理高并发请求。 种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。因此 Apache 是阻塞型的。当请求过多时,开启的进程较多,占用内存大,每秒最多的并发连接请求最多不超过 3000 个,而 则可以每秒并发连接超过 10 万请求。
2.
的配置简洁,且正则表达式,使用起来非常方便。在启动或者热加载时都会优先检查是否存在语法。Apache 的配置则略显复杂,而且只有启动时候才知道配置是否存在问题,如果是重启出错则会导致服务中断,进而影响业务。
3. 对比
根据前面的进程模型对比,我们可以看出: 是轻量级、高并发、海量请求的 web 服务器,而 Apache 是重量级、高并发的 web 服务器。
在处理方面的要远超于Apache,而且压缩、缓存等配置。 最擅长的是静态资源访问和反向代理。其反向代理模块也同时 4 层协议(主要是 TCP 协议/ UDP 协议)和七层协议(HTTP 协议、WebSocket 协议、WSGI 协议等)的反向代理。同时也可以作为均衡服务器,也 4 层和 7 层的均衡,这些优势是 Apache 无法比拟的。但是 Apache 在处理动态请求方面有较大优势,比如 rewrite(对 url 重写)。如果网站使用 rewrite 频繁的情况下,建议用 Apache。
此外,根据 和 Apache 的进程模型,可以看到,Apache 进程对应连接请求,而 的 worker 进程可能对应很多个连接请求,这样如果 的进程死掉,会影响比较多的请求,所以 Apache 相比 会更稳定一些。
4.部署方面
安装和启动都特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,热部署,实现不间断服务的情况下进行软件版本的与版本的回退。而 Apache 在配置后,只能手工重启服务或者使用第三方实现热部署,期间服务会出现短暂的不可用。
5. 社区情况
Apache 出现时间比较早,仍然是主流的 Web 服务器,拥有丰富的特性,成熟的技术和开发社区,还有数不甚数的第三方。而 作为后起之秀,社区同样非常活跃,版本迭代更新快,各种高的第三方模块层出不穷。使用 Apache 和 中出现的大部分问题都能在社区和网上找到相应的案。