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