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

该选择Apache还是Nginx

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

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

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

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

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

优缺点

优点

  • 开源解决方案,个人和组织均可免费使用。
  • 支持可增强其功能的第三方模块、插件和扩展。
  • 灵活可靠的服务器软件,具有强大的测试和开发记录。
  • 来自活跃用户群的社区支持。
  • 提供服务器配置的 root 访问权限;非特权用户可使用 .htaccess 文件编辑权限。
  • 非常适合共享主机环境。

缺点

  • 资源密集型软件,可能比其他软件消耗更多的 CPU 和内存。
  • 由于其资源密集型特性,可能不适合提供静态内容。
  • 功能繁多,配置复杂。
  • 不支持异步处理。

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 成为多并发请求的理想选择。
  • 是高流量服务器的理想选择。
  • 可用作反向代理服务器。
  • 占用内存少,CPU 和内存使用效率高。
  • 易于配置和使用,即使是初学者也能轻松上手。
  • 活跃的社区支持和文档

缺点

  • 对 Windows 操作系统的支持有限。
  • 不支持本地动态内容,所有动态内容都要先向后端服务器发送代理请求,然后才提供给客户端。
  • 严重依赖外部第三方模块的使用。

深入对比

架构

服务器软件的架构是指其内部机制和布局,这些机制和布局决定了服务器软件如何处理连接、网络请求和用户流量。将 Apache 和 NGINX 的架构想象成汽车引擎的内部结构,以及每个组件如何帮助它们提供最佳服务。

Apache

如前所述,Apache 默认使用进程驱动架构,由一个线程处理每个连接请求–线程是调度程序所能处理的最短指令流。

不过,Apache 也有一些潜在的缺点。严重的资源消耗和缺乏对异步处理的支持会降低服务器的运行速度,增加页面加载时间,有时甚至会导致网站中断。

Apache 使用多处理模块(MPM)巧妙地解决了这些问题,MPM 接受并响应服务器请求。作为用户,您可以从三个主要 MPM 中任选一个来优化服务器,但一次只能加载一个 MPM。

Apache 2.4 中的 MPM 包括

  • mpm_worker:Worker MPM 为每个进程创建多个线程,每个线程可以处理一个连接请求。由于 MPM 中的每个线程所需的资源比单个进程少,因此系统现在可以同时为多个线程提供服务,并能更好地扩展。
  • mpm_event:这种 MPM 与 Worker MPM 很相似,但也能处理保持连接。它在将运行中的请求分配给其他线程的同时,会留出线程来保持某些连接的存活。这样,保持连接请求就不会拖慢整个系统的运行速度。这使得事件 MPM 成为 Apache 服务器中最节省资源的选项。
  • mpm_prefork:这是一种无线程 MPM,每个子进程一次只能处理一个请求。一旦请求超过指定数量,服务器性能就会受到严重影响,使用这种 MPM 进行扩展就会出现问题。预分叉 MPM 是稳定性和兼容性的理想选择。

NGINX

NGINX 的架构是异步和事件驱动的,这意味着它可以在单个进程内同时处理多个连接。它通过运行一个控制器进程和多个子进程来实现这一功能。

这种架构使 NGINX 成为可扩展性的理想选择,因为即使在低功耗系统上,它也能有效地将客户端请求分配给各个进程。

控制器进程执行读取和解释配置文件、绑定端口以及组建子进程等高级操作。

子进程对 NGINX 的运行至关重要,它们可分为三类:

  • Worker 进程:处理数千个并发 HTTP 连接,无需新进程或线程。工作进程独立运行,创建处理单个请求线程的工作连接。它们还能读写内容到服务器磁盘,并与上游服务器通信。
  • 缓存加载器进程:这些进程将磁盘缓存加载到其他工作进程使用的共享内存中。它们只在 NGINX 启动后运行一次。
  • 缓存管理器进程:将缓存数据保持在配置的限制范围内,并定期检查以删除访问时间最长的数据。

如果你的网站(如电子商务商店或云存储服务)流量很大,NGINX 可能是你的最佳选择。

虽然 Apache 有支持多进程的多处理模块,但 NGINX 的异步事件驱动架构更胜一筹。NGINX 更适合高流量和可扩展性。不过,Apache 的架构意味着它可以处理需要更多兼容性的稳定项目。

性能

接下来是 NGINX 和 Apache 在内容交付(即动态和静态内容交付)方面的性能比较。动态内容会根据用户的行为、兴趣和选择而改变。而静态内容则是不做任何修改直接向网页提供。

Apache

Apache 使用基于文件的方法提供静态内容,这是任何 MPM 都能提供的功能。除此之外,它还是一款出色的动态内容交付服务器软件。它只依赖其内部组件,并在每个 Worker 实例中集成了一个独特的编程语言处理器。

您可以使用 Apache 的可加载模块激活每个模块中的语言处理器。这样,Apache 服务器就可以在服务器内运行动态内容,而无需外部软件支持。

NGINX

NGINX 采用异步架构,比 Apache 提供静态文件的速度更快。这使它成为静态网页内容的理想服务器软件。然而,在传输动态内容时,它就显得力不从心了。

由于 NGINX 没有处理动态内容的内置功能,它将使用外部进程来执行。它必须等待外部软件处理并返回解码后的内容,然后再将其发送回浏览器。这意味着对管理员配置的要求更高。

缓存问题: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

Apache 和 NGINX 在传输静态内容时都很出色,但 Apache 是传输动态内容的理想选择。NGINX 本身并不处理动态内容,可能需要一个外部处理器来处理它能适应的协议。

安全

在 Apache 和 NGINX 之间做出选择时,安全性是另一个重要的考虑因素。这两种服务器系统都很安全,但它们处理安全问题的方式不同。

Apache

多年来,Apache 一直是 HTTPD 服务器连接的安全软件。不过,您仍然可以对服务器进行配置,以提高安全性。

Apache 使用三种配置设置来挫败拒绝服务(DDoS)攻击:

  • TimeOut:定义服务器在请求失败前等待的时间(默认为 60 秒)。
  • KeepAliveTimeout:管理 Apache 服务器连接为新请求保持开放的时间。
  • RequestReadTimeout:切断与发送请求速度慢于预期的用户的连接。

NGINX

NGINX 开箱即提供速率限制功能,可管理传入请求的速率。如果速率值超过或低于典型的浏览器活动,NGINX 就会中断连接。其独特的架构还能保护上游服务器免受过多请求(分布式拒绝服务(DDoS)攻击的症状)的影响。

您还可以对 NGINX 进行配置,拒绝特定 IP 地址、带宽和子请求的访问。此外,NGINX 还支持传输层安全(TLS)和安全套接字层(SSL)协议。

Apache 和 NGINX 都能提供卓越的安全功能,满足您的需求。不过,您可能需要额外的安全措施来保护网站免受恶意攻击。

配置

在设置服务器软件时,您会注意到 Apache 和 NGINX 模块系统之间的重要区别。

Apache

Apache模块

Apache 有多个可动态加载的模块,您可以在需要时激活。这些 Apache 模块适用于多种任务,包括设置环境变量、重写 URL 和定义过期时间间隔。

您可以在 .htaccess 文件中设置更多的目录级配置。这些文件允许你在不影响其他区域的情况下配置服务器中的目录。

.htaccess 文件的好处是,服务器执行这些文件时不需要重新加载服务器,而且只要这些文件位于请求路径上,就会被解释。此外,非特权用户可以控制特定的网站元素,而无需控制完整的配置文件。

许多托管服务提供商使用 Apache,因为他们可以保持对主要配置的控制,甚至可以让客户控制目录。

NGINX

NGINX动态模块

与 Apache 不同,NGINX 不解释 .htaccess 文件,也不提供访问和配置每个目录文件的其他方法。

相反,所有设置都在主配置文件中提供。虽然这使得 NGINX 的灵活性降低,但却带来了速度上的优势。

NGINX 还配备了额外的第三方模块,可进一步增强其功能。中级和高级用户也可以构建自己的模块。与 Apache 不同,除非购买企业版,否则 NGINX 不支持动态模块。否则,必须使用免费的 NGINX 版本编译命令后才能执行。

Apache 更灵活;你可以使用 .htaccess 文件对其进行配置。这样就可以将目录与服务器的其他文件分开配置。NGINX 没有 Apache 灵活,但它比 Apache 更快、更高效。

支持

在选择主机时,技术支持是一个重要的考虑因素。在选择系统之前,必须了解你所选择的服务器软件是否能为性能优化提供可靠的支持。

Apache

Apache 网站

Apache 拥有涵盖其所有关键方面的信息和文档库。Apache 网站提供发布说明、手册、指南、教程和其他信息,可以帮助您更好地使用 Apache。

此外,您还可以访问 Stack Overflow 和 Freenode IRC 网络上的社区,其他用户可以帮助您解决常见问题。

NGINX

还有很多社区论坛涉及 NGINX 问题,开发人员在这些论坛上为新老用户提供建议和技巧。他们的网站上就有这样一个论坛,但在社交媒体和互联网上还有许多其他论坛。

NGINX论坛
NGINX 还在其网站上提供大量学习资源,包括文档、网络研讨会、数据表和博客文章。您还可以通过即时聊天获得 NGINX 团队的专门支持。客户支持团队可以帮助您进行安装设置或排除故障。

NGINX 和 Apache 提供多种支持选项,可帮助您解决有关服务器的任何问题。但与 Apache 不同的是,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服务器。

评论留言