HAProxy 3.4.0 RPM 打包工程
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 27 天前 |
HAProxy 3.4.0 RPM 打包工程 — 项目报告
生成日期:2026-06-10 | Git HEAD: 5726b08
1. 项目概况
1.1 基本信息
| 项目 | 值 |
|---|---|
| 项目名称 | HAProxy RPM 打包工程 |
| 打包版本 | HAProxy 3.4.0 |
| 打包平台 | openEuler 22.03 / 24.03 / 2503(EulerMaker) |
| 目标架构 | x86_64, aarch64 |
| 许可证 | GPL-2.0-or-later |
| 官方源码 | https://www.haproxy.org/download/3.4/src/haproxy-3.4.0.tar.gz |
| 提交总数 | 23 次 |
| 贡献者 | micoder(23 次) |
1.2 项目目标
将 HAProxy 3.4.0 官方源码打包为 RPM 格式,严格遵循 EulerMaker 平台 RPM 打包规范,支持 openEuler 系列操作系统,实现开箱即用的 HAProxy 负载均衡服务。
2. 工程目录结构
I:\haproxy/
│
├── build.sh # EulerMaker 一键构建脚本
├── haproxy.spec # RPM 打包规则文件(核心)
├── haproxy.cfg # HAProxy 生产级默认配置
├── haproxy.service # systemd 服务单元文件
├── haproxy.init # SysV init 兼容启动脚本(conf/ 中也有一份)
├── haproxy.logrotate # 日志轮转配置
├── haproxy.sysconfig # 系统环境变量配置
├── haproxy-3.4.0.tar.gz # 官方源码包(根目录副本)
├── LICENSE # GPL-2.0-or-later 许可证
├── README.md # 项目说明
├── patches/ # 补丁目录
│ └── README.md
├── sources/ # EulerMaker 源文件目录
│ ├── haproxy-3.4.0.tar.gz
│ ├── haproxy.service
│ ├── haproxy.cfg
│ ├── haproxy.logrotate
│ ├── haproxy.sysconfig
│ └── haproxy.rsyslog # rsyslog 日志转发配置
├── conf/ # 兼容脚本目录
│ └── haproxy.init
└── .atomcode/ # AtomCode 自动化配置
├── mcp.json
├── settings.json
├── commands/
│ └── build-rpm.md
└── skills/
├── rpm-packager/
├── haproxy-config-validator/
├── rpm-spec-reviewer/
└── security-reviewer/
3. 各文件详细说明
3.1 build.sh — 构建脚本
路径: I:\haproxy\build.sh
一键构建脚本,严格遵循 EulerMaker 规范。执行流程:
check_prereqs → clean_build → create_build_dirs → copy_sources
→ install_deps → build_rpm → copy_artifacts → clean_build
特性:
set -euo pipefail严格模式- 前置检查(确认 tarball 和 spec 存在)
- dnf/yum 双包管理器兼容
- 自动安装编译依赖(gcc, make, lua-devel, pcre2-devel, openssl-devel, libatomic, systemd-devel)
- 构建产物自动输出到
output/目录 - 支持 x86_64 / aarch64 双架构
3.2 haproxy.spec — RPM 打包规则
路径: I:\haproxy\haproxy.spec
| 段 | 内容 | 状态 |
|---|---|---|
Name |
haproxy | ✅ |
Version |
3.4.0 | ✅ |
License |
GPL-2.0-or-later | ✅ |
BuildArch |
x86_64 aarch64 | ✅ |
BuildRequires |
gcc, make, lua-devel, pcre2-devel, openssl-devel, libatomic, systemd-devel | ✅ |
Source0 |
haproxy-3.4.0.tar.gz | ✅ |
Source1-Source5 |
service, cfg, logrotate, sysconfig, rsyslog | ✅ |
%prep |
%setup -q -n haproxy-3.4.0 |
✅ |
%build |
USE_OPENSSL/P CRE2/LUA/THREAD/PROMEX/SLZ/TPROXY | ✅ |
%install |
二进制 + 工具集 + 配置 + 文档 | ✅ |
%pre |
haproxy 用户/组创建(幂等) | ✅ |
%post/%preun/%postun |
systemd 集成 | ✅ |
%files |
主包 + help 子包,%config(noreplace) |
✅ |
_hardened_build |
1(安全加固) | ✅ |
编译选项:
TARGET=linux-glibc
CPU=generic
USE_OPENSSL=1 USE_PCRE2=1 USE_SLZ=1 USE_LUA=1
USE_LINUX_TPROXY=1 USE_PROMEX=1 USE_THREAD=1
安装的文件:
- 二进制:
/usr/sbin/haproxy,/usr/bin/halog,/usr/bin/iprange,/usr/bin/ip6range - 配置:
/etc/haproxy/haproxy.cfg,/etc/logrotate.d/haproxy,/etc/sysconfig/haproxy,/etc/rsyslog.d/haproxy.conf - 服务:
/usr/lib/systemd/system/haproxy.service - 文档: man 手册 + 帮助文档
3.3 haproxy.cfg — HAProxy 配置
路径: I:\haproxy\haproxy.cfg
生产级默认配置,三个配置段:
global 段
log /dev/log local0 info
log /dev/log local1 warning
maxconn 8192
user haproxy
group haproxy
nbthread auto
cpu-map auto:1/1- 0-
daemon
stats socket /run/haproxy/admin.sock mode 660 level admin
ssl-default-bind-ciphers ECDHE-... (安全 cipher 套件)
ssl-default-bind-options ssl-min-ver TLSv1.2 (禁用 SSLv3/TLSv1.0/TLSv1.1)
defaults 段
mode http
option httplog / dontlognull / redispatch
timeout http-request 10s
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
maxconn 4096
listen stats 段
- 监控页面:
http://<IP>:8888/haproxy-stats - 认证:
admin:admin(生产环境请修改密码) - 特性:
hide-version,admin if LOCALHOST
3.4 haproxy.service — systemd 服务
路径: I:\haproxy\haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network.target
[Service]
Type=simple
EnvironmentFile=/etc/sysconfig/haproxy
ExecStart=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg $OPTIONS
ExecReload=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -sf $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
KillMode=mixed
User=haproxy
Group=haproxy
RuntimeDirectory=haproxy
RuntimeDirectoryMode=0755
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
3.5 其他配置文件
haproxy.init — SysV 兼容启动脚本
- 支持
start/stop/restart/reload/status - 兼容最小化系统(
daemon函数检测) - LOCKFILE 机制防止重复启动
- 存放位置:
conf/haproxy.init
haproxy.logrotate — 日志轮转
/var/log/haproxy/*.log {
daily
rotate 7
compress
delaycompress
create 0640 haproxy haproxy
postrotate
/usr/bin/systemctl reload haproxy > /dev/null 2>&1 || true
endscript
}
haproxy.sysconfig — 环境变量
# HAProxy 启动额外参数:
OPTIONS=""
haproxy.rsyslog — 日志转发(新增)
$template haproxy_raw,"%timegenerated:::date-rfc3164% ..."
local0.info /var/log/haproxy/haproxy.log;haproxy_raw
local1.warning /var/log/haproxy/haproxy.log;haproxy_raw
local0.none /var/log/messages
local1.none /var/log/messages
4. Git 提交历史
5726b08 修复:haproxy.cfg 日志与 nbproc 问题 + 新增 rsyslog 配置
71a327b EulerMaker 合规重构:HAProxy 3.4.0 RPM 打包工程
b406da6 update config
08766de update files
747b812 update files
7614c20 所有错误全部修复
feff83c update spec
ae71975 update files
ae8b79b update files
8f013f6 update files
15c933d 构建 0 错误 0 警告 | 启动 100% 成功 | 独立日志
66d9625 修复日志目录 /var/log/haproxy + logrotate
56a2b5c add files
b6bc2ee 修复 USE_SYSTEMD 警告 + 纯 systemd + 目录预创建
8b709cd 清理 init 残留,保留纯 systemd
b75fc72 修复 halog/iprange 存放目录
e9c596d update files
14290e6 update files
21a8a5f update spec
e49b56a update $version 变量
8c08e12 update files
6480304 合并 haproxy-v3.3 + haproxy-v3.4 资源
9b0e5e6 add files
228b676 no message
da1af0c update files
07652d0 add files
65bace5 Initial commit
关键里程碑
| 提交 | 说明 |
|---|---|
65bace5 |
初始提交 |
15c933d |
首次构建成功(0 错误 0 警告) |
71a327b |
EulerMaker 规范重构(目录结构 + build.sh 重写 + systemd-devel) |
5726b08 |
修复 log/nbproc 致命问题 + rsyslog 配置 |
5. 构建与部署
5.1 本地构建
# 前置条件:openEuler 环境
sudo dnf install -y gcc make lua-devel pcre2-devel openssl-devel \
libatomic systemd-devel rpm-build
# 一键构建
chmod +x build.sh
./build.sh
# 产物位置
ls output/
# haproxy-3.4.0-1.x86_64.rpm
# haproxy-help-3.4.0-1.noarch.rpm
# haproxy-3.4.0-1.src.rpm
5.2 安装与启动
# 安装
sudo rpm -ivh output/haproxy-3.4.0-1.x86_64.rpm
# 启动服务
sudo systemctl enable haproxy
sudo systemctl start haproxy
# 验证
haproxy -v
systemctl status haproxy
# 验证配置
haproxy -c -f /etc/haproxy/haproxy.cfg
# 热重载
systemctl reload haproxy
5.3 日志链路
HAProxy → /dev/log (local0/local1)
↓
rsyslog (haproxy.rsyslog 配置)
↓
/var/log/haproxy/haproxy.log
↓
logrotate (每日轮转,保留 7 天)
6. 技术架构
6.1 服务模型
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 用户请求 │────▶│ HAProxy │────▶│ 后端服务 │
└──────────────┘ │ (LB/Proxy) │ └──────────────┘
└──────┬───────┘
│
┌───────▼───────┐
│ Stats 页面 │
│ :8888/stats │
└───────────────┘
6.2 RPM 包构成
主包 haproxy:
- 二进制: haproxy, halog, iprange, ip6range
- 配置: haproxy.cfg, haproxy.service, logrotate, sysconfig, rsyslog.conf
- 数据: 错误页面示例
子包 haproxy-help:
- man 手册
- 文档: README, CHANGELOG, doc/, examples/
6.3 安全加固
| 措施 | 实现 |
|---|---|
| 编译加固 | _hardened_build 1 |
| 非 root 运行 | User=haproxy, user haproxy |
| Stats 认证 | stats auth admin:admin |
| 版本隐藏 | stats hide-version |
| 本地管理 | stats admin if LOCALHOST |
| SSL 安全 | 仅 TLSv1.2+, 安全 cipher 套件 |
| 日志隔离 | 独立日志文件,rsyslog 分离 |
7. 已知限制与未来改进
当前限制
| 限制 | 说明 |
|---|---|
| 无 Docker 支持 | 当前为 RPM 包,如有容器化需求需额外配置 |
| SysV init 未打包 | init 脚本仅保留在 conf/ 目录,未包含在 RPM 中(纯 systemd) |
| SSL 演示证书 | 未提供演示 SSL 证书,需用户自行生成 |
建议改进
| 改进项 | 优先级 | 说明 |
|---|---|---|
| 集成 systemd 安全沙箱 | 中 | 添加 ProtectSystem=full, PrivateTmp=true 等 |
| 自动化测试 | 中 | 添加构建后的冒烟测试脚本 |
| LUA 脚本支持 | 低 | 添加 HAProxy LUA 脚本示例 |
| Prometheus 集成 | 低 | 利用 USE_PROMEX=1 配置 Prometheus endpoint |
8. AtomCode 自动化配置
项目已集成 AtomCode 开发辅助工具链:
| 类型 | 名称 | 用途 |
|---|---|---|
| Skill | rpm-packager |
RPM 打包工作流(/rpm-verify, /rpm-bump, /rpm-checklist) |
| Skill | haproxy-config-validator |
HAProxy 配置语法检查 |
| Subagent | rpm-spec-reviewer |
spec 文件合规审查 |
| Subagent | security-reviewer |
安全配置审查 |
| Command | /build-rpm |
一键 RPM 构建 |
| MCP | context7 |
实时文档查询 |
| Hook | PostToolUse |
编辑 cfg 后自动验证 |
| Hook | PreToolUse |
编辑 spec 前提醒规范 |
9. 合规性检查清单
EulerMaker 平台必过项
| 检查项 | 状态 | 备注 |
|---|---|---|
工程根目录有 build.sh |
✅ | set -euo pipefail |
工程根目录有 haproxy.spec |
✅ | 包含完整 %files/%pre/%post |
工程根目录有 LICENSE |
✅ | GPL-2.0-or-later |
sources/ 目录存在 |
✅ | 含 tarball + 配置文件 |
conf/ 目录存在 |
✅ | 含 init 脚本(兼容用) |
patches/ 目录存在 |
✅ | 含 README 说明 |
| 无绝对路径硬编码 | ✅ | 使用 %{_xxx} 宏 |
| 目录权限合规(755/644) | ✅ | |
%config(noreplace) 已使用 |
✅ | |
| 架构支持 x86_64 + aarch64 | ✅ | |
| 安全编译已开启 | ✅ | _hardened_build 1 |
10. 附录
附录 A: 快速命令速查
| 操作 | 命令 |
|---|---|
| 构建 RPM | ./build.sh |
| 安装 RPM | sudo rpm -ivh haproxy-3.4.0-1.x86_64.rpm |
| 启动服务 | sudo systemctl start haproxy |
| 查看状态 | systemctl status haproxy |
| 验证配置 | haproxy -c -f /etc/haproxy/haproxy.cfg |
| 热重载 | systemctl reload haproxy |
| 查看版本 | haproxy -v |
| 查看日志 | tail -f /var/log/haproxy/haproxy.log |
附录 B: RPM 包文件清单
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
/etc/rsyslog.d/haproxy.conf
/usr/lib/systemd/system/haproxy.service
/usr/sbin/haproxy
/usr/bin/halog
/usr/bin/iprange
/usr/bin/ip6range
/var/lib/haproxy/
/var/log/haproxy/
/usr/share/haproxy/ (错误页面示例)
/usr/share/man/man1/haproxy.1
附录 C: AtomCode 使用指南
# 在 AtomCode 中执行
/rpm-verify # 验证 haproxy.spec
/haproxy-config-validator # 验证 haproxy.cfg
/build-rpm # 一键构建
# 或直接提问:
"帮我升级到 3.5.0 版本"
"检查 spec 文件是否有问题"
"给我生成一份项目报告"
报告由 AtomCode (deepseek-v4-flash) 自动生成