Rocky8 源码安装 HAProxy

HAProxy 是一款开源的高性能 负载均衡器 和 反向代理 软件,专注于处理高并发流量分发,广泛应用于企业级架构中提升服务的可用性、扩展性和安全性。

一、HAProxy 简介

1.1.HAProxy 是什么?

  • 本质
    • 基于 C 语言开发 的轻量级工具,支持四层(TCP/UDP)和七层(HTTP/HTTPS)流量代理。
    • 通过 单线程事件驱动模型(Event-Driven)实现高吞吐量,单实例可处理 数百万并发连接
    • 全球知名案例:GitHub、Stack Overflow、Twitter 等均依赖 HAProxy 支撑高流量。
  • 核心能力
    • 流量分发:将客户端请求智能分发到多台后端服务器,避免单点过载。
    • 健康检查:实时监控后端服务器状态,自动剔除故障节点。
    • 安全防护:支持 SSL 终止、IP 黑名单、DDoS 防御等。
    • 协议优化:HTTP/2、WebSocket、gRPC 等现代协议支持。

1.2.HAProxy 的核心用途

  • 1. 负载均衡(Load Balancing)
    • 场景:多台服务器共同承载业务时,HAProxy 按策略分配请求。
    • 算法
      • 轮询(Round Robin):均匀分配请求。
      • 加权轮询(Weighted Round Robin):根据服务器性能分配权重。
      • 最少连接(Least Connections):优先选择负载最轻的服务器。
      • 源 IP 哈希(Source IP Hash):确保同一客户端始终访问同一后端。
  • 2. 反向代理(Reverse Proxy)
    • 功能
      • 隐藏后端服务器真实 IP,提升安全性。
      • 缓存静态内容,减少后端负载。
      • 支持 SSL 终止(解密 HTTPS 流量后转发明文到后端)。
    • 企业案例:对外暴露单一入口,内部路由多个微服务。
  • 3. 高可用(High Availability)
    • 方案:通过 Keepalived 或 VRRP 实现 HAProxy 主备集群。
    • 故障切换:主节点宕机时,备节点自动接管 VIP(虚拟 IP)。
  • 4. 流量控制与安全
    • 速率限制:防御 CC 攻击,限制单个 IP 的请求频率。
    • ACL 规则:基于 URL、Header、IP 等条件过滤非法请求。
    • 日志审计:记录详细访问日志,支持 SIEM 分析。

二、编译安装 HAProxy

  • 企业版 vs 社区版

    • 企业版:提供商业支持及高级功能(如WAF、高级监控)

    • 社区版:开源版本,功能完善,适合大多数场景

企业版:HAProxy Technologies | World's Fastest Load Balancer

社区版:HAProxy - The Reliable, High Perf. TCP/HTTP Load Balancer

github:HAProxy · GitHub

2.1.下载源码安装包

编译安装HAProxy 2.0 LTS版本,更多源码包下载地址:http://www.haproxy.org/download/

 源码下载指定版本,上图选择下载的版本,右键复制链接,在 Linux 里用 wget 下载

wget https://www.haproxy.org/download/3.0/src/haproxy-3.0.8.tar.gz

 

2.2.校验文件完整性

对比官网提供的校验值,对比上图的 haproxy-3.0.8.tar.gz.sha256 里面的数值

[root@Rocky-1 ~]# sha256sum haproxy-3.0.8.tar.gz   
930ae2c33058e1f497fe62cdaacffab6cab6a91e31ba011a9a2f9fe6c5c4aebc  haproxy-3.0.8.tar.gz

 

2.3.解压安装包

解压安装包到 /etc/local/src/ 目录下

tar xf haproxy-3.0.8.tar.gz -C /usr/local/src/

 

2.4.布置安装所需环境

解压到指定目录后,进入此目录,可以看到有 INSTALL 官方提供的文档,文档里有安装 HAProxy 所需的环境需求,参考文档,布置好所需的环境,继续完成  HAProxy 的安装

cd /usr/local/src/haproxy-3.0.8/

ls
addons  BRANCHES     CHANGELOG     dev  examples  INSTALL  MAINTAINERS  README     scripts  SUBVERS  VERDATE
admin   BSDmakefile  CONTRIBUTING  doc  include   LICENSE  Makefile     reg-tests  src      tests    VERSION

more INSTALL 

 

Build environment 环境 

查看 INSTALL 文档可以看到,安装环境所需要 make 版本需要 >=3.80,GCC 版本需要 >=4.2

查看 Linux yum 源的 make 和 GCC 软件版本是否符合要求,符合要求就直接用 yum 下载即可,如不符合要求,需要源码下载所需要的软件版本,以供安装 HAProxy 做准备

yum list make
yum list gcc

可以看到 make 和 GCC 软件是满足版本需求的,可以直接使用 yum 安装这两个软件

yum install -y gcc make openssl-devel pcre-devel systemd-devel

gcc是GNU编译器集合,用于编译C代码,HAProxy是用C写的,所以必须有编译器。make是自动化构建工具,根据Makefile来执行编译步骤。openssl-devel提供了SSL/TLS支持,HAProxy如果需要处理HTTPS,就需要这个库。pcre-devel是Perl兼容正则表达式库,HAProxy的ACL和路由规则可能用到正则表达式,所以需要这个。systemd-devel则是为了生成systemd的服务文件,这样用户可以用systemctl管理HAProxy服务。 

 以下是每个软件包对安装编译 HAProxy 软件的具体作用:

gcc(GNU Compiler Collection)

  • 作用:
    • HAProxy 是用 C 语言编写的程序,gcc 是 C 语言的编译器,用于将 HAProxy 的源代码编译成可执行的二进制文件。
  • 必要性:
    • 没有 gcc 则无法完成源码编译,类似于“没有工具就无法组装机器”。

make

  • 作用:
    • 自动化构建工具,根据 Makefile 文件中的规则执行编译步骤(如调用 gcc 编译源码、链接库文件、生成二进制文件等)。
  • 示例:
    • 在 HAProxy 源码目录中运行 make 时,会按照预定义的规则完成编译流程。

openssl-devel

  • 作用:
    • 提供 OpenSSL 开发库(头文件和静态库),支持 HAProxy 的 SSL/TLS 功能(如 HTTPS 代理、SSL 证书管理)。
  • 对 HAProxy 的影响:
    • 如果未安装此包,HAProxy 将无法启用 USE_OPENSSL=1 功能,导致以下功能缺失:
    • 无法处理 HTTPS 流量(SSL 终止或透传)。
    • 无法支持 HTTP/2、gRPC 等依赖 TLS 的协议。

pcre-devel

  • 作用:
    • 提供 Perl 兼容正则表达式(PCRE)开发库,用于 HAProxy 的 ACL 规则(如基于 URL 路径、请求头的路由匹配)。
  • 对 HAProxy 的影响:
    • 若未安装此包,HAProxy 将无法启用 USE_PCRE=1,导致以下问题:
    • 无法使用正则表达式匹配请求内容(如 acl is_api path_reg ^/api/)。
    • 动态路由、重写规则等功能受限。

systemd-devel

  • 作用:
    • 提供 systemd 服务管理支持,用于生成 HAProxy 的 systemd 服务文件(如 /usr/lib/systemd/system/haproxy.service)。
  • 对 HAProxy 的影响:
    • 如果未安装此包,HAProxy 编译时无法集成 systemd 支持(USE_SYSTEMD=1),导致:
    • 需手动编写服务文件。
    • 无法通过 systemctl 管理服务(如 systemctl start haproxy)。

解决 Lua 环境

HAProxy 支持基于lua实现功能扩展,lua是一种小巧的脚本语言,于1993年由巴西里约热内卢天主教大 学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组开发,其设计目的是为了嵌入 应用程序中,从而为应用程序提供灵活的扩展和定制功能。

  • 作用:HAProxy通过Lua脚本实现动态扩展(如自定义认证、请求改写)
  • 版本要求:≥5.3(CentOS7默认Lua 5.1不兼容)

Lua 是一种由 HAProxy 支持的嵌入式编程语言,旨在提供更高级的脚本编写能力。下图可知: Lua 仅支持版本 5.3 及更高版本。

查看 yum 源 Lua 版本

yum list lua

可以看到 yum 源的 Lua 版本是 5.3.4 满足 HAProxy 支持版本 5.3 及更高版本的需求,但是接下来我还是选择使用源码安装 Lua 的方式安装 Lua 的 5.4.7 版本,更高的版本有以下优势:

  • 获取最新功能:使用Lua的最新特性,提升脚本的功能和效率。
  • 性能优化:新版本可能运行更快,资源使用更高效。
  • 安全性:修复已知漏洞,增强安全性。
  • 自定义配置:根据需求调整编译选项,优化安装。
  • 满足软件依赖:确保 HAProxy 可以使用所需的 Lua 版本。

Lua 官网:www.lua.org

参考安装链接:Lua: download

根据官网文档,下载 Lua 5.4.7 版本,下载步骤如上图

根据上面的 HAProxy INSTALL 文档,把 Lua 安装到 /opt/ 目录下,进入 /opt/lua-5.4.7/ 编译

curl -L -R -O https://www.lua.org/ftp/lua-5.4.7.tar.gz
tar xf lua-5.4.7.tar.gz -C /opt/
cd /opt/lua-5.4.7/
make all list

查看编译安装的 Lua 版本

ln -s /opt/lua-5.4.7/src/lua /usr/sbin/
lua -v
Lua 5.4.7  Copyright (C) 1994-2024 Lua.org, PUC-Rio

 

2.5.编译安装 HAProxy

以上步骤把编译安装 HAProxy 的环境准备就绪了,接下来进入解压 HAProxy 的目录 /usr/local/src/haproxy-3.0.8 编译

cd /usr/local/src/haproxy-3.0.8/
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USR_SYSTEMD=1 USE_LUA=1 LUA_INC=/opt/lua-5.4.7/src LUA_LIB=/opt/lua-5.4.7/src

以下是 make 参数的相关解释 

make ARCH=x86_64 TARGET=linux-glibc \
  USE_PCRE=1       \  # 启用PCRE正则库
  USE_OPENSSL=1    \  # 启用SSL加密
  USE_ZLIB=1       \  # 支持响应压缩
  USE_SYSTEMD=1    \  # 集成systemd支持
  USE_LUA=1        \  # 启用Lua扩展
  LUA_INC=/opt/lua-5.4.7/src  \  # Lua头文件路径
  LUA_LIB=/opt/lua-5.4.7/src   # Lua库路径

自定义 HAProxy 的安装路径

make install PREFIX=/apps/haproxy   # 自定义安装路径
tree /apps/haproxy

以下是 tree /apps/haproxy 的目录结构

/apps/haproxy
├── doc
│   └── haproxy
│       ├── 51Degrees-device-detection.txt
│       ├── architecture.txt
│       ├── configuration.txt
│       ├── cookie-options.txt
│       ├── DeviceAtlas-device-detection.txt
│       ├── intro.txt
│       ├── linux-syn-cookies.txt
│       ├── lua.txt
│       ├── management.txt
│       ├── netscaler-client-ip-insertion-protocol.txt
│       ├── network-namespaces.txt
│       ├── peers.txt
│       ├── peers-v2.0.txt
│       ├── proxy-protocol.txt
│       ├── regression-testing.txt
│       ├── seamless_reload.txt
│       ├── SOCKS4.protocol.txt
│       ├── SPOE.txt
│       └── WURFL-device-detection.txt
├── sbin
│   └── haproxy
└── share
    └── man
        └── man1
            └── haproxy.1

创建软连接为了在系统的标准命令搜索路径中能够更方便地访问 /apps/haproxy/sbin/haproxy 这个文件

ln -s /apps/haproxy/sbin/haproxy /usr/sbin/
which haproxy   # 验证路径:/usr/sbin/haproxy

 

 三、系统服务配置

3.1.创建服务运行时需要的目录

创建配置文件

在 /etc/haproxy/ 目录下创建 haproxy.cfg 配置文件

vim /etc/haproxy/haproxy.cfg
global
	maxconn 100000            # 最大并发连接数
	chroot /apps/haproxy      # 安全隔离目录
	stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin    # 管理接口
	user haproxy              # 运行用户
	group haproxy             # 运行用户组
	daemon                    # 后台模式
	pidfile /var/lib/haproxy/haproxy.pid
	log 127.0.0.1 local2 info    # 日志发送到本地syslog

defaults
	option http-keep-alive    # 保持长连接
	option forwardfor         # 传递客户端真实IP
	maxconn 100000
	mode http                 # 默认七层代理模式
	timeout connect 300000ms  # 后端连接超时
	timeout client 300000ms   # 客户端空闲超时
	timeout server 300000ms   # 服务端响应超时

listen stats
	mode http
	bind 0.0.0.0:9999         # 监控页面端口
	stats enable
	log global
	stats uri /haproxy        # 访问路径
	stats auth haproxy:123456 # 登录凭证

创建存放 pid 文件的目录和 haproxy 用户

mkdir /var/lib/haproxy
useradd -r -s /sbin/nologin -d /var/lib/haproxy haproxy

3.2.创建 systemd 服务文件

在 /usr/lib/systemd/system/ 目录下创建 haproxy.service 系统服务启动脚本,以便我们用源码安装的 HAProxy 软件能用 systemctl 以系统服务的方式启动。内容如下:

cat > /usr/lib/systemd/system/haproxy.service <<EOF
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q  # 配置预检
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID  # 优雅重载(不断开连接)
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

3.3.启动服务

重新加载系统服务配置信息,再用 systemctl 系统服务的方式启动 HAProxy 服务

systemctl daemon-reload
systemctl start haproxy
systemctl status haproxy

根据  /etc/haproxy/haproxy.cfg 配置文件里配置的监控页面端口、访问路径、登录凭证,可以通过浏览器访问到(IP:控制页面端口/访问路径)然后输入登录凭证设置的用户名和密码即可登录查看 HAProxy 软件的监控页面,如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/977256.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…

微信小程序调用火山方舟(字节跳动火山引擎)中的DeepSeek大模型

一、注册火山引擎账号&#xff0c;创建API Key和model&#xff08;接入点ID&#xff09; 1.注册并登陆火山引擎账号&#xff0c;网址为&#xff1a;https://console.volcengine.com/ 2.根据登陆后的页面提示进行实名认证&#xff0c;实名认证后才能创建API Keyt和创建接入点。…

Spring Boot 应用(官网文档解读)

Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候&#xff0c;我们通常可以看到上面的内容&#xff0c;即 APPLICATION FAILED TO START&#xff0c;以及后面的错误描述。这个功能是通过…

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析&#xff1a;HAL_GPIO_Init 前言 我们终于到达了熟悉的地方&#xff0c;对GPIO的初始化。经过漫长的铺垫&#xff0c;我们终于历经千辛万苦&#xff0c;来到了这里。关于GPIO的八种模式等更加详细的细节&#xff0c;由于只是点个灯&am…

【JavaWeb学习Day19】

Tlias智能学习系统&#xff08;员工管理&#xff09; 删除员工&#xff1a; 需求分析&#xff1a; 其实&#xff0c;删除单条数据也是一种特殊的批量删除&#xff0c;所以&#xff0c;删除员工的功能&#xff0c;我们只需要开发一个接口就行了。 三层架构&#xff1a; Cont…

Windows 上源码安装 FastGPT

FastGPT 是一个强大的 AI RAG 平台&#xff0c;值得我们去学习了解。与常见的 Python 体系不同&#xff0c;Fast GPT 采用 Node.js/Next.js 平台&#xff08;对于广大 JS 开发者或前端开发者比较亲切友好&#xff09;&#xff0c;安装或部署比较简单。虽然一般情况下推荐简单的…

FreiHAND (handposeX-json 格式)数据集-release >> DataBall

FreiHAND &#xff08;handposeX-json 格式&#xff09;数据集-release 注意&#xff1a; 1)为了方便使用&#xff0c;按照 handposeX json 自定义格式存储 2)使用常见依赖库进行调用,降低数据集使用难度。 3)部分数据集获取请加入&#xff1a;DataBall-X数据球(free) 4)完…

Sinusoidal、RoPE和可学习嵌入的详细介绍及它们增强位置感知能力的示例

前文,我们已经构建了一个小型的字符级语言模型,是在transformer架构基础上实现的最基本的模型,我们肯定是希望对该模型进行改进和完善的。所以我们的另外一篇文章也从数据预处理、模型架构、训练策略、评估方法、代码结构、错误处理、性能优化等多个方面提出具体的改进点,但…

【JavaEE进阶】Spring Boot配置文件

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 SpringBoot配置⽂件 举例: 通过配置文件修改端口号 配置⽂件的格式 properties基本语法 读取配置⽂件 properties配置文件的缺点 yml配置⽂件 yml基本语法 yml和proper…

BUUCTF--[极客大挑战 2019]RCE ME

目录 URL编码取反绕过 异或绕过 异或的代码 flag 借助蚁剑中的插件进行绕过 利用动态链接库 编写恶意c语言代码 进行编译 然后再写一个php文件 将这两个文件上传到/var/tmp下 运行payload 直接看代码 <?php error_reporting(0); if(isset($_GET[code])){$code$_G…

Tag标签的使用

一个非常适合运用在vue项目中的组件&#xff1a;Tag标签。 目录 一、准备工作 1、安装element-plus库 2、配置element-plus库 二、Tag标签入门 1、打开element官网&#xff0c;搜索tag标签 2、体验Tag标签的基础用法 三、Tag标签进阶训练1 1、定义一个数组&#xff0c;…

学习threejs,使用createMultiMaterialObject创建多材质对象

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.SceneUtils 场景操控…

[C++]使用纯opencv部署yolov12目标检测onnx模型

yolov12官方框架&#xff1a;sunsmarterjie/yolov12 【算法介绍】 在C中使用纯OpenCV部署YOLOv12进行目标检测是一项具有挑战性的任务&#xff0c;因为YOLOv12通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff…

MQ(Message Queue)

目录 MQ(Message Queue)基本概念 为什么要使用消息队列&#xff1f; 使用消息队列有什么缺点&#xff1f; 如何保证消息不丢失?(如何保证消息的可靠性传输?/如何处理消息丢失的问题?) 通用的MQ场景&#xff1a; RabbitMQ如何保证消息不丢失&#xff1f; 生产者丢数据…

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…

项目实战--网页五子棋(匹配模块)(4)

上期我们完成了游戏大厅的前端部分内容&#xff0c;今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后&#xff0c;我们可以维护好用户的websocket会话&#xff0c;把用户表示为在线状态&#xff0c;方便获取到用户的websocket会话 package org.ting.j20250110_g…

浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器

1、谷歌浏览器下载&#xff1a; 情况一&#xff1a;如果谷歌应用商店可以打开&#xff0c;那么就直接到谷歌应用商店下载&#xff0c;直接搜索vue.js.devtools添加扩展即可。 情况二&#xff1a;谷歌浏览器的谷歌应用商城打不开&#xff0c;那么就百度搜索极简插件找到vue.js.…

基于TensorFlow.js与Web Worker的智能证件照生成方案

功能简介 本文基于TensorFlow.js与Web Worker实现了常用的“证件照”功能&#xff0c;可以对照片实现抠图并替换背景。值得一提的是&#xff0c;正常抠图的操作应该由后端进行&#xff0c;这里只是主要演示该功能实现步骤&#xff0c;并不建议该功能由前端全权处理。 限于个人技…

3D模型在线转换工具:轻松实现3DM转OBJ

3D模型在线转换是一款功能强大的在线工具&#xff0c;支持多种3D模型格式的在线预览和互转。无论是工业设计、建筑设计&#xff0c;还是数字艺术领域&#xff0c;这款工具都能满足您的需求。 3DM与OBJ格式简介 3DM格式&#xff1a;3DM是一种广泛应用于三维建模的文件格式&…

GEO数据结构

目录 1. GEOADD 2. GEODIST 3. GEOHASH 3. GEOHASH 4. GEOPOS 6. GEOSEARCH 7. GEOSEARCHSTORE 应用场景 代码的逻辑分解&#xff1a; 比较难懂的部分&#xff1a; Redis GEO 查询与分页 results 的结构&#xff1a; 分页处理与截取数据 附加距离信息 1. GEOADD…