在 CentOS 7.5(内核 3.10)上使用 HAProxy 1.8.13 时,常见haproxy.service holdoff time over, scheduling restart重启循环问题,需正确配置 systemd 服务文件并启用USE_SYSTEMD=1编译选项。
原因分析
根据 2018 年 8 月 15 日的实际案例,用户在 CentOS 7.5(64 位,内核 3.10)上部署 HAProxy 1.8.13 时,即使配置文件验证通过(haproxy -f /etc/haproxy/haproxy.conf -c返回Configuration file is valid),systemd 仍会持续重启服务。通过journalctl -u haproxy.service查看日志,发现典型错误:haproxy.service holdoff time over, scheduling restart。这通常是因为 HAProxy 编译时未启用 systemd 支持,或 service 文件配置不当导致进程无法正确守护。
解决方案
1. 编译安装时启用 systemd 支持
根据 2023 年 8 月 12 日的部署记录,编译 HAProxy 2.8.1 时必须添加USE_SYSTEMD=1参数:
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/lua-5.4.4/src/ LUA_LIB=/usr/local/lua-5.4.4/src/
TARGET 参数需根据内核版本指定,CentOS 7.x 内核 3.10 应使用TARGET=linux2628或TARGET=linux31(2022 年 7 月 13 日资料)。
2. 创建 systemd 服务文件
根据 2019 年 7 月 26 日的教程,在/usr/lib/systemd/system/下创建haproxy.service文件。注意:有用户反馈直接在/usr/lib/systemd/system/新建可能不生效,建议复制到/etc/systemd/system/目录。
3. 配置正确的启动参数
根据 2020 年 12 月 23 日的资料,以 daemon 模式启动需使用:
haproxy -D -f /etc/haproxy/haproxy.cfg [-p /var/run/haproxy.pid]
或使用 systemd 管理的 daemon 模式:
haproxy -Ds -f /etc/haproxy/haproxy.cfg [-p /var/run/haproxy.pid]
4. 验证服务状态
启动后使用以下命令验证(2024 年 11 月 5 日资料):
systemctl start haproxy
systemctl status haproxy
haproxy -v # 返回版本号即为安装成功
注意事项
1. **PID 文件路径**:确保/var/run/haproxy.pid目录存在且有写入权限,否则会导致启动失败(2018 年 8 月 15 日案例)。
2. **配置文件验证**:启动前务必执行haproxy -c -f /etc/haproxy/haproxy.cfg检查语法,但注意即使验证通过也可能因权限问题无法启动。
3. **端口权限**:如果 HAProxy 需要监听 1024 以下端口,必须以 root 用户启动(2024 年 9 月 12 日资料)。
4. **防火墙配置**:CentOS 7 需关闭 firewalld 或开放相应端口,执行systemctl stop firewalld.service(2026 年 4 月 11 日资料)。
5. **版本兼容性**:CentOS 7.7 环境下测试过 HAProxy 1.8.25,CentOS 7.9 可通过 yum 源直接安装(2026 年 1 月 31 日、2024 年 11 月 5 日资料)。
参考来源
来源:StackOverflow/技术论坛 - 如何用 systemd 在 HAProxy 上启动 CentOS(2018 年 8 月 15 日)
来源:CSDN/技术博客 - Centos7.x 下 haproxy 注册成服务的教程(2019 年 7 月 26 日)
来源:博客园 - 基于 CentOS 7 部署社区版 Haproxy(2023 年 8 月 12 日)
来源:知乎/技术文章 - CentOS7.9 部署 Haproxy 和 Keepalived(2024 年 11 月 5 日)