您不必在一家大型公司工作才能证明使用负载均衡器的合理性。您可能是一位爱好者,使用几台 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 中。
评论已关闭。