基础设施
我们讨论了太多关于提高应用程序性能的主题。 现在,我们来讨论应用程序的可扩展性和可用性。 随着时间的推移,我们应用程序的流量可能会增加到一次数千个用户。 如果我们的应用程序运行在单个服务器上,性能将受到巨大影响。 此外,让应用程序在单点运行也不是一个好主意,因为如果该服务器出现故障,我们的整个应用程序也将崩溃。
为了使我们的应用程序更具可扩展性和更好的可用性,我们可以使用基础设施设置,在该基础设施设置中我们可以在多个服务器上托管我们的应用程序。 此外,我们可以将应用程序的不同部分托管在不同的服务器上。为了更好地理解,请看下图:

这是基础设施的非常基本的设计。我们来谈谈它的不同部分以及每个部分和服务器将执行哪些操作。
可能只有负载平衡器 (LB) 连接到公共互联网,其他部分可以通过机架中的专用网络连接。如果有机架,这将是非常好的选择,因为所有服务器之间的所有通信都将在专用网络上进行,因此非常安全。 |
Web 服务器
在上图中,我们有两个网络服务器。网络服务器的数量可以根据需要而定,而且可以很方便地连接到 LB。网络服务器将托管我们的实际应用程序,应用程序将在 NGINX 或 Apache 和 PHP 7 上运行。我们将在本章讨论的所有性能调整都可以在这些网络服务器上使用。此外,这些服务器不必监听 80 端口。我们的网络服务器最好监听另一个端口,以避免任何使用浏览器的公共访问。
数据库服务器
数据库服务器主要用于安装 MySQL 或 Percona 服务器的数据库。不过,基础架构设置中的一个问题是将会话数据存储在一个地方。为此,我们也可以在数据库服务器上安装 Redis 服务器,由它来处理应用程序的会话数据。
前面的基础架构设计并不是最终或完美的设计。它只是提供了一个多服务器应用程序托管的概念。它还有很多可以改进的地方,比如添加另一个本地平衡器、更多网络服务器和数据库集群服务器。
负载均衡器(LB)
第一部分是负载平衡器(LB)。负载平衡器的作用是根据各网络服务器的负载情况在网络服务器之间分配流量。对于负载平衡器,我们可以使用 HAProxy,它在这方面应用广泛。此外,HAProxy 还能检查每个网络服务器的健康状况,如果某个网络服务器出现故障,它会自动将该故障网络服务器的流量重定向到其他可用的网络服务器。为此,只有 LB 将监听 80 端口。
我们不想给可用的网络服务器(在本例中是两个网络服务器)带来加密和解密 SSL 通信的负担,因此我们将使用 HAProxy 服务器来终止 SSL。当我们的 LB 收到带 SSL 的请求时,它会终止 SSL 并向其中一个网络服务器发送正常请求。当收到响应时,HAProxy 将对响应进行加密,然后发送回客户端。这样,就不必同时使用两个服务器进行 SSL 加密/解密,而只需使用一个 LB 服务器即可。
Varnish 也可以用作负载平衡器,但这并不是一个好主意,因为 Varnish 的全部用途就是 HTTP 缓存。 |
HAProxy负载均衡
在前面的基础架构中,我们在网络服务器前放置了一个负载平衡器,它可以平衡每个服务器的负载、检查每个服务器的健康状况并终止 SSL。我们将安装 HAProxy 并对其进行配置,以实现前面提到的所有配置。
HAProxy安装
我们将在 Debian/Ubuntu 上安装 HAProxy。在编写本书时,HAProxy 1.6 是最新的稳定版本。执行以下步骤安装 HAProxy:
-
首先,通过在终端中发出以下命令来更新系统缓存:
sudo apt-get update
-
接下来,通过在终端中输入以下命令来安装 HAProxy:
sudo apt-get install haproxy
这将在系统上安装 HAProxy。
-
现在,通过在终端中发出以下命令来确认 HAProxy 安装:
haproxy -v
如果输出如上图所示,那么恭喜!HAProxy 安装成功。
HAProxy负载均衡
现在,是时候使用 HAProxy 了。为此,我们有以下三台服务器:
-
首先是安装了 HAProxy 的负载平衡服务器。我们称之为 LB。在本书中,LB 服务器的 IP 地址为 10.211.55.1。该服务器将监听 80 端口,所有 HTTP 请求都将发送到该服务器。这台服务器还充当前端服务器,因为我们应用程序的所有请求都将来自这台服务器。
-
第二台是网络服务器,我们称之为 Web1。该服务器上安装了 NGINX、PHP 7、MySQL 或 Percona Server。该服务器的 IP 地址是 10.211.55.2。该服务器将监听 80 端口或任何其他端口。我们将保持它监听 8080 端口。
-
第三个是第二个网络服务器,我们称之为 Web2,IP 为 10.211.55.3。它的设置与 Web1 服务器相同,将监听 8080 端口。
Web1 和 Web2 服务器也称为后端服务器。首先,让我们配置 LB 或前端服务器,使其监听端口为 80。
打开位于 /etc/haproxy/ 的 haproxy.cfg 文件,在文件末尾添加以下几行:
frontend http
bind *:80
mode http
default_backend web-backends
在前面的代码中,我们将 HAProxy 设置为在任意 IP 地址(本地环回 IP 127.0.0.1 或公共 IP)上监听 HTTP 端口 80。然后,我们设置了默认后端。
现在,我们将添加两个后端服务器。在同一个文件中,在末尾添加以下代码:
backend web-backend
mode http
balance roundrobin
option forwardfor
server web1 10.211.55.2:8080 check
server web2 10.211.55.3:8080 check
在前面的配置中,我们为网络后台添加了两个服务器。后端的参考名称是 web-backend,前端配置中也使用了这个名称。我们知道,两个网络服务器都监听 8080 端口,因此我们在每个网络服务器的定义中都提到了这一点。此外,我们还在每个网络服务器的定义末尾使用了 check,告诉 HAProxy 检查服务器的健康状况。
现在,在终端中发出以下命令重新启动 HAProxy:
sudo service haproxy restart
要启动 HAProxy,我们可以使用 |
现在,在浏览器中输入 LB 服务器的 IP 或主机名,Web1 或 Web2 将显示我们的网络应用页面。
现在,禁用任何一台网络服务器,然后重新加载页面。应用程序仍然可以正常运行,因为 HAProxy 会自动检测到其中一个网络服务器宕机,并将流量重定向到第二个网络服务器。
HAProxy 还提供一个基于浏览器的统计页面。它提供有关 LB 和所有后端的完整监控信息。要启用统计功能,请打开 haprox.cfg,并在文件末尾添加以下代码:
listen stats *:1434
stats enable
stats uri /haproxy-stats
stats auth phpuser:packtPassword
统计通过 1434 端口启用,也可将其设置为任何端口。页面的 URL 是 stats uri
。它可以设置为任何 URL。auth
部分用于基本 HTTP 身份验证。保存文件并重启 HAProxy。现在,打开浏览器并输入 URL,如 10.211.55.1:1434/haproxy-stats
。统计页面将显示如下:

在前面的截图中,可以看到每个后端网络服务器,包括前端信息。
此外,如果网络服务器宕机,HAProxy stats 会高亮显示该网络服务器的行,如下图所示:

在测试中,我们停止了 Web2 服务器上的 NGINX,并刷新了统计页面,结果后端部分的 Web2 服务器行突出显示。
使用 HAProxy 终止 SSL 非常简单。要使用 HAProxy 终止 SSL,我们只需添加 SSL 端口 443 绑定和 SSL 证书文件位置。打开 haproxy.cfg 文件,编辑前端区块,并在其中添加高亮显示的代码,如下所示:
frontend http
bind *:80
bind *:443 ssl crt /etc/ssl/www.domain.crt
mode http
default_backend web-backends
现在,HAProxy 也在 443 处监听,当 SSL 请求发送到它时,它会在那里进行处理并终止,这样就不会向后端服务器发送 HTTPS 请求。这样,网络服务器就不再承担 SSL 加密/解密的负载,而只由 HAProxy 服务器管理。由于 SSL 在 HAProxy 服务器上终止,网络服务器无需监听 443 端口,因为来自 HAProxy 服务器的常规请求会发送到后端服务器。