Web服务器王者之争:该选择Apache还是Nginx

该选择Apache还是Nginx

Apache还是Nginx?关于这个议题争论一直都没有停止过。与其在一昧地进行口水战,不如通过一些关键点进行两者的比较,帮助站长捋清思路,选择更适合的Web服务器。

本文将从多个方面,对Nginx和Apache两者进行比较,论述两者的优劣点,希望能够起到抛砖引玉之效。

众所周知,互联网于90年代开始了全球性的“征服”。整个Web协议可以概括为访问者从给定的Web站点请求文档,而DNS和IP系统将该请求转发到正确的计算机。托管请求的网页的这台服务器计算机将把网页“提供”给访问者。

网页本质上是HTML文档。为了能够向访问者提供不同的网页,网站计算器需要一个服务器程序。Nginx与Apache之类的软件可以处理请求,对其进行分析,然后将相应的文档传输至访问者的浏览器进行查看。

  1. Apache
  2. Nginx
  3. 缓存问题:Nginx与Apache
  4. 处理请求:Nginx与Apache
  5. 如何查看网站所使用的Web服务器

Nginx和Apache是当下最为​​流行的Web服务器,用于将网页传递到用户的浏览器:

  • Apache于1995年首次发布,Nginx则于2004年发布。
  • 两者都被全球500强的大型公司使用。
  • Nginx的市场份额多年来一直在稳定增长。
  • 在某些情况下,Nginx在性能方面更具竞争优势。

Apache

在互联网的头几年,蒂姆·伯纳斯·李(Tim Berners-Lee)的CERN httpdNCSA HTTPd之后,Apache于1995年首次发布后迅速占领了市场,并成为世界上最受欢迎的Web服务器。如今,它仍然处于该市场地位,但是主要是出于遗留原因。Apache基金会根据Apache许可由Apache Foundation开发和维护Apache

关于Apache的命名,有两个不同的故事版本。一个版本说该名称起源于著名的美国原住民传统,而另一个版本则说该名称是“a patchy server”的一个双关语,即另外一种意思是一系列软件补丁。

Linux

Apache巨大的市场份额部分是由于它已预安装在所有主要的Linux发行版中,例如Red Hat,Centos和Ubuntu。

Ubuntu默认页面

Ubuntu默认页面

Apache在Linux世界中的重要作用的一个例子是它的服务器进程名称是HTTPd,这使Apache成为Web服务器软件的同义词。

除了成为Web服务器市场上的第一个重要参与者之外,Apache的迅速发展还得益于其配置系统和.httaccess文件。

.htaccess

Apache使用.htaccess进行配置。关于如何配置,编辑和使用此文件的教程很多,因为它为配置Apache处理传入请求的方式提供了很大的灵活性。一些示例包括:不同的重定向规则,最大上传文件大小,URL重写,内存限制,目录保护(htpasswd),到期标头,缓存控制标头,编码标头,cookie,查询字符串操作。

Apache的主要“优点”之一是,在服务器根目录(主网站目录)中,目录树中的每个级别或目录都可以有自己的.httaccess文件,并及对应的配置。

对于共享主机来说无疑是最大的优势,因为他们可以在同一台计算机上为数百个用户提供不同的服务器规则配置,而不会影响其他网站。客户可以在受限的共享托管环境中配置许多详细信息,而独立于全局服务器配置。所以,我们大多时候可以看到虚拟主机服务器均可以配置.httaccess文件,如果服务器提供商提供权限。

如官方文档所述:

“通常,仅当您无权访问主服务器配置文件时,才应使用.htaccess文件。”

但是,这种灵活性是以牺牲性能为代价的:“ 无论您实际上是否使用它们,允许.htaccess文件都会导致性能下降!”

每次启用.htaccess文件时,Apache都必须查询所有更高级别的目录树,从请求的URL或文件查询直到服务器的根目录,然后为每个请求加载它们。然后,它需要处理这些文件并针对以这种方式配置的每个目录重新配置。

使用WordPress网站,事情可能会变得非常复杂。一个典型的WordPress网站可以有来自不同目录的数百个请求。

从/wp-content/uploads/yyyy/mm类型的目录中,通常在单个页面加载中会有多个请求,通常形成不同的月份目录。然后将有/wp-content/themes/parent-theme静态资源,/wp-content/themes/child-theme资源:这些资源将包括javascript,css文件,图像。

然后还将有/wp-content/plugins,这些文件通常从数十个插件子目录中加载静态文件。对于这些资源中的每一个,Apache必须查询其整个树以查找配置。

一项分析表明,典型的WordPress设置(对于共享主机上的网站相当普遍)将包括42个单独的.htaccess执行和249个单独的.htaccess执行查询。

这只是在Web服务器级别。访问者仍然需要等待PHP流程执行整个WordPress调用堆栈以创建数据库查询,并将其提供给MySQL以组装网页并将其发送给访问者。

Modules

使Apache流行的另一个原因是它的动态模块系统

Nginx和Apache中都存在模块(作为允许用户扩展Web服务器功能的功能)。一旦Web服务器已经安装和部署,Apache便允许用户安装模块,然后根据需要启用/禁用它们。基于Debian的发行版的命令允许启用和禁用这些模块,而无需编辑任何配置文件:a2enmod和a2dismod。

作为Apache标准发行版的一部分的模块列表,其中包括压缩,加密,日志记录,重定向到更高级的内容,例如使用高级语法编辑请求和响应。

Nginx

Nginx(也称为nginx或NGINX)于2004年出现,由俄罗斯开发人员Igor Sysoev首次公开发行。

正如Nginx的项目经理Owen Garrett所说

“ Nginx是专门为解决Apache Web服务器的性能限制而编写的。”

该服务器于2002年首次创建,作为rambler.ru网站的扩展工具。它有两个版本:具有BSD类型许可证的开源版本和提供企业支持和附加功能的Nginx Plus

Nginx发布后,主要用于提供静态文件,并在Apache安装之前用作负载均衡器或反向代理。随着网络的发展以及对速度极致追求,硬件使用效率需求,越来越多的网站开始使用Nginx完全替换Apache。当然这也要归功于Nginx开始变得更加成熟和稳定。

NGINX Inc被F5 Networks收购

NGINX Inc被F5 Networks收购

2019年3月,Nginx Inc被F5 Networks以6.7亿美元收购。当时,正如Techcrunch报道的那样,Nginx服务器正在为“3.75亿个网站包括约1,500个付费客户”提供服务。

根据w3techs的数据,Nginx的市场份额一直在稳定增长,从数据表上看,感觉NG从一开始就在蚕食Apache的市场份额:

Web服务器市场占有率

Web服务器市场占有率

这些数据涉及全球范围内的Web服务器,但是如果我们从前一百万个网站中抽取样本,则发现Nginx已经超越Apache:

使用Nginx的网站百分比

使用Nginx的网站百分比

Google搜索趋势似乎也反映了这一事实:

Google搜索趋势:Nginx与Apache

Google搜索趋势:Nginx与Apache

Netcraft的调查表明,Apache已于2019年4月被Nginx超越。

Nginx配置

Nginx没有像Apache这样的配置系统,这也是为什么尽管它效率更高,速度更快,但并未广泛地用于虚拟主机提供商。它在共享环境中不像Apache那样发光。

服务器架构图

服务器架构图

另一方面,不允许目录级别的配置,Nginx相对于Apache获得了显着优势。Nginx Wiki上有一篇文章关于NG和Apache的性能比较:

Nginx vs Apache性能对比

Nginx vs Apache性能对比

Nginx模块

Nginx模块系统定位为更高级选择。Nginx模块通常需要在构建时启用,这意味着需要更多的技术,并且在安装后添加模块会更加复杂。

在2016年的1.9.11版中,情况有所变化,官方或者经过验证的动态模块存储库保留给付费用户。从2019年5月开始,他们宣布开始开发对QUIC和HTTP/3的支持

缓存问题:Nginx与Apache

缓存可以看作是在网站访问者访问之前为他们准备内容,这样当他们“敲门”时,您无需去寻找他们想要的内容。因为已经准备好了,无需等待就将其交给他们。

像Apache一样,Nginx的典型设置曾经是放置在服务器和最终用户之间,以减轻对基础架构其余部分的性能影响。在这种情况下,它可以缓存静态内容,而无需每次都从受保护的原始服务器获取静态内容。

如果我们将Nginx用作独立的Web服务器,则没有这种需求。Nginx可以非常有效地自行提供静态内容。

然后是动态缓存或页面缓存的问题。以WordPress网站为例,这意味着将为每个URL生成的所有WordPress页面存储在内存或磁盘中。

在标准的Nginx安装中,FastCGI缓存即本地可用。它简单,功能强大,但不是常用的Nginx功能之一。

要将其与Apache等效项进行比较,您应该知道Apache拥有mod_cache模块,据报道该模块容易产生与其他模块冲突的小故障。因此,与Apache一起部署的标准缓存解决方案是Varnish HTTP加速器。尽管Varnish是专用的行业解决方案,但最近的一些测试表明Nginx缓存对比Varnish也体现出明显优势

参考阅读:

处理请求:Nginx与Apache

Apache和Nginx之间最大的区别在于它们处理请求的基础架构。

Apache处理请求方式

Apache使用MPM或Multi-Processing-Modules处理请求,这是“负责绑定到计算机上的网络端口,接受请求并分派子进程来处理请求”。

最早的MPM可以追溯到Apache的最开始,它是prefork module。仅此模块就可以归因于Apache的性能不良声誉。在这种模式下,Apache会在每个请求中产生一个线程的新进程。

该模块与mod_php一起使用,意味着Apache服务器在每个进程中都嵌入了一个PHP解释器,即使它必须提供CSS文件或图像也是如此。

这是低效的。Prefork模块是Apache附带的默认模块。它还将连接限制为HTTP/1。

在后来的几年中,Apache开发了多线程工作程序mpm,之后又开发了事件mpm。它们都减轻了许多Apache的性能问题。切换到php-fpm使得Apache仍然可以成为当今的竞争解决方案,同时消除了对.htaccess的使用,但是这种做法违背了它的目的。

Nginx处理请求方式

Nginx使用异步,非阻塞事件驱动的体系结构。

解释差异:在Linux/Unix世界中,进程即运行程序(processes are running programs)。

线程是进程的子集,一个进程执行中可以有多个线程。可以将其视为浏览器窗口中的多个选项卡。这样,程序可以利用多个CPU和多核,多线程CPU来更快地执行。您可以阅读Linus Torvalds,详细说明它们之间的区别

简而言之,Apache对每个连接使用进程(对于worker mpm,它使用线程)。随着流量的增加,这显然太奢侈了。

我们可以描述新的过程或线程创建,例如启动计算机或启动程序。即使在最快的计算机上,在单个页面上加载数百个请求,它仍然需要一些时间。

事件mpm在优化方面走得更远,但是一些测试表明它不能超过Nginx。尤其是当我们谈论静态文件时,Nginx的服务量是Apache的两倍。

Nginx理想情况下,每个CPU/内核只有一个工作进程。Nginx工作进程的区别在于,每个工作进程的每个进程器处理成千上万的传入网络连接,而无需为每个连接创建新的线程或进程。

这就是为什么主流的CDN服务器商(例如CloudflareMaxCDNNetflix这样的网站)均采用Nginx,因为它对内容分发工作的处理效率更高。参考阅读:针对使用Cloudflare CDN国内网站的速度优化方案

使用Nginx作为Web服务器的公司实在太多太多,无法一一列举。

即时WordPress.com旗下的Automattic在2008年将所有负载均衡器都转换为Nginx(相关阅读),并将其服务器堆栈完全迁移到Nginx

如何查看网站所使用的Web服务器

如果我们要检查网站使用了什么Web服务器,通常可以在HTTP响应标头中找到它。右键单击一个网站>开发者工具Inspect,在开发人员工具中,我们将选择Network网络面板,然后重新加载该网站。我们将看到网站正在加载的所有资源。如果选择任何特定资源及其“Header选项卡,通常将看到服务器信息。如果网站使用CDN,则在服务器行中我们可能会看到类似Cloudflare的内容,如果网站使用HTTP加速器,我们可能会看到类似Varnish的内容。

这是一个WordPress网站的示例,该网站使用典型的共享主机设置以及cPanel,Apache和PHP:

Apache服务器网站HTTP标头

Apache服务器网站HTTP标头

这是使用Nginx作为Web服务器的网站:

Nginx服务器网站HTTP标头

Nginx服务器网站HTTP标头

在左侧,如果我们对其进行扩展,还可以分析每个资源的时间,并查看其对整个页面加载时间的影响。

小结

在本文中,重点介绍了Nginx与Apache,并解释了主要的体系结构差异,在很多方面Nginx表现出其独特的优势,尤其在WordPress方面,Nginx在很大程度上实现极致的服务器优化支持。

当然,并非每个用例都具有相同的优先级,Apache或其他工具(例如LighttpdIISLiteSpeedCaddy)可能是不错的解决方案。

也就是说,没有最好的Web服务器,只有最合适的Web服务器。本文只是,在有限的方面,指出Nginx的优势特征,以帮助站长选择更合适自己的Web服务器。

标签

评论交流

闪电博沟通群

扫码加入QQ交流群 695891297