在 Linux 中使用 HAProxy、Nginx 和 Keepalived 进行负载平衡

正确设置负载均衡器可以让您的 Web 服务器顺利处理高流量,而不是崩溃。

什么是负载均衡?

负载平衡是将工作负载分配到多个服务器的过程。 这就像在公司的白班和夜班工人之间分配工作量。 负载平衡克服了单点故障,提高了服务器的可靠性。

一个 example 没有负载平衡的服务器的外观如下所示。

处理流量的单个服务器

在这个 example,如果web服务器宕机,用户的web请求就无法实时访问。 此外,如果多个用户同时请求同一个网页,那么通过单个 Web 服务器为用户的 Web 请求提供服务可能是一个缓慢的过程。 因此,负载平衡器用于增强服务器的性能、提供备份和防止故障。

在本教程中,我们将使用 Nginx、HAProxy 和 Keepalived 为 Web 服务器设置负载均衡器。

一个 example 带有负载平衡器的服务器的外观如下所示。

使用负载均衡有效处理高流量

那么,什么是 Nginx、Haproxy 和 Keepalived?

Nginx

Nginx,发音为 Engine-x 是一个开源 Web 服务器。 它不仅仅是一个 Web 服务器,它还可以作为反向代理服务器、邮件代理服务器、负载平衡器、轻量级文件服务器和 HTTP 缓存运行。 Nginx 已被用于许多流行的网站,如 BitBucket、WordPress、 Pinterest、Quora 和 GoDaddy。

HAProxy

HAProxy 代表高可用性代理。 它是一个开源负载均衡器,为基于 TCP 和 HTTP 的应用程序提供负载均衡、高可用性和代理解决方案。 它最适合将工作负载分布在多台服务器上,以提高服务器的性能和可靠性。

Haproxy 的功能是将最终用户的 Web 请求转发到可用的 Web 服务器之一。 它可以使用各种负载平衡算法,例如 循环赛, 最少的连接 等等

保活

如果 HAProxy 负载均衡器出现故障怎么办?

保活 是一个同时支持负载均衡和高可用性的开源程序。 它基本上是一个路由软件,提供两种类型的负载均衡:

  • 第 4 层(传输层)
  • 第 7 层(应用层)

Keepalived 可以执行以下功能:

Keepalived 使用 VIP (虚拟 IP 地址) 作为浮动 IP,在 Master 负载均衡器和 Backup 负载均衡器之间浮动,用于在它们之间切换。 如果主负载均衡器出现故障,则使用备用负载均衡器转发 Web 请求。

让我们继续模拟如何为 Web 服务器维护高可用性和负载平衡。

使用 Nginx、HAProxy 和 Keepalived 在 Linux 中设置负载均衡器

在 Linux 中设置负载均衡器

这是一个测试实验室实验,这意味着它只是一个让您开始的测试设置。 如果你在真实服务器上实现它,你可能需要做一些调整。 将本教程用作学习材料,而不是盲目地遵循它来进行自己的设置。

我用过 CentOS Linux 发行版 在本教程中。 您可以使用其他 Linux 发行版,但我不能保证所有命令(尤其是安装命令)是否都可以在其他发行版中使用。

负载均衡器设置要求

4个CentOS安装系统(本教程最少安装就足够了)

  • 2 CentOS 用 nginx 设置
  • 2 CentOS 需要设置 HAProxy 和 Keepalived

在本教程中,我们使用以下 IP 地址作为 example. 这些可以根据您的系统进行更改。 不要认为这些是静态 IP。

网络服务器:

  • 10.13.211.169
  • 10.13.211.158

负载均衡器:

  • 10.13.211.194
  • 10.13.211.120

虚拟IP:

  • 10.13.211.10

您可以在 Linux 命令行中轻松获取 IP 地址。

第 1 步:使用 Nginx 设置 Web 服务器

在这部分,我们将使用两个 CentOS 系统作为 Web 服务器。 我们需要先在它们上安装 Nginx。

为此,添加一个包含 nginx 的存储库,然后从那里安装它:

yum install epel-release
yum install nginx

安装好nginx后,启动Nginx服务:

systemctl start nginx

即使在每次启动后也要启用 nginx 服务:

systemctl enable nginx

查看nginx服务的状态:

systemctl status nginx

允许默认情况下被 CentOS 防火墙阻止的 nginx 中的 Web 流量。

firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https
firewall-cmd –reload 

在第二个 CentOS Web 服务器上重复上述步骤。

现在注意接下来的步骤。

nginx 的 web 文件位于 /usr/share/nginx/html 更改 index.html 文件的内容只是为了识别网络服务器。

对于第一个 Web 服务器:

echo “this is first webserver” > /usr/share/nginx/html/index.html

对于第二个 Web 服务器:

echo “this is second webserver” > /usr/share/nginx/html/index.html

注意:如果您在虚拟机上,最好在一个系统上安装和配置 Nginx,然后克隆系统。 之后,您可以在第二个系统上重新配置。 节省时间和错误。

现在通过在浏览器中转到以下 URL 来确认 Web 服务器状态:https://SERVER_DOMAIN_NAME 或 Local_IP_Address。 这里的例子:

https://10.13.211.169

或者在终端, curl 本地 IP 地址。 这里的例子:

curl 10.13.211.169

您将获得如下输出:

第 2 步:使用 HAProxy 设置负载均衡器

在其他两个系统上,使用以下命令安装 HAProxy:

yum -y update
yum -y install haproxy

HAProxy 配置文件位于 /etc/haproxy。 使用 cd 命令进入目录并在编辑之前备份文件。

cd /etc/haproxy/
mv haproxy.cfg haproxy.cfg_bac

创建一个新的 haproxy.cfg 文件并使用您喜欢的任何编辑器打开该文件。

touch haproxy.cfg
vim haproxy.cfg

现在,将以下行粘贴到文件中:

global
   log /dev/log local0
   log /dev/log local1 notice
   chroot /var/lib/haproxy
   stats timeout 30s
   user haproxy
   group haproxy
   daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000

#frontend
#---------------------------------
frontend http_front
bind *:80
stats uri /haproxy?stats
default_backend http_back

#round robin balancing backend http
#-----------------------------------
backend http_back
balance roundrobin
#balance leastconn
mode http
server webserver1 10.13.211.169:80 check    # ip_address_of_1st_centos_webserver
server webserver2 10.13.211.158:80 check    # ip_address_of_2nd_centos_webserver

现在,启用并启动 HAProxy 服务。

systemctl enable haproxy
systemctl start haproxy

检查 HAProxy 的状态:

systemctl status haproxy

在浏览器中访问 url 确认 haproxy 的服务:https://load balancer’s IP Address/haproxy?stats。 此处使用的示例:

https://10.13.211.194/haproxy?stats

或在终端中,使用命令 $ curl LoadBalancer_IP_Address

curl 10.13.211.194
curl 10.13.211.194

curl 两次,你会看到不同的输出 curl 命令。 这是因为响应来自不同的 Web 服务器(一次一个),用于您在负载均衡器上的请求。

输出将如下所示:

CentOS 中的 HAProxy

第 3 步:使用 Keepalived 设置高可用性

Keepalived 必须安装到两个 HAProxy 负载平衡器 CentOS 系统(我们刚刚在上面配置)。 一个充当主负载均衡器(主负载均衡器),另一个充当备用负载均衡器。

在这两个系统上,运行以下命令:

yum install -y keepalived

Keepalived 的配置文件位于 /etc/keepalived/keepalived.conf. 备份原来的keepalived.conf文件,在新的keepalived.conf文件中使用如下配置。

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bac
touch /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf

将以下行粘贴到配置文件中(不要忘记更改电子邮件地址):

global_defs {
notification_email {
linuxhandbook.com
[email protected]
}
notification_email_from [email protected]
smtp_server 10.13.211.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
state MASTER
interface eth0 #put your interface name here. [to see interface name: $ ip a ]
virtual_router_id 51
priority 101 # 101 for master. 100 for backup. [priority of master> priority of backup]
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 #password
}
virtual_ipaddress {
10.13.211.10 # use the virtual ip address. 
}
}

注意:虚拟 IP 可以是网络内的任何实时 IP。 接近负载均衡器的 IP 地址范围。 这里,负载均衡器的IP是:10.13.211.194 & 10.13.211.120,VIP是10.13.211.10

根据系统假设编辑配置文件。 注意主备配置。 Save 文件并启动并启用 Keepalived 进程:

systemctl start keepalived
systemctl enable keepalived

查看 Keepalived 的状态:

systemctl status keepalived

注意:如果你在虚拟机上,最好在一个系统上安装和配置 Haproxy 和 Keepalived,然后克隆系统。 之后,您可以在第二个系统上重新配置。 节省时间和错误。

现在要检查您的高可用性负载均衡器的状态,请转到终端并点击:

$ while true; do ; curl 10.13.211.10 ; sleep 1; done;

ctrl+c 停止终端运行。

输出将如下所示:

CentOS Linux 中的 Keepalived

如果您在安装和配置文件时感到不舒服, 从我的 GitHub 存储库下载脚本 并简单地运行它们。

我希望本教程可以帮助您在 Linux 中设置具有高可用性的负载均衡器。 当然,这是一个简单的设置,但它确实提供了关于负载平衡和处理高可用性的想法。

如果您有任何问题或建议,请在下方发表评论。

作者: Rishi Raj Gautam 是 Linux 爱好者和开源活动家。