在这篇文章中,我将通过设置一个非常基本的 HAProxy 环境,使用 HTTPS 来监听安全端口 443,并利用几个后端 Web 服务器。它甚至会将所有进入预定义 URL(如 /api/)的流量发送到不同的服务器或服务器池。

不是只有在一个大型公司工作才需要使用负载平衡器。你可能是一个业余爱好者,用几台树莓派电脑自我托管一个网站。也许你是一个小企业的服务器管理员;也许你确实在一家大公司工作。无论你的情况如何,你都可以使用 ​​HAProxy​​ 负载平衡器来管理你的流量。

HAProxy 被称为“世界上最快和使用最广泛的软件负载平衡器”。它包含了许多可以使你的应用程序更加安全可靠的功能,包括内置的速率限制、异常检测、连接排队、健康检查以及详细的日志和指标。学习本教程中所涉及的基本技能和概念,将有助于你使用 HAProxy 建立一个更强大的、远为强大的基础设施。

为什么需要一个负载平衡器?

负载平衡器是一种在几个网络或应用服务器之间轻松分配连接的方法。事实上,HAProxy 可以平衡任何类型的传输控制协议(​​TCP​​)流量,包括 RDP、FTP、WebSockets 或数据库连接。分散负载的能力意味着你不需要因为你的网站流量比谷歌大就购买一个拥有几十万 G 内存的大型网络服务器。

负载平衡器还为你提供了灵活性。也许你现有的网络服务器不够强大,无法满足一年中繁忙时期的峰值需求,你想增加一个,但只是暂时的。也许你想增加一些冗余,以防一个服务器出现故障。有了 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
$ 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:

$ 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 # 安装到 /usr/sbin/haproxy

通过查询版本来测试它:

$ haproxy -v

你应该看到以下输出:

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

创建后端服务器

HAProxy 并不直接提供任何流量,这是后端服务器的工作,它们通常是网络或应用服务器。在这个练习中,我使用一个叫做 ​​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 网络服务器和一个 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”),并运行到服务器停止为止。在现实环境中,你会使用实际的网络和应用程序服务器。

修改 HAProxy 的配置文件

HAProxy 的配置文件是 ​​/etc/haproxy/haproxy.cfg​​。你在这里进行修改以定义你的负载平衡器。这个 ​​基本配置​​ 将让你从一个工作的服务器开始:

globallog         127.0.0.1 local2user        haproxygroup       haproxydefaults mode                    httplog                     globaloption                  httplogfrontend mainbind *:80default_backend webuse_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 statsbind *:8404stats enablestats uri /stats
#-----------------------------
# round robin balancing between the various backends
#-----------------------------backend webserver web1 127.0.0.1:10080 checkserver web2 127.0.0.1:10081 check#-----------------------------# API backend for serving up API content
#-----------------------------
backend apiserver api1 127.0.0.1:10082 check

重启并重新加载 HAProxy

HAProxy 可能还没有运行,所以发出命令 ​​sudo systemctl restart haproxy​​ 来启动(或重新启动)它。“重启” 的方法在非生产情况下是很好的,但是一旦你开始运行,你要养成使用 ​​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 statsbind *:8404stats uri /statsstats enable

在你的浏览器中,加载 ​​http://localhost:8404/stats​​。阅读 HAProxy 的博客 ​​学习 HAProxy 的统计页面​​,了解你在这里可以做什么。

一个强大的负载平衡器

虽然我只介绍了 HAProxy 的几个功能,但你现在有了一个服务器,它可以监听 80 和 443 端口,将 HTTP 流量重定向到 HTTPS,在几个后端服务器之间平衡流量,甚至将匹配特定 URL 模式的流量发送到不同的后端服务器。你还解锁了非常强大的 HAProxy 统计页面,让你对你的系统有一个很好的概览。

这个练习可能看起来很简单,不要搞错了,你刚刚建立和配置了一个非常强大的负载均衡器,能够处理大量的流量。

为了你方便,我把本文中的所有命令放在了 ​​GitHub Gist​​ 中。

用 HAProxy 实现网络流量的负载平衡相关推荐

  1. Cilium架构:提供并透明地保护应用程序工作负载之间的网络连接和负载平衡

    Table of Contents 数据路径 端点到端点 从端点出站 进入端点 基于veth与基于ipvlan的数据路径 规模 BPF映射限制 Kubernetes集成 参考阅读 本文档介绍了Cili ...

  2. Cilium提供并透明地保护应用程序工作负载之间的网络连接和负载平衡:什么是eBPF和XDP?

    Table of Contents 稳定的发行 功能概述 透明地保护和保护API 基于身份的服务到服务通信的安全保护 安全访问外部服务 简单联网 负载均衡 监控和故障排除 整合方式 入门 什么是eBP ...

  3. ISA SERVER 2004之配置网络负载平衡(NLB)

    在这次实验中,将通过对ISAServer2004企业版进行配置,以使用NLB功能来达到对外访问的负载. 在这次实验中,使用了四台计算机,分别是Denver-Florence-Firenze–Istan ...

  4. nginx配置 负载均衡_如何配置NGINX负载平衡

    nginx配置 负载均衡 The load balancing is the process of distributing traffic to multiple instances of an a ...

  5. Ngnix的TCP和UDP负载平衡配置

    Ngnix的TCP和UDP负载平衡配置 本章介绍如何使用NGINX Plus和NGINX开源来代理和负载均衡TCP和UDP流量. 介绍 先决条件 配置反向代理 配置TCP或UDP负载平衡 配置健康检查 ...

  6. haproxy1.7 mysql_Haproxy mysql故障转移负载平衡

    我已经设置了 mysql master-master复制,现在我正在尝试使用Haproxy来平衡mysql服务器. >负载均衡器:192.168.1.5 > mysql1:192.168. ...

  7. Windows Server 笔记之网络负载平衡(NLB)和服务质量(QoS)简介

    Windows Server 2008 中的网络负载平衡 (NLB) 功能可以增强 Internet 服务器应用程 序(如在 Web.FTP.防火墙.代理.虚拟专用网络 (VPN) 以及其他执行关键任 ...

  8. Windows 2003下网络负载平衡(负载均衡)的配置

    网络负载平衡(网络负载均衡.NLB.集群)概述 首先,我们先了解下 Windows 2003 自带的 负载平衡(负载均衡)-- Network Load Balancing,简称NLB.NLB是一种集 ...

  9. Windows Server 2008 R2/2012 网络负载平衡NLB相关内容

    使用网络负载均衡技术可以实现一些应用程序的可用性和可伸缩性,常用的应用程序有:IIS.防火墙.***以及一些关键业务.每一个节点运行应用程序的一个副本.NLB在群集中的多个主机中分发传入的客户端请求. ...

最新文章

  1. UVa573 The Snail
  2. C/C++之动态分配内存
  3. 云炬Android开发教程 查看android studio版本
  4. 利用Python实现数据偏移
  5. 职场中神奇的程序员,却常常被人说“太直”,这是什么样的思维?
  6. matplotlib.text.Text
  7. vj p1041神风堂人数 题解
  8. epoch训练时间不同_给训练踩踩油门——Pytorch加速数据读取
  9. python opencv双目测距_OpenCV实现双目测距
  10. (十三)中介者模式详解(玄幻版) - 转
  11. 北京邮电大学计算机考研经验分享
  12. 计算机重装系统后无法重启,u盘安装系统之后重启电脑没反应怎么办
  13. tensorflow构建神经网络回归分析可视化
  14. java如何画五角星_Java——绘制五角星
  15. MOXA NPort5630串口设备联网服务器
  16. eclipse 提示destination folder must be accessible
  17. STM32中断优先级彻底讲解
  18. 主板2个M. 2接口,哪个m2插槽是与CPU直连?总结不得不说PCIE知识
  19. 30套免费的响应式 HTML5 CSS3 模板下载
  20. Adobe Flash Builder 4

热门文章

  1. 人生和算法结合起来,你会不会比现在混得好?看完我明白了!
  2. 操作系统学习:Linux0.12初始化详细流程-进程1调度与读取硬盘数据
  3. Scrapy框架items数据建模、翻页请求、requests对象请求、meta参数的使用
  4. 正则表达式匹配分组(|、(ab)、\num、(?P<name>)(?P=name))
  5. 基于OpenCV Haar实战级联分类器的使用
  6. 掌贝获2000万美元B+轮融资,和智投资领投、味千中国和金沙江创投跟投
  7. centos7.2安装mysql
  8. STL中的map、unordered_map、hash_map
  9. 利用json模块解析dict报错找不到attribute 'dumps'[python2.7]
  10. IE6 IE7 不支持 JSON