如何在 Ubuntu 14.04 上将 HAProxy 用作 WordPress 应用程序服务器的第 4 层负载平衡器

介绍

在本教程中,我们将教你如何使用HAProxy作为您的WordPress服务器的4层负载平衡器 - 特别是Web应用程序层。 应用程序服务器的负载平衡增加了您的设置,这增加了服务器故障或网络问题的可靠性,并在多个服务器上分散了负载以提高读取性能。

如果你的环境更复杂(例如,你想在单独的入口点上运行WordPress和静态Web服务器),你需要看看应用程序层(Layer 7)的负载平衡。

本教程是用WordPress作为示例写的,但其一般概念可以用来加载其他无状态的Web应用程序。

前提条件

在继续本教程之前,您应该完成有关设置一个WordPress网站与单独的数据库服务器的教程(或具有类似的设置): 如何设置远程数据库以优化网站性能与MySQL

在遵循该教程后,在单独的Web应用程序和数据库服务器上设置WordPress,您应该有两个VPS,因为我们将处理几个VPS,为参考目的,我们将称呼您的两个现有的VPS如下:

  • wordpress-1:您的WordPressWeb应用程序服务器
  • mysql-1:您的MySQL服务器为WordPress

对你的环境的抽象观点目前看起来像这样:

WordPress Application and Database Server

除了您目前的环境之外,我们还需要在本教程中添加两个VPS,我们会给他们打电话:

  • wordpress-2:您的第二个WordPressWeb应用程序服务器
  • haproxy-www:您的HAProxy服务器,负载平衡

如果您不熟悉基本的负荷平衡概念或术语,例如 layer 4 负荷平衡backendsACLs,这里有一篇文章解释了基本知识: HAProxy 和负荷平衡概念的介绍

我们的目标

在本教程结束时,我们希望有一个看起来像这样的环境:

HAProxy Load Balanced Web Application

也就是说,您的用户将通过访问您的HAProxy服务器访问您的WordPress网站,该服务器将其转发到您的负载均衡WordPress应用程序服务器以轮回方式。

扫描你的当前环境

Optional:在继续本教程之前,您将想要创建当前环境的快照。

要重返工作环境如果出现错误 2 要一次性复制原始服务器,消除需要重新安装和配置 PHP 和 Nginx

<$>[注] 注: 从 2016 年 10 月开始,每月每 gigabyte 的快照成本为 0.05 美元,取决于文件系统中所使用的空间量。

拍摄您的 wordpress-1mysql-1 VPS 的快照。

现在,我们有了快照,我们已经准备好继续建设我们的其他环境。

创建你的第二个 Web 应用程序服务器

现在我们需要创建第二个VPS,它将与我们的原始Web应用程序服务器共享负载。

  1. 创建一个新的VPS从你从原来的VPS拍摄的瞬间, wordpress-1 2 创建一个新的VPS从头开始,并手动设置它与同样的软件和配置 wordpress-1

使用任何一种方法,请确保选择 Private Networking 选项,如果可用,建议在本教程中使用的所有 VPS 使用私人网络。

** 如果您没有私有网络选项,请将私有 IP 地址替换为 VPS 的公共 IP 地址。** 请注意,当您在应用程序和数据库服务器之间传输敏感数据时使用公共 IP 地址,例如未加密的数据库密码,不是良好的做法,因为这些信息将通过公共互联网移动。

选项1:创建新的VPS与Snapshot

创建一个名为 wordpress-2 的新的 VPS,使用您拍摄的 wordpress-1 的快照。

如果您选择了此方法,请跳过选项2同步 Web 应用程序文件部分。

选项2:从零创建新的VPS

这是选择1的替代方案。

如果您想从头开始设置 wordpress-2 服务器,而不是使用 wordpress-1 的快照,请确保安装相同的软件。如果您不记得如何安装和配置原始 WordPress 服务器,请参阅先决条件文档的 设置 Web 服务器部分。

为了快速参考,以下是您需要安装或复制的相关软件和配置文件的列表:

软件:

  • MySQL 客户端 Nginx PHP

要安装此软件,请在您的 wordpress-2 服务器上运行以下操作:

1sudo apt-get update
2sudo apt-get install mysql-client
3sudo apt-get install nginx php5-fpm php5-mysql

需要编辑或创建以匹配原始应用程序服务器的配置文件:

  • /etc/php5/fpm/php.ini /etc/php5/fpm/pool.d/www.conf
  • /etc/nginx/sites-available/example.com
  • /etc/nginx/sites-enabled/example.com

不要忘了重新启动 PHP 和 Nginx 一旦你完成了软件的配置,使用这些命令:

1sudo service php5-fpm restart
2sudo service nginx restart

在您完成安装和配置新应用程序服务器后,我们将需要同步 WordPress 应用程序文件。

同步 Web 应用程序文件

在应用程序可以负载平衡之前,我们需要确保新服务器的Web应用程序文件与原始WordPress服务器同步。这些文件的位置取决于您安装WordPress的位置,以及其他一些文件。除了WordPress需要运行的php文件外,通过WordPress接口上传的文件和安装的插件需要同步,因为它们被上传或安装。在前提文件中,我们在‘/var/www/example.com’中安装WordPress,我们将使用这个位置用于我们的所有示例,但您需要用您的实际WordPress安装路径来代替。

我们将使用glusterFS来满足我们的同步需求,因为它允许每个应用程序服务器存储自己的应用程序文件副本,同时保持整个文件系统的一致性。

glusterFS Shared Volume

如果您不熟悉本节所使用的任何 glusterFS 术语,请参阅此 GlusterFS 教程(https://www.digitalocean.com/community/articles/how-to-create-a-redundant-storage-pool-using-glusterfs-on-ubuntu-servers),本节是基于的。

** 注意:** 以下子部分经常跳到 wordpress-1wordpress-2 服务器之间,请确保在正确的服务器上运行命令,否则你会遇到问题!

Edit 主持人檔案

** 注意:** 如果您有内部 DNS,并且它有您的 VPS 私人 IP 地址的记录,请轻松跳过此步骤,并替换这些主机名称为其余的 glusterFS 设置命令和配置。

否则,在WordPress-1和WordPress-2 VPS上:**

编辑 /etc/ 主机:

1sudo vi /etc/hosts

添加以下两行,用应用程序服务器的 IP 地址代替突出的单词:

wordpress_1_private_IP  wordpress-1
wordpress_2_private_IP  wordpress-2

保存和停止。

安装 GlusterFS 并配置复制卷

wordpress-1wordpress-2 VPS 上:**

使用 apt-get 来安装 glusterFS 服务器软件:

1sudo apt-get install glusterfs-server

** 在WordPress-1**上,运行以下命令以与您的WordPress-2_同行:

1sudo gluster peer probe wordpress-2

** 在 wordpress-2**上,运行以下命令以与 wordpress-1 同行:

1sudo gluster peer probe wordpress-1

在 wordpress-1 和 wordpress-2上,要创建 glusterFS 将其管理的文件存储的位置,运行:

1sudo mkdir /gluster-storage

** 在 wordpress-1**上,要创建一个被称为volume1的复制 glusterFS 卷,将其数据存储在您的两个应用程序服务器上的/gluster-storage,运行:

sudo gluster volume create volume1 replica 2 transport tcp wordpress-1:/gluster-storage wordpress-2:/gluster-storage force
Expected Output: volume create: volume1: success: please start the volume to access data

** 在 wordpress-1**上再次运行以下命令来启动您刚刚创建的 glusterFS 卷 volume1:

sudo gluster volume start volume1
Expected Output: volume start: volume1: success

** 在 wordpress-1**上,如果你想看到有关你刚刚创建和启动的 glusterFS 卷的信息,请运行:

1sudo gluster volume info

你应该看到,你有两个glusterFS,一个为每个WordPress服务器。

现在我们有一个 glusterFS 卷运行,让我们安装它,以便我们可以将其用作复制文件系统。

山区共享仓库

让我们先在WordPress-1上安装文件系统。

** 在 wordpress-1**上,编辑 fstab 以便我们的共享文件系统启动:

1sudo vi /etc/fstab

将下列行添加到文件的末尾,以使用 /storage-pool 作为我们的安装点. 请自由地替换这个(在这里和本 glusterFS 设置的其余部分):

wordpress-1:/volume1   /storage-pool   glusterfs defaults,_netdev 0 0

保存和停止。

** 在 wordpress-1**上,您现在可以将 glusterFS 卷安装到 /storage_pool 文件系统:

sudo mkdir /storage-pool
sudo mount /storage-pool

这将共享卷, / storage-pool,安装在您的 wordpress-1 VPS 上. 您可以运行df -h,并且应该列为安装的文件系统。

** 在 wordpress-2**上,编辑 fstab 以便我们的共享文件系统启动:

1sudo vi /etc/fstab

将下列行添加到文件的末尾以使用 /storage-pool 作为我们的安装点. 如果您使用了不同的值,请确保您在这里取代它:

wordpress-2:/volume1   /storage-pool   glusterfs defaults,_netdev 0 0

** 在 wordpress-2**上,您现在可以将 glusterFS 卷安装到 /storage_pool 文件系统:

1sudo mkdir /storage-pool
2sudo mount /storage-pool

现在,在/storage-pool文件系统中创建、修改或删除的任何文件都会在两个服务器上同步,即使其中一个服务器暂时停机。

将WordPress文件迁移到共享存储

下一步是将 WordPress 文件迁移到共享存储中,请用您自己的值代替所突出的单词。 /var/www/example.com 表示您的 WordPress 文件所在位置(以及 Nginx 正在寻找文件的地方),而 `example.com 本身只是目录的名称。

在WordPress-1上,运行以下命令将您的WordPress应用程序文件移动到您的共享文件系统, /storage-pool:

sudo mv /var/www/example.com /storage-pool/
sudo chown www-data:www-data /storage-pool/example.com

接下来,您将想要创建一个象征链接,该链接指向共享文件系统上的WordPress文件,您的WordPress文件最初是通过运行存储的:

sudo ln -s /storage-pool/example.com /var/www/example.com

现在您的WordPress文件位于共享文件系统中, /storage-pool,它们仍然可以通过原始位置, /var/www/example.com访问 Nginx。

指向新的应用程序服务器共享存储

下一步是在我们的新的Web应用程序服务器上创建一个符号链接,该链接指向共享文件系统上的WordPress文件。

如果您使用 snapshot 选项创建了 wordpress-2,请在 wordpress-2上运行以下命令:

sudo rm /var/www/example.com
sudo ln -s /storage-pool/example.com /var/www/example.com

如果您创建了 wordpress-2 from zero,请执行以下命令 _on wordpress-2*:

sudo mkdir -p /var/www
sudo ln -s /storage-pool/example.com /var/www/example.com

这是为了同步WordPress应用程序文件! 下一步是给我们的新应用程序服务器 _wordpress-2_访问数据库。

创建新数据库用户

因为MySQL通过用户名和源主机来识别用户,所以我们需要创建一个新的wordpressuser_,可以从我们的新应用程序服务器,wordpress-2_连接。

在您的数据库VPS上, mysql-1,连接到MySQL控制台:

1mysql -u root -p

在以下 MySQL 语句中,用适用于您的环境的任何文字代替所有突出的单词:

  • wordpressuser:您的MySQLWordPress用户. 确保它与现有用户名相同
  • wordpress_2_private_IP:您的WordPress-2_VPS
  • password:您的MySQLWordPress用户密码。 确保它与现有密码相同(而且它是一个很好的密码!)

运行此声明创建一个MySQL用户,可以从你的新的WordPress服务器连接, wordpress-2:

CREATE USER 'wordpressuser'@'wordpress_2_private_IP' IDENTIFIED BY 'password';

再次,替换自己的值为wordpressuser,wordpress_2_private_IP,如果您的 database 没有被命名为wordpress,请确保也改变了。

GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'wordpress_2_private_IP';
FLUSH PRIVILEGES;

现在你的第二个 Web 应用程序服务器 wordpress-2 可以登录到您的数据库服务器上的 MySQL, mysql-1

尚未负荷均衡

请注意,有两个 Web 应用程序服务器正在运行,但应用程序没有负载平衡,因为每个服务器必须通过其相应的公共 IP 地址访问。我们希望能够通过相同的 URL 访问应用程序,如 http://example.com/,并在两个 Web 应用程序服务器之间的流量平衡。

安装 HAProxy

创建一个新的VPS与私人网络. 对于本教程,我们将称之为 haproxy-www

在我们的 haproxy-www VPS 中,让我们用 apt-get 安装 HAProxy:

1sudo apt-get update
2sudo apt-get install haproxy

我们需要启用HAProxy init脚本,因此HAProxy将与您的VPS一起启动和停止。

1sudo vi /etc/default/haproxy

ENABLED的值更改为1,以启用 HAProxy init 脚本:

1ENABLED=1

现在HAProxy将启动和停止您的VPS。 此外,您现在可以使用服务命令来控制您的HAProxy。

1user@haproxy-www:/etc/init.d$ sudo service haproxy status
2haproxy not running.

它不运行,这很好,因为它需要配置,然后我们可以使用它。

HAProxy 配置

HAProxy 的配置文件分为两个主要部分:

  • 全球:设置整个流程的参数
  • Proxies:包括 defaultslistenfrontendbackend 参数

再次,如果你不熟悉HAProxy或基本的负荷平衡概念和术语,请参阅此链接: HAProxy和负荷平衡概念的介绍

HAProxy 配置: 全球

**所有HAProxy配置都应该在您的HAProxy VPS上完成, haproxy-www

首先,让我们创建一个默认 haproxy.cfg 文件的副本:

1cd /etc/haproxy; sudo cp haproxy.cfg haproxy.cfg.orig

现在在文本编辑器中打开 haproxy.cfg:

1sudo vi /etc/haproxy/haproxy.cfg

您将看到已经定义的两个部分: globaldefaults. 首先,我们将对一些默认参数进行一些更改。

defaults 中,搜索以下行:

1mode http
2option httplog

在这两种情况下,将http代替为tcp:

1mode tcp
2option tcplog

选择 tcp 作为模式将 HAProxy 配置为执行层 4 负荷平衡。在我们的情况下,这意味着在特定 IP 地址和端口上的所有流量将被转移到相同的后端。

不要关闭 config 文件! 接下来我们将添加 proxy 配置。

HAProxy 配置: Proxies

对于基本的4层负载平衡设置,前端听取特定IP地址的流量,然后将输入流量转移到指定的后端。

在文件的末尾,让我们添加我们的前端, www. 请确保用您的 haproxy-www VPS 的 公共 IP代替haproxy_www_public_IP:

frontend www
   bind haproxy_www_public_IP:80
   default_backend wordpress-backend

以下是对前端 config 片段中的每个行意味着什么的解释:

  • frontend www:指定一个名为www的前端,因为我们将使用它来处理到来的 www 流量
  • bind haproxy_www_public_IP:80:用 haproxy-www的公共 IP 地址代替 haproxy_www_public_IP 这告诉 HAProxy 这个前端将处理这个 IP 地址和端口上的入口网络流量
  • default_backend wordpress-backend:这说明这个前端的所有流量将被转发到 wordpress-backend,我们将在下一步定义

完成配置前端后,请继续通过添加以下行来添加后端。

backend wordpress-backend
   balance roundrobin
   mode tcp
   server wordpress-1 wordpress_1_private_IP:80 check
   server wordpress-2 wordpress_2_private_IP:80 check

以下是对上面的后端配置片段中的每个行意味着什么的解释:

  • backend wordpress-backend:指定名为wordpress-backend的后端
  • balance roundrobin:指定此后端将使用roundrobin负载平衡算法
  • mode tcp:指定此后端将使用tcp或4层代理
  • server wordpress-1...:指定名为wordpress-1的后端服务器,私人IP(您必须取代)和端口,在这种情况下它正在收听, 80

HAProxy现在已经准备好启动,但让我们先启用登录。

启用 HAProxy 记录

在 HAProxy 中启用登录非常简单. 首先,编辑 rsyslog.conf 文件:

1sudo vi /etc/rsyslog.conf

然后找出以下两行,并解除评论以启用UDP syslog接收. 完成后应该看起来如下:

1$ModLoad imudp
2$UDPServerRun 514
3$UDPServerAddress 127.0.0.1

现在重新启动 rsyslog 以启用新的配置:

1sudo service rsyslog restart

HAProxy 登录已启用! HAProxy 启动后,日志文件将创建在 `/var/log/haproxy.log。

启动 HAProxy 和 PHP/Nginx

** 在 haproxy-www** 上,启动 HAProxy 以使配置更改生效:

1sudo service haproxy restart

根据您如何设置新的应用程序服务器,您可能需要通过重新启动PHP和Nginx来重新启动您的WordPress应用程序。

在 wordpress 2 中,通过运行以下命令重新启动 PHP 和 Nginx:

1sudo service php5-fpm restart
2sudo service nginx restart

现在WordPress应该在您的两个应用程序服务器上运行,并且负荷均衡,但仍有最后一个配置更改要做。

更新WordPress配置

现在,您的WordPress应用程序的URL已经改变,我们必须更新WordPress中的几个设置。

** 在任何一个WordPress服务器上**,编辑您的 wp-config.php. 它位于您安装WordPress的地方(在教程中,它安装在 /var/www/example.com 中,但您的安装可能有所不同):

cd /var/www/example.com; sudo vi wp-config.php

查找顶部的行,上面写着‘define('DB_NAME', 'wordpress');’,并在上面添加以下行,取代突出值:

define('WP_SITEURL', 'http://haproxy_www_public_IP');
define('WP_HOME', 'http://haproxy_www_public_IP');

现在,WordPress URL已配置为指向您的负载平衡器,而不仅仅是您的原始WordPress服务器,当您尝试访问WP-admin仪表板时,它就会发挥作用。

充电平衡全程!

您的 Web 应用程序服务器现在负荷均衡! 您的负荷均衡 WordPress 现在可以通过您的负荷均衡器的公共 IP 地址或域名访问您的用户, haproxy-www!

结论

现在你的用户的负载将分布在你的两个WordPress服务器之间,此外,如果你的WordPress应用服务器中的一台下跌,你的网站仍然可用,因为其他WordPress服务器将转发所有流量!

使用此设置,请记住您的 HAProxy 负载平衡服务器 haproxy-www 和您的数据库服务器 mysql-1 需要运行,以便您的网站正常工作。

By Mitchell Anicas
Published At
Categories with 技术
comments powered by Disqus