适用于 Web 应用程序的 5 种常见服务器设置
介绍
在决定为您的环境使用哪种服务器架构时,需要考虑许多因素,例如性能、可扩展性、可用性、可靠性、成本和管理。
在本教程中,您将了解常用的服务器设置,并简要介绍每种设置,包括其优缺点。请记住,这里介绍的所有概念都可以以各种组合方式使用,并且每个环境都有不同的要求,因此没有单一的正确配置。
在一台服务器上设置所有内容
单服务器设置是指整个环境位于一台服务器上。对于典型的 Web 应用程序,这包括 Web 服务器、应用程序服务器和数据库服务器。此设置的一个常见变体是LAMP 堆栈,它代表位于单台服务器上的Linux、A pache、MySQL和PHP。此设置的一个示例用例是当您想要快速设置应用程序时。可以使用这样的基本设置来测试某个想法或启动并运行一个简单的网页。
不幸的是,这在可扩展性和组件隔离方面几乎没有什么作用。此外,应用程序和数据库争夺相同的服务器资源,如 CPU、内存、I/O 等。因此,这可能会导致性能不佳,并使得难以确定根本原因。使用一台服务器也不易于水平扩展。您可以在我们的“了解数据库分片”教程中了解有关水平扩展的更多信息。在我们的“如何在 Ubuntu 22.04 上安装 LAMP”教程中了解有关 LAMP 堆栈的更多信息。以下是使用单个服务器的直观表示:
设置单独的数据库服务器
数据库管理系统(DBMS)可以与环境的其余部分分离,以消除应用程序和数据库之间的资源争用,并通过将数据库从 DMZ或公共互联网中移除来提高安全性。
一个示例用例是,这可以快速设置您的应用程序,并防止应用程序和数据库争夺相同的系统资源。您还可以分别垂直扩展每个应用程序和数据库层。这可以通过向需要增加容量的任何服务器添加更多资源来实现。根据您的设置,这还可以通过从 DMZ 中删除数据库来提高安全性。
此设置比单个服务器稍微复杂一些。如果两台服务器之间的网络连接在地理上相距较远,则可能会出现性能问题(如高延迟)。如果带宽对于传输的数据量来说太低,也可能会出现性能问题。您可以阅读更多关于如何设置远程数据库以使用 MySQL 优化站点性能的内容。以下是使用单独数据库服务器的直观表示:
设置负载均衡器(反向代理)
可以将负载平衡器添加到服务器环境中,通过在多台服务器上分配工作负载来提高性能和可靠性。如果其中一台负载平衡服务器发生故障,其他服务器将处理传入流量,直到发生故障的服务器恢复正常。它还可用于通过同一域和端口为多个应用程序提供服务,方法是使用第7 层应用层反向代理。能够进行反向代理负载平衡的几种软件是 HAProxy、Nginx 和 Varnish。
一个示例用例是在需要通过添加更多服务器进行扩展的环境中,也称为水平扩展。设置负载均衡器时,它会启用可通过添加更多服务器来扩展的环境容量。它还可以通过将客户端连接限制在合理的数量和频率来防止DDOS 攻击。
如果负载均衡器资源不足或配置不当,则设置负载均衡器可能会造成性能瓶颈。 它还会带来需要额外考虑的复杂性,例如在何处执行 SSL 终止以及如何处理需要粘性会话的应用程序。 此外,负载均衡器是单点故障,这意味着如果它发生故障,整个服务都可能瘫痪。 高可用性( HA) 设置是没有单点故障的基础设施。 要了解如何实施 HA 设置,您可以阅读我们关于保留 IP 的文档。 您还可以在我们的指南《HAProxy 和负载平衡概念简介》中阅读更多内容。 以下是设置负载均衡器的直观表示:
设置 HTTP 加速器(缓存反向代理)
HTTP 加速器或缓存 HTTP 反向代理可用于通过各种技术减少向用户提供内容所需的时间。HTTP 加速器采用的主要技术是将来自 Web 或应用服务器的响应缓存在内存中,这样就可以快速处理对相同内容的未来请求,减少与 Web 或应用服务器的不必要交互。能够进行 HTTP 加速的软件有 Varnish、Squid、Nginx。一个示例用例是在具有内容繁重的动态 Web 应用程序或许多常用访问文件的环境中。
HTTP 加速可以通过缓存和压缩减少 Web 服务器上的 CPU 负载来提高站点性能,从而增加用户容量。它还可以用作反向代理负载平衡,一些缓存软件甚至可以防止 DDOS 攻击。不幸的是,如果缓存命中率较低,它会降低性能,并且需要进行调整才能获得最佳性能。以下是设置 HTTP 加速器的直观表示:
设置主副本数据库复制
对于执行大量读取而非写入的数据库系统(如 CMS),提高性能的一种方法是使用主副本数据库复制。复制需要一个主节点和一个或多个副本节点。在此设置中,所有更新都将发送到主节点,读取可以分布在所有节点上。一个示例用例是提高应用程序数据库层的读取性能。设置主副本数据库复制可通过将读取分散到副本来提高数据库读取性能,并通过专门用于更新来提高写入性能,而无需花时间处理读取请求。
主副本数据库复制的一些缺点是,访问数据库的应用程序必须具有一种机制来确定应向哪些数据库节点发送更新和读取请求。此外,如果主节点发生故障,则在问题得到纠正之前无法对数据库执行任何更新。在主节点发生故障的情况下,它也没有内置的故障转移功能。以下是具有单个副本节点的主副本复制设置的直观表示:
结合概念
除了应用服务器之外,还可以对缓存服务器进行负载平衡,并在单个环境中使用数据库复制。结合这些技术的目的是充分利用每种技术的优势,而不会引入太多问题或复杂性。以下是此类服务器环境设置的示例图:
例如,想象这样一种场景,其中负载均衡器配置为识别静态请求(如图像、CSS、JavaScript 等)并将这些请求直接发送到缓存服务器,并将其他请求发送到应用程序服务器。
以下是用户发送动态内容请求的流程细目:
- 用户从http://请求动态内容示例.com/(负载均衡器)
- 负载均衡器将请求发送到应用后端
- 应用程序后端从数据库读取并将请求的内容返回给负载均衡器
- 负载均衡器将请求的数据返回给用户
当用户请求静态内容时,将应用以下过程:
- 负载均衡器检查缓存后端以确认请求的内容是否被缓存(缓存命中)或未被缓存(缓存未命中)
- 如果内容缓存命中,则意味着它将把请求的内容返回给负载均衡器,并跳转到流程的最后一步,将数据返回给用户。如果内容缓存未命中,则缓存服务器通过负载均衡器将请求转发到应用后端
- 负载均衡器将请求转发到应用程序后端
- 应用程序后端从数据库读取并将请求的内容返回给负载均衡器
- 负载均衡器将响应转发给缓存后端
- 缓存后端缓存内容并将其返回给负载均衡器
- 负载均衡器将请求的数据返回给用户
该环境仍然有两个单点故障,即负载平衡器和主数据库服务器,但它提供了前面几节中描述的所有其他可靠性和性能优势。
结论
现在您已经熟悉了一些基本的服务器设置,您应该清楚自己应该为自己的应用程序使用哪种设置。如果您正在努力改善自己的环境,请记住,最好采用迭代过程,以避免过快引入过多的复杂性。