介绍
A web server’s primary role is to serve web pages for a website. A web page can be rendered from a single HTML file, or a complex assortment of resources fitted together. If you want to host your web application on the internet, in many cases you will need a web server.
Web 服务器最常见的用途之一是为在浏览器中渲染网站所需的文件提供服务。当您访问 http://www.digitalocean.com
时,您首先输入一个 URL,该 URL 开始了对互联网的请求。这个请求经过多个层次,其中一个或多个层次将是一个 Web 服务器。这个 Web 服务器生成对您请求的响应,在这种情况下是 DigitalOcean 网站,具体来说是首页。理想情况下,这个过程快速完成,并且具有全天候的可用性。
尽管任何访问 DigitalOcean 首页的访客都会将其视为单个网页,但实际上,今天大多数现代网页都是许多资源的组合。Web 服务器充当后端和前端之间的中介,提供资源,如 HTML 和 CSS 文件到 JSON 数据,所有这些资源都是动态生成的或静态提供的。如果您打算以任何方式使用网站或在线应用程序,熟悉 Web 服务器的基本知识以及其工作原理将非常有用。
虽然术语“Web 服务器”可以指代软件本身或其存在的硬件,但本文专指 Web 服务器软件。有关此差异的更多详细信息,请查看我们的云服务器介绍。
常见用途
A web server handles requests on the internet through HTTP and HTTPS protocol, and is also called an HTTP server. A web server is distinct from other types of servers in that it specializes in handling these HTTP and HTTPS requests, differentiating itself from application servers (e.g. Gunicorn) and servers for other protocols (i.e. WSGI). These other servers work as intermediaries for backend programming languages through external libraries, which is a different level of abstraction than web servers.
以下是 Web 服务器处理的一些常见任务:
- 提供 HTML、CSS 和 JavaScript 文件。
- 提供图片和视频。
- 处理 HTTP 错误消息。
- 处理用户请求,通常是并发处理。
- 处理 URL 匹配和重写。
- 处理并提供动态内容。
- 压缩内容以优化数据使用和速度。
- 为静态内容启用浏览器缓存。
在实际应用中,以下是一些个人项目可能涉及到的 Web 服务器:
- 你想要制作一个网站。
- 你想要制作一个连接到互联网的应用程序。
这个列表并不全面,而且 Web 服务器在向最终用户提供的数据类型上并不严格限制。例如,一个提供 Web API 请求的 Web 服务器通常会以 JSON 等格式响应数据。
Web 服务器的目标
网络服务器服务于期望速度、可用性、可靠性等方面的受众。它们有一个共同的目标,即在互联网上提供内容。要被认为是可行的网络服务器解决方案,必须考虑以下方面:
- 正常运行时间:这指的是网络服务器在线并可操作的时间。网站需要始终在线以服务用户,因此高正常运行时间是目标。这也意味着稳定性和可预测性。当用户输入 URL 或点击链接访问您的网站时,预期的页面应该每次都能加载,并且在任何给定时间都可以。唯一的例外应该是计划的更新或维护停机时间。一个存在故障或在随机时间崩溃的网络服务器会对用户体验产生不利影响。
- 速度:您的网页应该尽可能快地加载。用户希望立即得到他们的请求,否则您面临失去他们的风险。在加载缓慢的网页上,即使用户忍受了第一次加载,每次随后的长时间加载都会指数级地降低他们的愿意留下或再次访问。
- 并发:这指的是同时处理多个请求的能力。有太多人同时访问您的网站似乎是一件好事,但当加载时间变得缓慢到无法忍受且整个服务器崩溃时,这就成为了一个真正的问题。您的物理或虚拟服务器只有有限的资源,如 RAM 和 CPU 计算能力,网络服务器必须有效地利用这些资源。
- 可扩展性: 可扩展性指通过垂直扩展使现有服务器更强大,或通过水平扩展向设置中添加更多服务器。随着您的受众增长,您可能会达到需要多个小型网络服务器的程度。
- 设置简易性: 快速启动项目对于项目的迭代至关重要。一个简单且可重复的安装过程对于您首次设置的网络服务器以及随后扩展的多个网络服务器至关重要。
- 文档支持: 网络服务器是复杂的。最常见的设置将使您迅速上手,但随着时间的推移,您的需求将会增长。通常情况下,您会需要一些不常用的功能。当这个时候到来时,良好的文档对于为您的需求创建定制解决方案至关重要。
- 开发者支持: 如果核心开发人员不致力于他们自己的项目,您就不应该将您的项目托付给他们。这包括对他们软件的长期支持计划,以及他们提供的及时短期支持,如错误修复和补丁。
- 社区支持: 核心开发团队将处理大部分重要工作,但繁荣的社区有助于填补空白。对于开源项目,这可能意味着对实际代码库的贡献,但是一个强大的社区还将回答您的问题并帮助您解决特定问题。
虽然 Web 服务器可以提供不同的解决方案,但它们所提供的解决方案源自于试图解决相同问题。随着终端用户的需求和期望不断发展,这些问题本身也在随时间演变,使得这个列表是一个不断发展的生动列表。
选择 Web 服务器解决方案
目前最流行的开源 Web 服务器是 Apache 和 Nginx。
Apache 首先问世,在那个时候,多个具有各自配置文件的网站都存在于单个 Web 服务器上是很常见的。Nginx 在 Apache 之后出现,当时的需求从一个服务器上为多个网站提供服务转变为在负载下以极高效率为一个服务器提供服务。
虽然 Web 服务器共享相同的目标和问题,但每个解决方案的解释和实现都会有所不同。对这些问题的确切回答塑造了任何给定 Web 服务器解决方案的特性。在这里突出显示了 Nginx 和 Apache,因为它们非常普遍,但任何 Web 服务器解决方案都会有自己的观点。在选择 Web 服务器时,重要的是要记住您自己项目的特定需求。这样,即使 Web 服务器提供的解决方案发生变化,您的评估方法也会始终以您自己的需求为基础。
以下是 Web 服务器尝试实现 Web 服务器目标的一些关键区别:
配置文件结构
Web服务器将它们的设置存储在配置文件中。您可以通过编辑这些文件来自定义您的Web服务器。配置文件的存储和组织是一个主观的结构问题,它分割了Web服务器产品。
主要的分歧在于集中化和分散化。分散式配置文件允许在文件系统级别上精细控制,这源于需要在一个服务器上托管多个网站。集中式配置不关注在一个服务器上托管多个网站,而是专注于有效地为单个网站提供服务。这些配置依赖于URI模式匹配,即将URL与文件名和其他唯一标识符进行匹配,而不是依赖于与Web服务器目录结构匹配。
Apache的.htaccess
文件作为一个功能促进了分散式配置,而每个设计决策都源自对文件系统的关注,具有精细的控制级别。Nginx没有同样的文件系统关注,而是专注于URI模式匹配和集中式配置。
处理并发
你运行网络服务器的物理和虚拟服务器具有有限的资源,如RAM和CPU处理能力。你的网络服务器如何基本管理其请求将对有效利用资源产生最大影响。单个请求可以生成一个完整的进程,也可以根据事件驱动的方式处理。你的网络服务器处理多个同时请求的能力与基本设计决策相关。
Apache通过生成进程来处理请求,这会消耗资源,而在负载下可能成为问题。Nginx的事件驱动系统处理方式使用更少的资源,在负载下可能性能更高。
提供静态内容
除了网页,Web服务器还会收到其他资源的请求,如图像、视频、CSS文件和JavaScript文件。由于这些项目无论谁请求都是相同的,因此这种类型的内容被称为静态内容。通常,网页本身只是一个HTML文件,不针对请求它的人进行定制,也被视为静态内容。Web服务器还可以压缩此静态内容以获得更好的加载时间。
Nginx在提供静态内容方面表现出色,因为它的事件驱动请求处理。Apache也可以提供静态内容,但在大多数设置中,与Nginx相比,在负载下的速度和效率可能不同。
提供动态内容
当内容根据请求者的不同而更改、处理和定制时,这种内容被称为动态内容。例如,当您登录网站后,通常网站会动态地在顶部导航栏中填充您的用户名。动态内容增加了额外的复杂性,因为它迫使 Web 服务器在接收到请求时唯一处理许多请求。根据请求定制的内容不能提供给所有人,并且不能被普遍缓存。
内部处理动态内容会消除一个额外的抽象层,这个抽象层通常需要将请求转交给外部库。Apache 在原生实现动态内容处理方面表现出色,与流行的解决方案堆栈(如 LAMP(Linux、Apache、MySQL、PHP))一起使用。Nginx 更具语言通用性,但需要外部库(如 PHP-FPM)来充当类似解决方案的使用案例,例如 LAMP 堆栈。
反向代理功能
A reverse proxy sits in front of a traditional web server, becoming an intermediary server that routes HTTP request traffic to web servers behind it. A reverse proxy becomes the gateway that directs traffic between web servers and the internet at large, and often is the layer that directly interfaces with a firewall. While most web servers have reverse proxy capability, Nginx was built and optimized from the ground up to be a robust reverse proxy server.
Nginx 在现实世界的应用中的重要性很大程度上取决于其反向代理功能和效率。许多服务器设置将多个传统的 Web 服务器放置在 Nginx 反向代理之后,使用 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 或 实现全栈 Jamstack 的 DigitalOcean 的 App 平台 的文章。
结论
在本文中,您已经了解了Web服务器的基本概述,它们的用途以及它们试图解决的问题。掌握了这些知识后,您深入了解了当前的Web服务器解决方案,并应用您的知识找到了符合您特定需求的解决方案。要了解如何设置和使用Web服务器的更多信息,请查看我们的云课程系列中关于Web服务器的其他内容。
额外资源
教程:
- 如何安装Apache:逐步说明如何设置您的第一个Apache服务器。此解决方案在分散式配置方面表现出色,可进行细粒度控制,并且可以内部处理具有对流行编程语言(如PHP)的挂接的动态网页。
- 如何安装Nginx:逐步说明如何设置您的第一个Nginx服务器。此解决方案在集中式配置、静态资产服务、充当反向代理以及处理高并发流量方面表现出色。
- Apache与Nginx:实用考虑:更深入地了解Web服务器解决方案领域的两个主要参与者。
数字海洋产品:
- 数字海洋Droplets: 为您提供测试和部署 Web 服务器的虚拟专用服务器。
- 数字海洋函数: 无服务器解决方案,可以作为虚拟专用服务器的替代方案。跳过服务器维护,专注于您的应用程序代码。
Source:
https://www.digitalocean.com/community/conceptual_articles/introduction-to-web-servers