编程

NGINX vs Apache – 2023 年如何选择服务器

1850 2023-09-04 22:21:00

Web 服务器是提供网页内容的计算机软件。它还创建了计算服务器和用户网页浏览器之间的连接,在它们之间来回传递文件。

建站或启动 VPS 项目时,选择正确的网络服务器至关重要,因为这会严重影响网站的性能和安全性。

如果你不确定该使用什么网络服务器,可以考虑 Apache 和 NGINX ——它们都是最受欢迎的网络服务器,负责为互联网上超过一半的流量提供服务。

为了帮你做决定,我们将对 NGINX 和 Apache 做详细对比。

NGINX vs Apache – 概述

在比较 Apache 和 NGINX 前,我们先一起探讨网络服务器之间的不同及它们的总体特征。

Apache

Apache HTTP 服务器 – 通常被称为 Apache 或 Apache HTTPD –  是免费、开源的网络服务器软件。它通过处理客户端请求,并提供网页内容。 

Apache web 服务器于1995年发布且由 Apache 软件基金会维护。它也是早期万维网上占主导地位的网络服务器。 

Apache HTTP 服务器当前驱动了世界上 33.9% 的网页,且并作为最古老的网络服务器之一占据市场份额第一的位置。

Apache web 服务器支持许多操作系统(OS),如 Microsoft Windows、OpenVMS,以及任何类似 Unix 的操作系统,如 Linux 和 macOS。

此外,Apache web 服务器也是 LAMP 栈的一部分,LAMP 栈是第一批用于 web 开发的开源软件堆栈之一。因此,web 服务器还可以很好地与许多内容管理系统(CMS)、编程语言和 web 框架配合使用。

Apache 由于其模块系统的强大功能和灵活性而特别受欢迎。使用 Apache 的模块,用户可以轻松地添加或删除功能,修改服务器以满足他们的需求。

NGINX

NGINX – 读作 “Engine X” –  是可扩展性和速度方面最可靠的服务器之一。它也是该行业增长最快的网络服务器之一,市场份额排名第二。

与 Apache 非常相似,NGINX 是开源的并且可以免费使用。

NGINX 的创建者 Igor Sysoev 于 2002 年开始开发该软件,以解决 C10K 问题。当时,许多 web 服务器无法同时处理超过 10000 个连接。

NGINX web 服务器发布时采用了异步和事件驱动的架构,允许同时处理许多请求。

NGINX 特别受欢迎,因为它能够增长和增加流量,并且易于在最小的硬件上进行扩展。此外,它在快速提供静态文件方面非常出色。

除了用作网络服务器外,NGINX 还可以用作负载均衡器,以提高服务器的资源效率和可用性。此外,它还可以作为反向代理,确保服务器和客户端之间的流量顺畅。

NGINX 几乎支持所有类 Unix 操作系统。然而,在 Windows 上安装 NGINX 可能会导致一些性能限制,如缺乏可扩展性和 UDP 身份验证问题。

现在我们已经介绍了 Apache 和 NGINX 的基本知识,现在是时候使用对 web 服务器很重要的几个关键方面对它们进行比较了。

基础架构 – 处理连接

Web 服务器架构是决定 Web 服务器如何处理 Web 请求、连接和流量的逻辑布局或机制。这是在选择网络服务器时需要考虑的基本标准之一。

让我们比较一下 NGINX 和 Apache 的基本架构以及这两种软件如何处理连接。

Apache

Apache 默认遵循过程驱动架构,这意味着它创建了一个单独的线程来处理每个连接请求。

过程驱动架构的缺点是,Apache 在处理大量请求时需要创建许多进程。它可能会导致大量资源消耗,导致服务器问题,如网页加载缓慢和网站停机。

幸运的是,Apache 提供了各种多处理模块(MPM),这些模块决定了这个开源 web 服务器如何接受和处理 HTTP 请求,用户可以自由选择最适合他们需求的 MPM。

主要有三个 MPM:

  • mpm_prefork – prefork mpm 不是线程化的,这意味着每个子进程一次只能处理一个请求。然而,在请求超过进程数后,其性能立即下降,这使得该MPM难以有效扩展。
  • mpm_worker – worker mpm 的每个进程都可以创建多个线程,每个线程还可以处理一个连接。这使得系统能够同时为多个请求提供服务。此外,由于线程比进程需要更少的资源,因此该 MPM 可以比预处理 MPM 更好地扩展并消耗更少的资源。
  • mpm_event – 事件 mpm 类似于 woker mpm,但它也经过优化以处理 keep-alive 连接。它的工作原理是留出专用线程来管理 keep-alive 连接,并将活动请求分配给其他线程。此过程有助于防止事件 MPM 因所有 keep-alive 请求而变慢。因此,与此 MPM 一起使用时,Apache web 服务器的资源需求最低。

请记住,您在任何时候都只能将一个 MPM 加载到服务器中。如果您的项目需要稳定性和兼容性,请使用预处理 MPM。然而,对于需要更多可扩展性和多样性的网站,可以考虑使用 worker 或事件 MPM。

NGINX

虽然许多 web 服务器使用简单的线程或进程驱动架构,但 NGINX 采用了不同的方法,利用异步、非阻塞的事件驱动架构。这使 web 服务器能够在单个进程中处理多个连接。

NGINX 有一个主进程,它执行特权操作,如绑定到端口、读取和评估配置文件以及创建多个子进程。

NGINX 有三种子进程:

  • 缓存加载进程(cache loader process) – 可以将基于磁盘的缓存加载到内存区域中。这个进程的资源需求很低,因为它只在 NGINX 启动后运行一次。
  • 缓存管理进程(Cache manager process) – 旨在通过定期检查缓存并删除最近访问次数最少的数据,将缓存的数据量保持在配置的大小内。
  • 工作进程(Worker process) – 可以同时处理数十万个 HTTP 连接,这意味着无需为每个连接创建新的进程或线程。相反,每个工作进程都独立运行,并包含称为工作连接的较小单元,每个单元都负责处理请求线程。工作进程还可以与上游服务器通信,以及向磁盘读取和写入内容。

NGINX 的事件驱动架构可以有效地在工作进程之间分发客户端请求,使该 web 服务器在可伸缩性方面的性能优于 Apache。

由于 NGINX 可以毫无困难地处理数千个请求,即使在低功耗系统上也是如此,因此该网络服务器适用于流量水平高的网站,如搜索引擎、电子商务网站和云存储服务。此外,许多流行的内容交付网络(CDN),如 MaxCDN 和 Cloudflare,也使用 NGINX 进行内容交付。

性能对比 – 静态 vs 动态内容

web 服务器的性能通常由其处理静态和动态内容的能力决定。

静态内容是每次交付给最终用户时保持不变的任何 web 文件,通常存储在 CDN 服务器中。因此,它很少改变,也不依赖于用户行为,这使它成为通过互联网传输的最简单的内容类型之一。静态文件的一些示例包括 JavaScript 库、HTML 和 CSS 文件以及图像。

而,动态内容是根据用户的兴趣、特征和偏好而更改的网页或文件。这种类型的内容对每个人来说都不一样,因为它是在用户请求页面时生成的。有这类内容的网站的一些例子是在线商店和社交媒体平台。

由于 NGINX 和 Apache 有不同的方式来处理静态和动态内容的请求,让我们看看在 Apache 与 NGINX 的比较中,哪个 web 服务器表现更好。

Apache

Apache 通过使用其传统的基于文件的方法来提供静态内容——此操作的性能主要取决于前面提到的 MPM。

Apache 还可以在 web 服务器本身中执行动态内容,而无需依赖外部组件。相反,它通过将合适语言的处理器集成到每个工作实例中来处理动态内容,用户可以通过 Apache 的动态可加载模块激活该处理器。

NGINX

在提供静态内容方面,NGINX 的性能比 Apache 快,因为它缓存静态文件,以便在请求时随时可用。

然而,NGINX 并没有内置处理动态内容的功能。NGINX 必须将请求传递给外部处理器,如 FastCGI Process Manager(PHP-FPM),以便执行以处理和处理动态内容。一旦此 web 服务器接收到内容,它就会将结果传输到客户端。

NGINX 和 Apache 的目录级配置

如果你想让另一个用户控制你网站的某些组件,那么选择一个允许在其内容目录中进行目录级配置的 web 服务器是至关重要的。

在 NGINX 与 Apache 的比较中,我们将看到哪个 web 服务器允许目录级配置。

Apache

Apache 支持通过 .htaccess 文件对每个目录进行额外配置。

.htaccess 文件允许非特权用户控制网站的特定方面,而不允许他们编辑主配置文件。

这就是为什么许多共享主机提供商使用 Apache 为其客户端提供对特定目录的访问权限,同时仍然保留对主配置文件的控制权。

Apache 还会在每次沿着请求路径找到 .htaccess 文件时解析这些文件,这意味着它们可以在不重新加载 web 服务器的情况下立即实现。

但是,使用 .htaccess 文件也有一些缺点。其中之一是,它可能会影响网站的性能,因为 Apache 会为每个文档请求加载每个 .htaccess 文件。这可能是一个资源杀手,尤其是对于流量很大的网站。

在使用. htaccess 文件之前需要考虑的另一件事是,允许其他用户修改服务器配置可能会导致安全失误。

因此,如果您不需要允许其他方访问您的服务器配置,请确保禁用 .htaccess 文件。

NGINX

与 Apache 不同,NGINX 不支持目录级配置。尽管这似乎是一个缺点,但它确实对用户有利,因为这有助于提高网站性能。

由于 NGINX 被设计为高效的,它不需要搜索 .htaccess 文件并对其进行解析,这使得它能够比 Apache 更快地提供请求。

NGINX 通过不允许额外配置来保护服务器的安全,因为只有拥有 root 权限的人才能更改服务器和网站的设置。

Apache 中的模块与 NGINX 中的模块

大多数 web 服务器都附带一个开箱即用的标准配置文件。然而,有时 web 开发人员可能希望包含模块,以使编程更方便或扩展 web 服务器功能。

尽管 NGINX 和 Apache 都可以通过模块系统进行扩展,但它们的工作方式有很大不同。

Apache

Apache 是一个可定制的 web 服务器,它提供了 50 多个官方动态加载模块,可以在用户需要时使用这些模块。此外,在互联网上很容易找到其他第三方模块。

虽然 Apache 服务器的核心功能始终可用,但可以加载和卸载模块来修改该 web 服务器的一些主要功能。

Apache 的动态模块可以完成各种任务,例如处理动态内容、设置环境变量和重写 URL。

以下是 Apache 最常用的一些模块:

  • mod_headers – 让你可以控制和自定义 HTTP 请求和响应在 Apache 中的 headers。
  • mod_expires – 允许用户定义网站上不同类型内容的过期时间间隔。
  • mod_authz_host – 启用基于请求的主机名、IP 地址或特征的访问控制和授权。
  • mod_mime – 帮助分配具有文件扩展名的内容元信息。
  • mod_alias – 允许用户通知客户端请求的 URL 不正确。

请记住,Apache 自带预构建模块,并将它们加载到服务器内存中。因此,请确保禁用不需要的功能以减少资源消耗。

NGINX

NGINX 提供了 100 多个第三方模块,可集成在核心软件中。对 C 语言有良好理解的用户也可以创建适合其项目需求的 NGINX 模块。

然而,NGINX 模块是不可动态加载的,因为它们需要在核心软件本身中编译。为了使模块动态加载,用户需要选择 NGINX Plus。

这使得 NGINX 不如 Apache 灵活,它带来了更好的安全性,因为集成许多动态模块可能会带来一些安全风险。

Apache 和 NGINX 的安全性

选择一个安全可靠的网络服务器至关重要,该服务器可以确保网站数据的安全,并定期更新所有最新补丁。

Apache

Apache 软件基金会正在积极努力消除有关其软件的任何安全问题,以确保 Apache HTTP 服务器的安全。用户可以订阅 Apache Server Announcements 邮件列表,随时了解软件开发团队的最新更新。

Apache 还包括一些有助于处理拒绝服务(DoS)攻击的配置设置,例如:

  • TimeOut – 定义 Apache 在请求失败之前等待特定事件的秒数。受到 DoS 攻击的网站应将此数字设置为几秒钟以内。
  • RequestReadTimeout – 关闭来自发送请求速度不够快的客户端的连接。
  • KeepAliveTimeout– 决定 Apache 服务器等待并保持连接打开以等待新请求的时间。

请记住,尽管 Apache 是为了安全和稳定而构建的,但您的服务器安全性也取决于您如何配置此服务器。因此,请考虑采取一些额外的安全措施,例如安装 web 应用程序防火墙(WAF)。

NGINX

NGINX 还提供了一些开箱即用的安全控制。其中之一是速率限制,它将传入请求速率降低到真实客户端的典型值,并有助于保护您的服务器免受 DDoS 攻击。

NGINX 速率限制还用于保护上游应用程序服务器不受一次过多用户请求的影响。

此外,NGINX 用户还可以通过允许或拒绝基于客户端 IP 地址的访问来防止 DDoS 攻击。这种访问也可能受到密码、子请求结果或带宽的限制。

此外,NGINX 支持最新版本的传输层安全(TLS),为通过互联网发送的数据提供可靠的加密。

要获得更多安全功能,请考虑使用 NGINX Plus。使用此高级版本,您将可以访问单点登录(SSO)功能,从而使用一组凭据安全地对多个网站和应用程序进行身份验证。

除此之外,NGINX 用户可以访问该开源服务器的网站,查找更多关于最新更新的安全建议和新闻。

平台支持

那些新进入 web 开发世界的人应该确保他们选择的 web 服务器将提供帮助和支持。这允许在遇到有关软件的问题时提供帮助。

Apache

Apache 提供了大量的文档,涵盖了有关该软件的各种主题。

它还通过电子邮件提供社区支持,允许用户从熟悉 Apache HTTPD 的人那里获得帮助。

用户还可以在 Freenode IRC 网络上的 Stack Overflow 和 #httpd 频道上快速提问。

NGINX

为了帮助用户解决任何开发问题,NGINX 提供了一个由社区运营和管理的邮件列表。除此之外,它还提供了一个公共支持论坛来帮助用户。

由于有许多 NGINX 用户,很容易找到其他社区论坛,开发人员可以在那里分享如何解决技术问题。

NGINX 还提供了许多学习资源,帮助初学者更多地了解该软件,如博客、词汇表、文档、电子书、网络研讨会和数据表

除此之外,使用 NGINX Plus 的用户还可以获得团队的专门支持,随时准备协助安装和部署

Web 服务器选择

通过 NGINX 与 Apache 之间的比较,可以清楚地看出,每种软件都有优点和缺点。因此,在决定是 NGINX 还是 Apache 之前,了解自己的需求是至关重要的。

Apache 适用于共享托管环境。它提供了修改主配置文件的 root 访问权限,允许非特权用户控制服务器的几个方面。

缺点是该软件可能会消耗大量服务器内存。

至于 NGINX,它在处理静态内容请求时比 Apache 有更好的性能。在高负载期间,它还可以同时为许多客户端提供服务,这使它成为流量大的网站的绝佳选择。

此外,NGINX 是多功能的——用户可以将其用作反向代理、负载均衡器和缓存解决方案。

但是,该软件默认情况下不能提供动态内容,并且需要将所有动态内容请求代理到后端应用程序服务器。

请记住,还有许多其他流行的 web 服务器可供选择,它们可能比 Apache 和 NGINX 专门为您提供的服务器更多。其中一些是 Tornado、Node.js 和 Tomcat。

Apache 和 NGINX 可以同时一起运行吗?

可以同时运行 NGINX 和 Apache,并利用每台服务器的优势——NGINX 处理速度快,Apache模块强大。

使用这两种软件的常见做法是将 NGINX 作为反向代理放在 Apache 前面,因为它可以同时处理数百个连接。

作为 Apache 的前端代理,NGINX 将处理来自客户端的所有请求。例如,如果 NGINX 收到对静态内容的请求,它将直接向客户端提供文件。

作为动态内容的反向代理服务器,NGINX 会将请求转发给 Apache,然后 Apache 会对其进行处理,并通过 NGINX 将最终内容传输到客户端。

使用 Apache 和 NGINX 可以减少 Apache 线程或进程被占用时通常发生的一些阻塞,有助于提高服务器性能。

结论

在Apache和NGINX之间做出决定可能很有挑战性,因为它们都以自己的方式强大。例如,Apache提供了广泛的模块,而NGINX提供了可扩展性和速度。

NGINX 和 Apache web 服务器之间的主要区别在于,NGINX 具有事件驱动的架构,可以在单个线程内处理多个请求,而 Apache 则是进程驱动的,为每个请求创建一个线程。因此,允许 NGINX 具有通常更好的性能。

每种软件都有其优缺点,因此决定是使用 NGINX 还是 Apache 将完全取决于用户的偏好。

让我们回顾一下我们比较过的各个方面:

  • 基础架构 – Apache 创建一个线程来处理每个连接请求,而一个 NGINX 进程可以同时处理多个连接。
  • 性能 – NGINX 在提供静态内容方面比 Apache 执行得更快,但它需要另一个软件的帮助来处理动态内容请求。另一方面,Apache 可以在内部处理动态内容。
  • 目录级配置 – Apache 附带了.htaccess文件,允许用户在不编辑主服务器设置的情况下更改站点的配置。同时,NGINX 不支持目录级配置。
  • 模块 – Apache 的模块可以动态加载,而 NGINX 模块需要在核心软件中编译。
  • 安全性 –  Apache 和 NGINX 都安全可靠。二者页都有多个安全工具对抗 DDoS 攻击。
  • 支持 – Apache 和 NGINX 提供社区支持和文档,帮助初学者解决任何问题。

与其选择 NGINX 或 Apache,不如更有效地利用这两种软件来提高服务器性能——NGINX 作为处理静态内容请求的反向代理服务器,Apache 作为提供动态内容的后端。

我们希望本文能帮助您了解 NGINX 和 Apache 是什么,两者之间的区别,以及何时应该考虑使用它们。

如果您对 NGINX 和 Apache 还有任何疑问或者看法,欢迎在下面给我们留言。