您的Web应用的5种常见服务器配置
介绍
当决定为您的环境选择使用哪种服务器架构时,有许多因素需要考虑,如性能、可伸缩性、可用性、可靠性、成本和管理。
在这个教程中,你将学习常用的服务器设置,包括每个设置的简要描述和优缺点。请记住,这里介绍的所有概念可以以各种组合使用,并且每个环境都有不同的要求,因此没有一个单一正确的配置。
在一个服务器上设置所有内容。
一个服务器设置是指整个环境都存储在一个服务器上。对于典型的Web应用程序,包括Web服务器、应用服务器和数据库服务器。此类设置的常见变体是在单个服务器上使用Linux、Apache、MySQL和PHP(LAMP堆栈)。这样的配置可以用于快速设置应用程序的例子。像这样的基本设置可以用于测试一个想法或快速上线一个简单的网页。
不幸的是,这种方式在可伸缩性和组件隔离方面提供的帮助很少。此外,应用程序和数据库争夺相同的服务器资源,如 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加速可以减轻网页服务器的CPU负荷,进而提高网站性能,增加用户容量。它还可以用作反向代理负载均衡,而且一些缓存软件甚至可以防御DDOS攻击。不幸的是,如果缓存命中率低,它可能会降低性能,并需要进行调优以实现最佳性能。以下是设置HTTP加速器的可视化表示:
建立主备数据库复制
对于一个执行许多读取而不是写入的数据库系统(例如CMS),改进性能的一种方法是使用主-副本数据库复制。复制需要一个主节点和一个或多个副本节点。在这种设置中,所有更新都被发送到主节点,读取可以在所有节点之间分配。一个示例用例是增加应用程序的数据库层的读取性能。设置主-副本数据库复制可以通过将读取分散到副本上来改善数据库的读取性能,并且通过只用于更新来提高写入性能,而不需要花费时间来处理读取请求。
主副本数据库复制的一些缺点是,访问数据库的应用程序必须具有确定应该向哪些数据库节点发送更新和读取请求的机制。此外,如果主数据库发生故障,直到问题得到纠正之前,数据库上将无法执行任何更新操作。此外,在主节点发生故障的情况下,它没有内置的故障转移功能。以下是一个具有单个副本节点的主副本复制设置的可视化表示。
结合这些概念
可以在单个环境中对缓存服务器和应用服务器进行负载均衡,同时使用数据库复制。将这些技术结合在一起的目的是在不引入太多问题或复杂性的情况下获得各自的好处。下面是这种服务器环境设置的示例图。
举个例子,想象一种情景,负载均衡器被配置成能够识别静态请求(如图片、CSS、JavaScript等),并将这些请求直接发送到缓存服务器,将其他请求发送给应用服务器。
以下是用户发送动态内容请求时的流程概述:
- 用户从http://example.com/(负载均衡器)请求动态内容。
负载均衡器将请求发送到应用程序后端。
应用程序后端从数据库中读取并将请求的内容返回给负载均衡器。
负载均衡器将请求的数据返回给用户。
当用户请求静态内容时,以下过程适用:
- 负载均衡器会检查缓存存储后端,确认所请求的内容是否已经被缓存(缓存命中)或者还未被缓存(缓存未命中)。若内容缓存命中,则意味着会将所请求的内容返回给负载均衡器,并跳到流程的最后一步,将数据返回给用户。若内容缓存未命中,则缓存服务器会通过负载均衡器将请求转发给应用后端。负载均衡器会将请求转发给应用后端。应用后端从数据库中读取数据,并将所请求的内容返回给负载均衡器。负载均衡器将响应转发给缓存存储后端。缓存存储后端会将内容缓存起来,并将其返回给负载均衡器。负载均衡器会将所请求的数据返回给用户。
这个环境仍然存在两个单点故障,即负载均衡器和主数据库服务器,但它提供了之前章节中描述的所有其他可靠性和性能优势。
结论
既然你已经熟悉了一些基本的服务器设置,你应该对你自己的应用程序使用哪种设置有个很好的想法。如果你正在改进自己的环境,记住采用迭代的过程是最好的,以避免过快引入过多复杂性。