使用 HAProxy 实现虚拟主机和 Amazon/DO 服务器的负载平衡

使用 HAProxy 实现虚拟主机和 Amazon/DO 服务器的负载平衡

我遇到了一个问题,希望有人能给我指明正确的方向。

我有一台使用 Apache 虚拟主机(共享 IP)托管多个网站的服务器。几个月前,我的服务器提供商的数据中心发生故障,导致我的服务器及其所有子帐户不可用。谢谢!

很多账户并不是那么重要,但有 1 或 2 个账户我希望使其更具弹性/高可用性。我一直在使用云服务器实例(亚马逊和数字海洋)和 HAProxy,并建立了一个良好的测试系统并运行起来:

4台服务器:

  1. 1 个 HA 代理 LB
  2. 2 个 PHP/HTTP 应用服务器 (使用 RSync 镜像)
  3. 1 个 MySQL 数据库

但是我现在尝试使用虚拟主机帐户执行此操作但遇到了问题。以下是摘自我的 HA 代理配置文件:

backend AppServers 
balance   roundrobin 
mode   http 
server TestServer1 12.34.56.78/~accname/ check 
server TestServer2 23.45.67.89:80 check backup 

**为了发表这篇文章,我更换了 IP。*

我想要实现的目标的图表:

负载平衡虚拟主机账户和云服务器

我不是 HAProxy 的专业人士,我尝试过的大多数路线都失败了。

有人这样做过并成功吗?或者知道我做错了什么?

答案1

是的,据我所知,这听起来是一个非常容易解决的问题。

我将首先解决您的 haproxy 配置问题,然后通过使用 ACL 来检测所请求的帐户是否是关键帐户,从而使其效率更高一些 :-)

您需要将其添加到您的前端:

acl critical_1 path_beg /~accname1
acl critical_2 path_beg /~accname2

use_backend AppServers_Critcal if critical_1
use_backend AppServers_Critcal if critical_2

default_backend AppServers

然后添加这些后端。

backend AppServers_Critcal
balance   roundrobin 
mode   http
server TestServer1 12.34.56.78:80 check inter 10s fall 3 
server TestServer2 23.45.67.89:80 check backup 

backend AppServers
balance   roundrobin 
mode   http
server TestServer1 12.34.56.78:80 check 

这里简单介绍一下发生的事情;当用户请求页面时,它会查看 URL 是否以被视为关键的帐户名开头,如果是,则用户将使用指定了备份服务器的关键服务器场。但是,如果请求的帐户是非关键帐户,它将被发送到标准服务器场。

此外,您还可以option forwardfor在后端添加任何其他选项,以确保将客户端的真实 IP 转发到服务器。(如果您选择这样做,则服务器将需要改良型rpaf读取通过代理发送的标头)

inter 10s fall 3)您可能想知道它到底做什么;简而言之,它只是等待 30 秒,然后继续备份。

因此,它会等待十秒钟,然后连续检查三次,然后放弃并转到备份服务器。

Rsync 指南 其次,如果您尚未解决通过 rSync 将服务器复制/同步到远程位置的问题,您可以按照以下步骤设置一个简单的自动系统。

首先,您需要安装 rSync 和 SSH(如果尚未安装)。(在本地和远程服务器上)

(基于 RedHat 的操作系统:如下)

# yum -y install ssh rsync

(基于 Debian 的操作系统:如下)

# sudo apt-get install ssh rsync

一旦安装了这些软件包,您现在可以在两个服务器之间创建无密钥链接,这将允许您从我们正在同步的本地计算机无需密码即可连接到远程位置。

** 但请注意,这不是最佳做法,也不是最安全的做法,但它是实现完全自动化的最简单的方法之一。**

第1部分) 在本地机器上,您需要运行此命令来生成 ssh-keygen 文件。

# ssh-keygen

然后,该命令将提示您回答几个问题;这个过程非常简单,您需要做的就是为每个问题按下回车键。

第2部分

接下来我们将使用以下命令将公钥复制到远程主机。

ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] #(Your remote server IP)

然后它会提示您输入该服务器的 ssh 登录密码(使用上面定义的用户;在我们的例子中是 admin-user)

现在已经完成了;您会注意到您可以 ssh 到远程服务器而无需输入密码,这正是实现全自动同步所需要的。

现在我们可以回到 rSync。

我们可以通过运行此命令来同步所需的文件

rsync -av --delete -e ssh /websites [email protected]:/remote-folder/

我们甚至可以将其添加到 crontab 中,以便使该过程每隔 X 天或几小时运行一次。

下面是一个简单的示例,它将在每天午夜运行此命令。

00 00 * * * rsync -av --delete -e ssh /websites [email protected]:/remote-folder/

可以通过输入以下内容添加

crontab -e

我希望这对你有帮助!

相关内容