使用 HAProxy 负载均衡网络流量

安装、配置和运行 HAProxy,以将网络流量分配到多个 Web 或应用程序服务器。
94 位读者喜欢这篇文章。

您不必在一家大型公司工作才能证明使用负载均衡器的合理性。您可能是一位爱好者,使用几台 Raspberry Pi 计算机自托管网站。也许您是一家小型企业的服务器管理员;也许您确实在一家大型公司工作。无论您的情况如何,您都可以从使用 HAProxy 负载均衡器来管理您的流量中获益。

HAProxy 被誉为“世界上最快和最广泛使用的软件负载均衡器”。它包含许多功能,可以使您的应用程序更安全、更可靠,包括内置的速率限制、异常检测、连接队列、健康检查以及详细的日志和指标。学习本教程中介绍的基本技能和概念将帮助您使用 HAProxy 构建更强大、更强大的基础设施。

为什么你需要负载均衡器?

负载均衡器是一种轻松地将连接分配到多个 Web 或应用程序服务器的方法。事实上,HAProxy 可以平衡任何类型的传输控制协议(TCP)流量,包括 RDP、FTP、WebSockets 或数据库连接。负载分配能力意味着您不必仅仅因为您的网站流量超过 Google 就购买一台拥有海量 RAM 的大型 Web 服务器。

负载均衡器还为您提供灵活性。也许您现有的 Web 服务器不够强大,无法满足一年中繁忙时段的峰值需求,并且您想添加另一个服务器,但只是临时性的。也许您想在服务器发生故障时增加一些冗余。使用 HAProxy,您可以在需要时向后端池添加更多服务器,并在不需要时删除它们。

您还可以根据上下文将请求路由到不同的服务器。例如,您可能希望使用几个缓存服务器(例如 Varnish)处理您的静态内容,但将任何需要动态内容(例如 API 端点)的内容路由到更强大的计算机。

在本文中,我将引导您完成设置一个非常基本的 HAProxy 安装,以使用 HTTPS 监听安全端口 443 并利用几个后端 Web 服务器。它甚至会将所有到达预定义 URL(例如 /api/)的流量发送到不同的服务器或服务器池。

安装 HAProxy

首先,启动一个新的 CentOS 8 服务器或实例,并将系统更新到最新状态

sudo yum update -y

这通常需要一段时间运行。等待时给自己来杯咖啡。

此安装包含两个部分:第一部分安装 yum 版本的 HAProxy,第二部分从源代码编译并安装您的二进制文件,以使用最新版本覆盖之前的 HAProxy。使用 yum 安装在生成 systemd 启动脚本等方面做了很多繁重的工作,因此运行 yum install,然后通过从其源代码编译来使用最新版本覆盖 HAProxy 二进制文件

sudo yum install -y haproxy

启用 HAProxy 服务

sudo systemctl enable haproxy

要升级到最新版本(截至撰写本文时为 2.2 版本),请编译源代码。许多人认为从源代码编译和安装程序需要很高的技术能力,但这是一个非常简单的过程。首先使用 yum 安装一些提供代码编译工具的软件包

sudo yum install dnf-plugins-core
sudo yum config-manager --set-enabled PowerTools
# (Multiline command next 3 lines. Copy and paste together:) 

sudo yum install -y git ca-certificates gcc glibc-devel \
  lua-devel pcre-devel openssl-devel systemd-devel \
  make curl zlib-devel 

使用 git 获取最新源代码并更改到 haproxy 目录

git clone http://git.haproxy.org/git/ haproxy
cd haproxy

运行以下三个命令以构建和安装具有集成 Prometheus 支持的 HAProxy

# Multiline command next 3 lines copy and paste together: 
make TARGET=linux-glibc USE_LUA=1 USE_OPENSSL=1 USE_PCRE=1 \
PCREDIR= USE_ZLIB=1 USE_SYSTEMD=1 \ 
EXTRA_OBJS="contrib/prometheus-exporter/service-prometheus.o"

sudo make PREFIX=/usr install # Install to /usr/sbin/haproxy

通过查询版本进行测试

haproxy -v

您应该得到以下输出

HA-Proxy version 2.2.4-b16390-23 2020/10/09 - https://haproxy.org/

创建后端服务器

HAProxy 不直接服务任何流量——这是后端服务器的工作,后端服务器通常是 Web 或应用程序服务器。在本练习中,我使用一个名为 Ncat 的工具,它是网络的“瑞士军刀”,来创建一些非常简单的服务器。安装它

sudo yum install nc -y

如果您的系统启用了 SELinux,则需要启用端口 8404(用于访问 HAProxy 统计信息页面,如下所述)以及后端服务器的端口

sudo dnf install policycoreutils-python-utils
sudo semanage port -a -t http_port_t  -p tcp 8404
sudo semanage port -a -t http_port_t  -p tcp 10080;
sudo semanage port -a -t http_port_t  -p tcp 10081;
sudo semanage port -a -t http_port_t  -p tcp 10082;

创建两个 Ncat Web 服务器和一个 API 服务器

while true ;
do
nc -l -p 10080 -c 'echo -e "HTTP/1.1 200 OK\n\n This is Server ONE"' ;
done &

while true ;
do
nc -l -p 10081 -c 'echo -e "HTTP/1.1 200 OK\n\n This is Server TWO"' ;
done &

while true ;
do
nc -l -p 10082 -c 'echo -e "HTTP/1.1 200 OK\nContent-Type: application/json\n\n { \"Message\" :\"Hello, World!\" }"' ;
done &

这些简单的服务器打印出一条消息(例如“This is Server ONE”),并一直运行到服务器停止。在实际设置中,您将使用实际的 Web 和应用程序服务器。

修改 HAProxy 配置文件

HAProxy 的配置文件是 /etc/haproxy/haproxy.cfg。您可以在此处进行更改以定义您的负载均衡器。此基本配置将帮助您开始使用一个可工作的服务器

global
    log         127.0.0.1 local2
    user        haproxy
    group       haproxy

defaults 
    mode                    http
    log                     global
    option                  httplog

frontend main
    bind *:80
        
    default_backend web
    use_backend api if { path_beg -i /api/ }
    
    #-------------------------
    # SSL termination - HAProxy handles the encryption.
    #    To use it, put your PEM file in /etc/haproxy/certs  
    #    then edit and uncomment the bind line (75)
    #-------------------------
    # bind *:443 ssl crt /etc/haproxy/certs/haproxy.pem ssl-min-ver TLSv1.2
    # redirect scheme https if !{ ssl_fc }

#-----------------------------
# Enable stats at http://test.local:8404/stats
#-----------------------------

frontend stats
    bind *:8404
    stats enable
    stats uri /stats
#-----------------------------
# round robin balancing between the various backends
#-----------------------------

backend web
    server web1 127.0.0.1:10080 check
    server web2 127.0.0.1:10081 check

#-----------------------------

# API backend for serving up API content
#-----------------------------
backend api
    server api1 127.0.0.1:10082 check

重启和重新加载 HAProxy

HAProxy 可能尚未运行,因此请发出命令 sudo systemctl restart haproxy 以启动(或重启)它。restart 方法适用于非生产环境,但一旦您启动并运行,您就需要养成使用 sudo systemctl reload haproxy 的习惯,以避免服务中断,即使您的配置中存在错误。

例如,在您更改 /etc/haproxy/haproxy.cfg 后,您需要使用 sudo systemctl reload haproxy 重新加载守护程序以使更改生效。如果存在错误,它会通知您,但继续使用之前的配置运行。使用 sudo systemctl status haproxy 检查您的 HAProxy 状态。

如果它没有报告任何错误,则您有一个正在运行的服务器。通过在服务器上使用 curl 进行测试,在命令行中键入 curl http://localhost/。如果您看到“This is Server ONE”,则一切正常!运行几次 curl 并观察它在您的后端池中循环,然后查看当您键入 curl http://localhost/api/ 时会发生什么。在 URL 末尾添加 /api/ 会将所有流量发送到您池中的第三台服务器。此时,您应该有一个功能正常的负载均衡器!

检查您的统计信息

您可能已经注意到,该配置定义了一个名为 stats 的前端,它正在监听端口 8404

frontend stats
    bind *:8404
    stats uri /stats 
    stats enable

在您的浏览器中,加载 http://localhost:8404/stats。阅读 HAProxy 的博客“探索 HAProxy 统计信息页面”以了解您可以在此处执行的操作。

强大的负载均衡器

尽管我只介绍了 HAProxy 的几个功能,但您现在拥有一个服务器,该服务器监听端口 80 和 443,将 HTTP 流量重定向到 HTTPS,在多个后端服务器之间平衡流量,甚至将与特定 URL 模式匹配的流量发送到不同的后端服务器。您还解锁了非常强大的 HAProxy 统计信息页面,该页面为您提供了系统的全面概述。

这个练习可能看起来很简单,但请不要误会——您刚刚构建和配置了一个非常强大的负载均衡器,它能够处理大量的流量。

为了您的方便,我将本文中的所有命令都放在 GitHub Gist 中。

接下来阅读
User profile image.
Jim O'Connell 是 HAProxy Technologies (http://haproxy.com/) 的技术营销工程师,HAProxy Technologies 是世界上最快、使用最广泛的软件负载均衡器 HAProxy 背后的公司。自 Linux 的早期(那时通常从软盘安装)以来,他一直积极使用开源操作系统和软件。

评论已关闭。

© . All rights reserved.