为生产而构建:Web应用程序—概述
介绍
这个由 6 部分组成的教程将向您展示如何从头开始构建多服务器生产应用程序设置。 备份、监控和集中式日志系统将支持最终设置,这将帮助您确保能够检测到问题并从中恢复。 本系列的最终目标是建立独立的系统管理概念,并向您介绍创建生产服务器设置的一些实际注意事项。
如果您有兴趣查看本系列中将介绍的一些概念,请阅读以下教程:
虽然链接的文章提供了生产应用程序设置的一般指南,但本系列将演示如何从头到尾规划和设置示例应用程序。 希望这将帮助您规划和实现自己的生产服务器环境,即使您在完全不同的技术堆栈上运行不同的应用程序。 因为本教程涵盖了许多不同的系统管理主题,所以它通常会将详细解释推迟到提供补充信息的外部支持文章中。
我们的目标
在这组教程结束时,我们将为 PHP 应用程序设置生产服务器,WordPress 用于演示目的,可通过 https://www.example.com/ 访问。 我们还将包括支持生产应用程序服务器的服务器。 最终设置将如下所示(未显示私有 DNS 和远程备份):
在此设置中,Application 框中的服务器被认为是应用程序正常运行所必需的。 除了恢复计划和远程备份服务器之外,其余组件(备份、监控和日志记录)将被添加以支持生产应用程序设置。 每个组件都将安装在同一 DigitalOcean 区域(在我们的示例中为 NYC3)内的单独 Ubuntu 14.04 服务器上,并启用专用网络。
组成应用程序的服务器集将被称为以下主机名:
- lb1: HAProxy 负载均衡器,可通过 https://example.com/ 访问
- app1: Apache 和 PHP 应用服务器
- app2: Apache 和 PHP 应用服务器
- db1: MySQL 数据库服务器
需要注意的是,选择这种类型的设置是为了演示如何在多个服务器上构建应用程序的组件; 您自己的设置应根据您自己的需要进行定制。 这种特定的服务器设置有单点故障,可以通过添加另一个负载平衡器(和 round-robin DNS)和 数据库服务器复制 或添加指向其中一个的静态 IP 来消除下面我们将简要介绍的主动或被动负载平衡器。
将支持应用程序服务器的组件将被称为以下主机名:
- backups: Bacula 备份服务器
- 监控: Nagios监控服务器
- logging: Elasticsearch、Logstash、Kibana (ELK) 堆栈,用于集中式日志记录
此外,图中未显示以下三个支持组件:
- ns1: 私有 DNS 的主 BIND 名称服务器
- ns2: 私有 DNS 的辅助 BIND 名称服务器
- remotebackups: 位于不同区域的远程服务器,用于在生产数据中心发生物理灾难时存储 Bacula 备份的副本-===\
我们还将针对应用程序的各个组件的故障制定基本的恢复计划。
当我们达到目标设置时,我们总共将拥有 10 台服务器。 我们将一次性创建它们(这简化了诸如设置 DNS 之类的事情),但可以根据需要随意创建每一个。 如果您计划使用 DigitalOcean 备份作为您的备份解决方案,除了或代替 Bacula,请务必在创建 Droplets 时选择该选项。
高可用性(可选)
单点故障是当您的基础架构的一部分出现故障时,可能会导致您的整个站点或服务不可用。 如果您想解决此设置的单点故障,您可以通过添加另一个负载均衡器使其具有高可用性。 如果发生故障,高可用性服务会自动故障转移到备份或被动系统。 在高可用性设置中拥有两个负载平衡器可以通过确保一个负载平衡器在主动负载平衡器不可用时始终被动地接受流量来防止停机。
有多种方法可以实现高可用性设置。 要了解更多信息,请阅读 如何使用浮动 IP 的这一部分。
虚拟专用网络(可选)
如果您想保护服务器之间的网络通信,您可能需要考虑设置 VPN。 当数据通过 Internet 传输时,使用加密保护网络传输尤其重要。 使用 VPN 的另一个好处是主机的身份通过密钥身份验证过程进行验证,这将保护您的服务免受未经授权的来源。
如果您正在寻找开源 VPN 解决方案,您可能需要考虑 Tinc 或 OpenVPN。 在这种特殊情况下,使用网状路由的 Tinc 是更好的解决方案。 可以在此处找到有关这两种 VPN 解决方案的教程:
先决条件
每个 Ubuntu 14.04 服务器都应该有一个非 root 超级用户,可以按照以下教程进行设置:使用 Ubuntu 14.04 进行初始服务器设置。 所有命令都将以该用户身份在每台服务器上运行。
我们将假设您对基本的 Linux 安全概念有一些了解,我们不会详细介绍。 如果您需要快速的 Linux 安全入门,请阅读这篇文章:7 保护服务器的安全措施。
域名
我们将假设您的应用程序将通过域名提供服务,例如“example.com”。 如果您还没有,请从域名注册商处购买。
选择好域名后,您可以按照本教程将其与 DigitalOcean DNS 一起使用:如何从公共域注册商 指向 DigitalOcean 名称服务器。
除了使您的站点更易于访问(与 IP 地址相比)之外,还需要一个域名来实现使用 SSL 证书的域和身份验证优势,这还为您的应用程序与其用户之间的通信提供加密。
SSL 证书
TLS/SSL 在您的应用程序及其用户之间提供加密和域验证,因此我们将在设置中使用 SSL 证书。 在我们的示例中,因为我们希望用户通过“www.example.com”访问我们的站点,因此我们将指定为证书的通用名称 (CN)。 证书将安装在 HAProxy 服务器 lb1 上,因此为方便起见,您可能希望在其中生成证书密钥和 CSR。
如果您需要提供身份验证的证书,您可以使用 Let's Encrypt 免费获得 SSL 证书,或从商业证书颁发机构购买。 有关 Let's Encrypt 选项的详细信息,请阅读 如何从商业证书颁发机构安装 SSL 证书。 跳过 在 Web 服务器上安装证书 部分。
或者,您也可以使用自签名 SSL 证书,该证书可以使用以下命令生成:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ~/www.example.com.key -out ~/www.example.com.crt
实现目标的步骤
现在我们已经大致了解了生产应用程序设置,让我们制定一个总体计划来实现我们的目标。
组成应用程序的组件是最重要的,因此我们希望这些组件尽早启动并运行。 然而,因为我们计划对我们的私有网络连接使用基于名称的地址解析,我们应该首先设置我们的DNS。
一旦我们的 DNS 准备就绪,为了启动和运行,我们将设置构成应用程序的服务器。 因为应用程序需要数据库,而负载均衡器需要应用程序,所以我们将按以下顺序设置组件:
- 数据库服务器
- 应用服务器
- 负载均衡器
一旦我们完成了设置应用程序的步骤,我们将能够为各种场景设计 恢复计划 。 该计划将有助于确定我们的备份策略。
在我们制定了各种恢复计划后,我们将希望通过设置 备份 来支持它。 之后,我们可以设置 monitoring 以确保我们的服务器和服务处于正常状态。 最后,我们将设置 集中式日志记录 ,以便我们可以帮助我们查看日志、解决问题并识别趋势。
结论
准备好我们的总体计划后,我们就可以实施我们的生产应用程序设置了。 请记住,此设置虽然功能齐全,但只是一个示例,您应该能够从中收集有用的信息,并使用您学到的知识来改进您自己的应用程序设置。
继续下一个教程以开始设置应用程序:为生产而构建:Web 应用程序 — 部署 。