返回博客

Web 服务器的世界:Apache 对比 Nginx

Web 服务器的世界:Apache 对比 Nginx

Apache 和 Nginx 简介

Web 服务器和协议旨在让用户能够查看网页。它们发送查看文档的请求,该请求被服务器接受。然后,主机实质上向查看者提供该文档或信息。Web 服务器在让您在浏览器上查看和访问网页方面起着核心作用。

web server

促进客户端与应用服务器之间通信的 Web 服务器

您可以使用许多 Web 服务器来达到此目的。其中最受欢迎的是 Nginx Apache。事实上,这些服务器托管了目前互联网上可用的大多数网站。

Apache 和 Nginx 在许多方面都非常相似。首先,这两款 Web 服务器都是开源的。这意味着世界上任何人都可以完全免费地使用它们。但每款服务器都有许多独特的特性。这些特殊特性使它们最适合各种应用和目的。

为了帮助您 决定哪款 Web 服务器对您而言更优越或更理想,我们将对比 Nginx 和 Apache。我们将针对对 Web 服务器用户至关重要的许多基本参数进行对比。让我们开始吧!

基本概述

我们将首先对这两款 Web 服务器进行总体概述。Apache 和 Nginx 在社区中都建立了极佳的声誉。它们因其性能而备受赞誉,并被全球数家知名机构所使用。

Apache

Apache 诞生于 1995 年。Robert McCool 在 Apache 软件基金会 旗下开发了这款 HTTP 服务器,因此得名。自发布以来,全球已有成千上万的人在使用 Apache。

它的极高普及率意味着许多第三方软件和源经常与它协作。因此,如果您正在寻找一个拥有大量集成的良好支持网络,Apache 就是您的不二之选。Apache 也是许多人的首选,因为它更具动态性和灵活性。它还提供了更广泛的可以解释的语言。

Nginx

Nginx 是一款相对较新的 Web 服务器,于 2004 年推出。它是 Igor Syosev 为解决现在被称为 C10K 问题而努力的结果。当服务器开始难以处理大量流量时,就出现了这个问题。随着越来越多的人开始使用互联网,网站服务器开始不堪重负。这些服务器无法同时处理数千个连接,导致网站崩溃和失效。

Nginx 的发布就是为了试图解决这个问题。这就是为什么它的架构具有极其轻量级的设计,能够在有限的资源 and 硬件下工作。虽然它最适合处理静态内容,但它也可以与能够适当处理动态内容的软件进行集成。

流量处理能力

现在我们对每款服务器都有了基本的了解,我们可以深入探讨更多细节。我们将开始的第一个特性是单个服务器的流量和处理能力。这是区分这两个平台的主要点之一。在并发处理多个连接时,它们的架构基于不同的原理工作。

Apache

Apache 使用一种称为 MPM - 多路处理模块 的技术。管理员使用各种 MPM 来操纵和修改连接处理架构。Apache Web 服务器的吸引力之一在于其架构提供的灵活性。这种将处理划分为单个和线程组的基于模块的基础架构,使其更容易扩展并适应不同类型的连接。

让我们来了解一下 Apache 中使用的一些独立模块:

  • mpm_prefork

第一个是 mpm_prefork。这是一个负责处理来自访客的传入请求的处理模块。它在任何给定时间创建一个线程或子进程来处理一个连接。这意味着如果请求数少于进程数,mpm_prefork 的运行效率是非常高的。

由于每个请求都由一个独立的子进程单独处理,因此请求的处理速度很快。但这也意味着如果请求数超过进程数,速度可能会显著变慢。结果,请求处理步骤会消耗大量的 RAM。

  • mpm_worker

正如我们所知,一个线程负责一个连接。该模块更进一步,使您能够同时管理多个线程。与在超过特定阈值后会显得吃力的 mpm_prefork 相比,这是一个更具扩展性的模块。新连接可以立即接入线程,而无需等待。

  • mpm_event

Mpm_event 负责维护 keep-alive 连接。该模块的主要目的是防止系统因 keep-alive 请求而陷入瘫痪。即使在没有活动请求的情况下,它也会通过将线程分配给连接来实现这一点。只要连接处于活动状态,该线程就会一直保持专用。任何传入的请求都会被传输到空闲线程。

Nginx

与 Apache 相反,Nginx 的构建有着非常明确的目的。我们已经知道在这个层面上连接和扩展性所产生的问题。这就是为什么它使用异步且非阻塞的算法。它不为每个连接分配单独的线程。相反,Nginx 产生大量的工作进程,这些进程能够同时处理数千个连接。

Nginx 架构背后的工作原理是快速循环机制。该算法不断处理事件并对其进行监控。这意味着这些进程是事件驱动的,并且每个工作进程仅致力于其自身的连接。工作进程的所有连接都位于一个事件循环中。在这里,它们与该特定工作进程下的其他连接共存并进行异步处理。

这种架构的主要好处是它允许极大的扩展空间。如果您资源有限或希望在最低硬件配置下工作,这一点尤其适用。即使您正面临巨大的流量,对 RAM 使用的影响也微乎其极。这是因为您没有为每个连接生成单独的线程。

处理静态和动态内容

我们可以用来比较这两个 Web 服务器的另一个参数是它们如何处理 静态动态内容.

Apache

Apache 使用基于文件的方法来处理静态内容。其 MPM 处理系统允许它使用这种传统方法。

在处理动态内容时,Apache 无需任何外部组件的协助即可完成。您可以通过加载模块来启用动态处理器。该模块将通过分析语言来处理内容,然后将相关的处理器嵌入到工作进程中。

无需使用外部组件来处理动态内容的主要好处在配置和协调过程中显而易见。仅协调内部组件之间的关系要容易得多。

Nginx

Apache 和 Nginx 处理内容方式的最大区别在于,Nginx 根本无法在内部处理动态内容。它必须与外部组件配合使用来处理动态内容的请求。这意味着您需要将 Nginx 服务器与外部处理器结合使用。该组件将接收针对 PHP/动态内容的请求,对其进行处理,然后将其发送回服务器。

由于信息必须在两个组件之间进行中继,您需要协调它们之间的通信。您必须确定要允许多少个连接并配置协议。您必须使用 Nginx 可以读取和理解的协议,例如 HTTP、FastCGI、SCGI、uWSGI 或 memcache 等。

另一方面,Nginx 在处理静态内容方面表现非常出色。它确实需要来自任何外部源的帮助来做到这一点。它也只在需要时才激活解释器。这是使用 Nginx 的好处之一。解释器没有嵌入到进程中。这意味着它只在处理动态内容时才会存在。

内容目录:分布式与集中式配置

每个 Web 服务器都有自己的内容目录。评判 Apache 和 Nginx 的最关键参数之一是它们是否允许目录级配置。

Apache

内容目录中存在某些包含指令的隐藏文件。这些就是 .htaccess 文件。使用 Apache,您可以按目录解析这些指令。因此,当您发送请求时,Apache 会检查文件的路径以查找 .htaccess 文件。当找到时,它会立即解析并应用其中的指令。Apache 不需要重新加载服务器来执行这些指令。

上述定义的过程允许对 Web 服务器中的目录进行去中心化配置。去中心化配置对于 URL 重写、实施访问限制、确认授权以及设置缓存策略非常有用。

.htaccess 文件的优点之一是,没有身份验证的用户可以控制和修改他们在浏览器中查看的内容的至少某些方面。这就是为什么 Apache 经常被共享主机提供商使用的原因。服务提供商拥有对中央配置的授权访问权限。客户端能够对某些目录进行控制,而无需访问主配置。

如果您愿意,您可以在 Apache 中关闭 .htaccess 解析。

Nginx

与 Apache 不同,Nginx 不使用任何 .htaccess 文件。这使得它相对不那么灵活。然而,Nginx 在其配置样式上带来了一些改进。首先,它处理请求的速度比 Apache 快得多。这是因为它不会在其路径中搜索、读取、解析并执行它找到的每个 .htaccess 文件。Nginx 不需要搜索每个父目录,而是针对一个请求仅进行一次目录查找。

此外,与 Apache 相比,Nginx 具有重大的安全优势。与 Apache 不同,Nginx 不会将内容目录配置的任何部分移交给个人用户。虽然您可能会维持严格的安全措施,但谁能保证个人用户也能做到同样的事情呢?使用 Nginx,您可以保持对整个目录网络的安全状态和配置的控制。

请求解析

区分这两个服务器的另一种方法是它们解析请求的方式。

Apache

当服务器收到请求时,它会对其进行解析,然后将其连接到相关的系统资源。它将请求解析为文件系统上的物理资源,或者解析为URI 位置。

当解析为物理资源时,它使用 <Directory> 或 <Files> 块。这是服务器的默认解析方法。它获取文档的根目录。然后,它根据请求中的主机和端口号在文档树中查找相关文件。

另一方面,URI 位置需要进行抽象评估。因此,Apache 对抽象资源使用 <Location> 块,而不是与文件系统配合工作。

除了 URI 之外,还有许多其他替代默认基于文件系统的方法。例如,您可以使用 Alias 指令来寻找要映射的替代位置。您还可以利用表达式变体来使文件系统配置更加灵活。

Nginx

Apache 天生就是为了充当 Web 服务器,而 Nginx 则兼具 Web 服务器和代理服务器的双重角色。这就是为什么 Nginx 更倾向于使用 URI,而不是向文件系统倾斜。您可以从这样一个事实中看出这种偏好:在 Nginx 中,您无法为文件系统目录指定配置。然而,如果需要,它也可以转换为文件系统。

Server 和 location 是 Nginx 中主要使用的配置块。前者解析被请求的主机。后者匹配主机和端口之后的 URI 部分。因此,服务器将请求解析为 URI 位置,而不是系统上的实际文件。

由于其基于 URI 的解析系统,Nginx 能够胜任 Web 服务器、代理服务器和邮件服务器的角色。由于它在解析请求时不引用文件系统,因此它也不实现 .htaccess 文件,这也是可以理解的。

模块系统

虽然 Apache 和 Nginx 都支持用于扩展的模块系统,但它们在内部工作原理上存在一些重大差异。

Apache

使用 Apache,您可以在运行服务器时动态加载和卸载模块。核心仍然处于进程的中心,而模块则用于扩展功能。您可以使用这些可附加的模块来完成许多任务。凭借 Apache 庞大的库,选择实际上是无穷无尽的。

事实上,您甚至可以通过使用像 mod_php 这样的模块来修改服务器核心的功能。正如我们之前提到的,该模块允许您将 PHP 解释器嵌入到单个工作进程中。当您需要处理动态内容时,这非常有用。

但故事并没有就此结束。您还可以添加模块来启用客户端身份验证、服务器加固、缓存、URL 重写、代理、速率限制、压缩以及加密等功能。

Nginx

Nginx 的模块系统有所不同,因为您无法将模块动态加载到主服务器上。相反,它们必须在核心软件上进行收集和编译。这在灵活性和易用性方面留下了许多遗憾。虽然分发包中包含一些常用模块,但对于其他模块,您必须自行构建服务器。因此,您需要了解如何在传统打包系统之外维护编译好的软件。

无论如何,这种非标准模块系统的优势在于它为您提供了高度的针对性。您可以仅通过合并所需的功能来定制您的模块。它让您可以舍弃不需要的组件,并在此过程中避免安全风险。同时,您可以使用 Nginx 模块完成与 Apache 相同的任务。这些包括 URL 重写、日志记录、身份验证等。

生态系统与支持

在 Web 服务器方面,集成和软件支持非常重要。接下来,我们将探讨 Apache 和 Nginx 的兼容性和可用支持。

Apache

Apache 是一个更古老、更受欢迎的平台。因此,与 Nginx 相比,它拥有更多支持性工具和软件,这是可以理解的。有大量的第三方文档可供您使用,以支持核心服务器。不仅如此,您还可以将其与其他软件配对以完成特定任务。您可以将这些工具添加到您的项目或您的包中。它们能够轻松地在 Apache 生态系统中进行引导。

Nginx

虽然 Nginx 在这方面落后于 Apache,但它无疑正在尽最大努力追赶。随着越来越多的人意识到 Nginx 的巨大潜力,他们开始选择使用它。随着其作为一种实用、快速处理的 Web 服务器的自然增长,对该平台的支持也在持续上升。

Nginx 必须克服的主要支持障碍之一是寻找英文文档。这是因为 Nginx 的大部分最初是用俄语编写的,包括其大部分文档。然而,随着该服务器的普及和名声大噪,现在这种通用语言中已经有了大量的第三方资源。

协作解决方案?

现在,您对 Apache 和 Nginx 的核心组件和内部工作原理有了更好的了解。虽然它们彼此大不相同,但一些用户利用这一事实来兼顾两者的优点。的确如此——您完全可以同时使用 Apache 和 Nginx。

按照传统,用户倾向于将 Nginx 用作反向代理,并将其置于 Apache 之前。这可以弥补 Apache 在请求接收和处理速度上的不足。Nginx 在其速度最快时接收并处理所有请求。它还使您能够快速并发处理大量请求,而无需投入大量资源。

用户利用的另一个 Nginx 特性是其高效处理静态内容的能力。为了弥补 Nginx 需要外部组件来处理动态内容这一事实,我们可以通过代理将 PHP 和其他相关请求转给 Apache。Apache 将把请求渲染成网页并发送回 Nginx,以便其为客户端提供服务。

您可以在我们的博客上找到一些可以帮助您开始使用这两个 Web 服务器的资源:

Apache
Nginx

结论

归根结底,Apache 和 Nginx 各有优缺点。对于您的项目应该使用哪种服务器,并没有硬性规定或建议。根据您的独特需求,您是判断什么最适合您的应用程序的最佳人选。

您需要找出自己无法妥协的方面和功能,并做出相应的选择。如果很难做出决定,您始终可以转向在定制解决方案中同时使用这两个服务器。

祝您使用愉快!

author

Akshay Nagpal

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的创意设计师,专注于通过传统和创新营销渠道打造一致的企业形象。他擅长将艺术愿景与战略营销相融合,创造具有影响力的品牌叙事。

评论

暂无评论。发表第一条评论吧。