网络服务器简介

介绍

一个网页服务器的主要作用是为网站提供网页。网页可以从单个HTML文件渲染,也可以是从多种资源组合而成的复杂集合。如果您想将您的网络应用程序托管在互联网上,在许多情况下,您将需要一个网页服务器。

网页服务器最常见的用例之一是提供在浏览器中渲染网站所需的文件。当您访问http://www.digitalocean.com时,您从输入一个URL开始,这个URL会通过互联网发起一个请求。这个请求会经过多个层次,其中之一或多个将是网页服务器。这个网页服务器对您的请求生成响应,在这个例子中,就是DigitalOcean网站,具体来说是主页。理想情况下,这个过程会迅速发生,并且全天候可用。

虽然任何访问DigitalOcean主页的访客都会将其体验为单个网页,但实际上,大多数现代网页如今都是许多资源的组合。网页服务器充当后端和前端之间的中介,提供资源如HTML和CSS文件到JSON数据,这些都是动态生成或在需要时静态提供的。如果您打算以任何方式从事网站或在线应用程序的工作,熟悉网页服务器的基本知识以及其工作原理是非常有用的。

术语“Web服务器”可以指代软件本身或其存在的硬件,但本文特指Web服务器软件。关于这一差异的更多详细信息,请查看我们的云服务器介绍

常见用例

Web服务器通过HTTP和HTTPS协议处理互联网上的请求,也称为HTTP服务器。Web服务器与其他类型的服务器不同,它专门处理这些HTTP和HTTPS请求,与应用程序服务器(例如Gunicorn)和其他协议的服务器(即WSGI)区分开来。这些其他服务器作为后端编程语言的中间件,通过外部库工作,这比Web服务器的抽象级别不同。

以下是Web服务器处理的常见任务:

  • 提供HTML、CSS和JavaScript文件。
  • 提供图片和视频。
  • 处理HTTP错误消息。
  • 处理用户请求,通常是并发处理。
  • 执导URL匹配和重写。
  • 处理并提供动态内容。
  • 压缩内容以优化数据使用和速度。
  • 启用浏览器缓存以存储您的静态内容。

在实践中,以下是一些涉及网络服务器的个人项目:

  • 您想制作一个网站。
  • 您想制作一个连接到互联网的应用程序。

这个列表远非全面,网络服务器在向最终用户服务的数据类型上并没有严格的限制。例如,服务于网络API请求的网页服务器通常以JSON等格式响应数据。

网络服务器的目标

网络服务器以满足速度、可用性、可靠性等方面的期望为受众服务。它们在互联网上提供内容的共同目的。为了被认为是一个可行的网络服务器解决方案,以下方面必须被考虑:

  • 正常运行时间:这指的是网络服务器在线和运行的时间。网站需要全天候在线以服务用户,因此高正常运行时间是目标。这也转化为稳定性和可预测性。当用户输入URL或点击链接到您的网站时,预期页面应该每次都能加载,并且在任何给定时间都能加载。唯一的例外应该是计划中的停机时间,用于更新或维护。一个出现故障或随机崩溃的网络服务器会不利地影响用户的使用体验。
  • 速度:您的网页应尽可能快地加载。用户希望他们的请求能够立即得到满足,否则您可能会失去他们。在加载缓慢的网页上,即使用户耐心等待了第一次加载,每次后续的长时间加载都会指数级地减少他们停留或再次访问的意愿。
  • 并发:这指的是同时处理多个请求。一次有太多人试图访问您的网站似乎是一件好事,但当加载时间变得极其缓慢,整个服务器崩溃时,这就成了一个真正的问题。您的物理或虚拟服务器只有有限的资源,如RAM和CPU计算能力,网络服务器必须高效地使用这些资源。
  • 可扩展性:可扩展性指的是通过垂直扩展使您现有的服务器更强大,或者通过水平扩展向您的设置中添加更多服务器。随着您扩大受众,您可能会达到一个需要超过一两个小型网页服务器的点。
  • 设置便捷性:快速启动和运行项目对于您项目的迭代至关重要。一个简单明了且可重复的安装过程对于您设置第一个网页服务器以及后续扩展时的多个服务器都非常重要。
  • 文档:网页服务器很复杂。最常见的设置会快速让您上手,但随着时间的推移,您的需求会增长。很多时候,您需要的功能并不是那么常用。当那个时候到来时,良好的文档对于为您的需求创建定制解决方案至关重要。
  • 开发者支持:如果核心开发者不致力于他们自己的项目,那么你不应该将你的项目投入到他们的项目中。这包括对他们软件的长期支持计划,以及他们以错误修复和补丁形式提供的短期支持。
  • 社区支持:核心开发团队将处理大部分繁重的工作,但一个活跃的社区有助于填补空白。对于开源项目,这可能意味着对实际代码库的贡献,但一个强大的社区也会回答你的问题并帮助你解决具体问题。

虽然网页服务器可以提供不同的解决方案,但它们提供的解决方案源于试图解决这些相同的问题。这些问题本身随着时间的推移以及终端用户的需求和期望而演变,使得这是一个活生生的、不断发展的列表。

选择网页服务器解决方案

目前最受欢迎的开源网页服务器是Apache和Nginx。

Apache是最早出现的,它是在一个常见的情况下构建的,即多个网站及其各自的配置文件都存在于单个网页服务器上。Nginx是在Apache之后出现的,当时的需求从从一个服务器服务多个网站转变为了在一个服务器上以极高的效率为单个网站提供服务。

尽管Web服务器具有相同的目标和问题,但每个解决方案的解释和实现方式都会有所不同。这些问题的确切答案塑造了任何给定Web服务器解决方案的身份。此处突出显示了Nginx和Apache,因为它们无处不在,但任何Web服务器解决方案都会有自己的特点。在选择Web服务器时,重要的是要考虑您特定项目的自身需求。这样,即使Web服务器产品景观发生变化,您的评估方法也会根据您自己的需求保持稳定。

以下是Web服务器尝试实现Web服务器目标的一些关键区别:

配置文件的结构

Web服务器将其设置存储在配置文件中。您可以通过编辑这些文件来自定义Web服务器。配置文件的存储和组织是一个具有主观性的结构性问题,这使得Web服务器产品产生了分歧。

主要分歧在于集中式和分散式之间。分散式配置文件允许在文件系统级别上进行细粒度的控制,这源于在一个服务器上托管多个网站的需求。集中式配置并不关注在一个服务器上托管多个网站,而是专注于高效地服务单个网站。这些配置依赖于URI模式匹配,即匹配URL与文件名和其他唯一标识符,而不是依赖于与Web服务器的目录结构匹配。

Apache的.htaccess文件将分散式配置作为一个特性来实现,并且每一个设计决策都是从这种对文件系统的关注和细粒度控制中衍生的。Nginx没有同样的文件系统关注点,而是专注于URI模式匹配和集中式配置。

处理并发

您运行Web服务器的物理和虚拟服务器具有有限的资源,如RAM和CPU处理能力。您的Web服务器如何根本性地管理其请求将对高效使用资源产生最大的影响。单个请求可以每个请求生成一个完整的进程,或者它可以基于事件驱动来处理。您的Web服务器有效处理多个同时请求的能力与基本设计决策密切相关。

Apache 通过生成进程来处理请求,这种方式在负载下消耗资源较快,可能会成为一个问题。Nginx 的事件驱动系统处理系统使用的资源较少,并且在负载下性能可能更好。

提供静态内容

除了网页之外,Web服务器还会收到其他资源(如图片、视频、CSS文件和JavaScript文件)的请求。由于这些项目无论谁请求都是相同的,因此这类内容被称为静态内容。通常情况下,网页本身只是一个HTML文件,没有根据请求者进行定制,也被视为静态内容。Web服务器还可以压缩这些静态内容,以实现更好的加载时间。

Nginx 在提供静态内容方面表现出色,这得益于它的事件驱动请求处理。Apache 也可以提供静态内容,但在大多数设置中,其速度和效率在负载下不如Nginx。

提供动态内容

y
当内容根据请求者不同而进行更改、处理和定制时,这种内容被称为动态内容。例如,当您登录一个网站后,网站通常会动态地在顶部导航栏中填充您的用户名。动态内容增加了额外的复杂性,因为它要求Web服务器在接收到请求时独特地处理许多请求。按请求定制的内容不能服务于所有人,也不能被普遍缓存。

在内部处理动态内容移除了一层额外的抽象,这通常需要将请求传递给外部库。Apache原生实现了动态内容处理,流行的解决方案堆栈如LAMP(Linux, Apache, MySQL, PHP)。Nginx更加语言无关,但需要外部库如PHP-FPM来作为类似LAMP堆栈用例的解决方案。

反向代理功能

反向代理服务器位于传统Web服务器之前,成为路由HTTP请求流量的中介服务器。反向代理成为连接Web服务器与广大互联网的关口,通常是直接与防火墙交互的层面。虽然大多数Web服务器都具有反向代理功能,但Nginx是从头开始构建和优化的健壮的反向代理服务器。

在实际应用中,Nginx的重要性在很大程度上取决于其反向代理功能和效率。许多服务器设置将在Nginx反向代理后面放置多个传统Web服务器,使用Nginx根据负载或规则配置来决定将请求发送到哪个Web服务器。这种中介角色甚至允许它与Apache在一些设置中配合使用,作为传统Apache Web服务器前的反向代理。

支持生态系统

Nginx和Apache都得到了各自开发团队和社区的强烈支持。作为最受欢迎的开源Web服务器,学习资源非常丰富。Apache由非营利组织Apache支持,始终免费使用。Nginx的核心是开源的,但吸引人的功能仅在其Nginx Plus产品中提供,包括上游健康检查、会话持久性和高级监控等功能。

传统Web服务器的替代方案

如果您希望有一个随时准备响应传入HTTP请求的服务器,那么Web服务器最适合完成这项任务。但是,当您不再专注于服务HTTP请求时,Web服务器将变得不再是理想的解决方案。这对于Web服务器提供的辅助功能尤其如此。例如,根据设置,缓存等功能可能更有效地在反向代理或CDN级别处理。

此外,随着开发者将开发资源的重点从管理Web服务器转移,出现了如无服务器、无头CMS和Jamstack等解决方案。这些解决方案不需要自托管的Web服务器,而是将Web服务器层抽象为外部服务。对于不需要对Web服务器层进行细粒度或高级控制的开发者,可以将开发时间集中在其他方面。了解更多,请查看这篇关于Jamstack与无头CMS使用DigitalOcean的应用平台实现全栈Jamstack的文章。

结论

在这篇文章中,您已经了解到了什么是Web服务器,它们是如何被使用的,以及它们试图解决的问题。凭借这些知识,您深入探讨了当前的Web服务器解决方案景观,并将您的知识应用于寻找符合您特定需求的解决方案。要了解更多关于如何设置和使用Web服务器的信息,请查看我们的Cloud Curriculum系列中关于Web服务器的其余部分。

额外资源

教程:

  • 如何安装Apache:设置您的第一个Apache服务器的逐步指导。这个解决方案在去中心化配置以实现细粒度控制,以及内部处理动态网页与流行编程语言(如PHP)的钩子方面表现出色。
  • 如何安装Nginx:设置您的第一个Nginx服务器的逐步指导。这个解决方案在集中配置、服务静态资产、充当反向代理以及处理高并发流量方面表现出色。
  • Apache 与 Nginx:实用考量:更深入地了解网络服务器解决方案领域的两大巨头。

DigitalOcean 产品

  • DigitalOcean Droplets:虚拟专用服务器,用于测试和部署网络服务器。
  • DigitalOcean Functions:无服务器解决方案,可以作为虚拟专用服务器的替代方案。无需维护服务器,专注于您的应用程序代码。

Source:
https://www.digitalocean.com/community/conceptual_articles/web-servers-introduction