Linux 7 生产环境安装 HaProxy

前言

本文主要介绍如何在 Linux 环境中安装 HaProxy,适用于 CentOS、Debian、Ubuntu 等 Linux 发行版。

HaProxy 介绍

HaProxy 概述

HAProxy(High Availability Proxy)是一款开源、高性能的负载均衡器和代理服务器,广泛应用于 Web 服务、数据库等场景。其主要特点如下:

  • 高性能

    • 支持每秒处理数十万连接
    • 内存和 CPU 使用效率高
  • 多协议支持

    • HTTP / HTTPS(第 7 层)
    • TCP(第 4 层)
    • 支持同时代理多种协议
  • 高可用与容错

    • 支持热重启、主从 HA(高可用)配置
    • 支持会话保持(Stickiness)
  • 丰富的负载均衡算法

    • RoundRobin、Least Connections、Source IP Hash 等
    • 可灵活配置健康检查(Health Check)
  • 监控与统计

    • 内置统计页面
    • 支持 syslog 日志和第三方监控集成
  • 多线程、多进程支持(从 HAProxy 2.0 开始)

    • 支持单进程 + 单线程、单进程 + 多线程、多进程 + 单线程、多进程 + 多线程
    • 可以根据 CPU 核心优化性能
  • 典型的应用场景

    • Web 服务器的负载均衡(Tomcat、Apache 等)
    • 数据库代理(MySQL、PostgreSQL)
    • HTTPS/TCP 服务的反向代理

HaProxy 对比 Nginx

特性 HAProxyNginx
定位专业的高性能负载均衡器与代理服务器 Web 服务器 + 反向代理 + 负载均衡
主要协议支持 TCP(第 4 层)、HTTP/HTTPS(第 7 层)HTTP/HTTPS(第 7 层)、部分 TCP/UDP 支持(依赖 Stream 模块)
负载均衡算法 RoundRobin、Least Connections、Source IP Hash、URI Hash 等 RoundRobin、Least Connections、IP Hash
多进程 / 多线程单进程 / 多线程、多进程 / 多线程(从 2.0 版本开始支持)多进程 + 单线程(Worker 模式,多进程多 Worker)
健康检查内置灵活健康检查(TCP/HTTP)仅 HTTP 健康检查,需要配置 proxy_pass + health_check(Nginx Plus 支持更多)
性能特点极低延迟,适合高并发 TCP/HTTP 负载均衡高并发 HTTP 服务,静态资源处理优秀
会话保持支持会话保持(源 IP、Cookie 等)支持 IP Hash、Cookie 等
监控与统计内置统计页面,可集成 Prometheus 需第三方模块或 Nginx Plus 才有可视化监控
适用场景高并发 TCP/HTTP 负载均衡、数据库代理 Web 服务反向代理、静态文件服务、HTTP/HTTPS 负载均衡
配置复杂度配置文件直观但灵活性高,需要理解 TCP/HTTP 模式区别配置易用,HTTP/HTTPS 支持更丰富,模块化灵活

选择建议

  • 如果目标是高性能 TCP 或 HTTP 负载均衡,尤其是数据库代理,推荐 HAProxy。
  • 如果目标是 Web 服务器 + HTTP 反向代理 + 静态内容服务,或者已经有 Nginx 架构,使用 Nginx 更方便。

HAProxy 的进程和线程模型

HAProxy 从 2.0 版本开始支持多线程模式,但多进程模式与多线程模式有一些限制,需要注意:

配置模式 nbprocnbthread 描述注意事项
单进程 + 单线程 11 最基础模式,性能有限,适合低并发或测试环境简单稳定,几乎没有兼容问题
单进程 + 多线程 1> 1 利用多线程提升单进程的并发处理能力推荐 Systemd 环境下使用,避免启用 HaProxy 的 daemon 配置项
多进程 + 单线程 > 11 多进程模式,利用多核 CPU 每个进程独立,无法共享全局连接,Systemd 环境下通常不用 HaProxy 的 daemon 配置项
多进程 + 多线程 > 1> 1 每个进程内可启动多个线程仅在特定场景使用,配置复杂,很多功能受限制(如 stats socket 配置项)
  • nbproc 配置项:

    • 用于指定 HAProxy 启动的进程数,适合多核 CPU 利用。
    • Systemd 环境下建议配置 nbproc = 1,因为 Systemd 已经管理了 HaProxy 进程的生命周期。
  • nbthread 配置项:

    • 用于指定每个进程的线程数,多线程模式可以提高单进程的并发性能。
    • 必须搭配 nbproc ≥ 1 使用。
    • Systemd 环境下,推荐使用单进程 + 多线程模式,即 nbproc = 1 + nbthread > 1
  • daemon 配置项:

    • 当 HAProxy 由 Systemd 管理时,不应该启用 daemon,否则可能导致 PID 和日志管理冲突。
  • 限制与注意事项:

    • 多线程模式下,每个线程共享全局配置和监听端口,可显著减少资源占用。
    • 多进程模式下,stats socketpidfilechroot 等功能需要额外注意权限和路径。

HaProxy 安装

版本说明

软件版本安装方式
HaProxy2.8.5源码编译安装

安装概述

安装说明路径
HaProxy 的安装路径/usr/local/sbin/haproxy
HaProxy 的配置文件/etc/haproxy/haproxy.cfg
HaProxy 的 PID 文件/var/lib/haproxy/haproxy.pid
HaProxy 的 Socket 文件/var/lib/haproxy/stats
HaProxy 的 Systemd 服务配置文件/usr/lib/systemd/system/haproxy.service

HaProxy 的安装方式

  • HaProxy 有两种安装方式,一种是通过 YUM 安装,另一种是通过源码编译安装。
  • YUM 安装:适合快速搭建、生产环境要求稳定版本、无需特定新功能的场景。
  • 源码安装:适合追求最新特性、高性能优化、或者需要自定义编译选项的场景。

安装步骤

编译安装

安装依赖软件包

1
2
3
4
5
# CentOS系统安装软件包
# yum install -y gcc make pcre-devel openssl openssl-devel systemd-devel wget

# Debian、Ubuntu系统安装软件包
# apt install -y gcc make libpcre3-dev openssl libssl-dev libsystemd-dev wget

下载 HaProxy 源码包(官网下载地址

1
2
# 下载源码包
# wget https://www.haproxy.org/download/2.8/src/haproxy-2.8.5.tar.gz

下载 HaProxy 源码包

1
2
# 解压源码包
# tar -xvf haproxy-2.8.5.tar.gz

编译源码与安装

1
2
3
4
5
6
7
8
9
10
11
12
13
# 进入源码包的解压目录
# cd haproxy-2.8.5

# 编译源码
# make TARGET=linux-glibc \
USE_OPENSSL=1 \
USE_PCRE=1 \
USE_SYSTEMD=1 \
USE_ZLIB=1 \
-j$(nproc)

# 安装
# make install

创建用户

创建 HaProxy 用户与用户组

1
2
3
4
5
# 创建用户组
# groupadd --system haproxy

# 创建用户(禁止登录)
# sudo useradd --system --no-create-home --shell /sbin/nologin --gid haproxy haproxy

配置服务

配置 Systemd 管理 HaProxy 服务

1
2
# 创建系统配置文件,添加以下配置内容
# vim /usr/lib/systemd/system/haproxy.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=HAProxy Load Balancer
After=network.target

[Service]
User=haproxy
Group=haproxy
LimitNOFILE=1048576
Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/var/lib/haproxy/haproxy.pid"
ExecStartPre=/usr/local/sbin/haproxy -f $CONFIG -c -q
ExecStart=/usr/local/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Type=notify

[Install]
WantedBy=multi-user.target

创建 HaProxy 的运行目录

1
2
3
4
5
6
7
8
# 创建运行目录
# mkdir -p /var/lib/haproxy

# 更改运行目录的所有者
# chown -R haproxy:haproxy /var/lib/haproxy

# 设置运行目录的权限
# chmod 750 /var/lib/haproxy

创建 HaProxy 的配置目录

1
2
# 创建配置目录
# mkdir -p /etc/haproxy

创建 HaProxy 的配置文件

1
2
# 创建配置文件,添加以下配置内容
# vim /etc/haproxy/haproxy.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2

# chroot /var/lib/haproxy
# pidfile /var/run/haproxy.pid
# user haproxy
# group haproxy
maxconn 4000
nbthread 4
# nbproc 1
# daemon

# turn on stats unix socket
stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

#---------------------------------------------------------------------
# collection haproxy statistics message
#---------------------------------------------------------------------
listen stats
bind *:1080
stats auth admin:admin
stats refresh 5s
stats realm HAProxy\ Statistics
stats uri /admin?stats

HaProxy 配置文件的使用说明

配置项类型默认值说明
maxconn全局 / 前端 / 后端2000最大连接数,控制 HAProxy 可以同时处理的并发连接数。
nbthread全局1指定每个进程使用的线程数。多线程模式可提高单进程并发性能。
nbproc全局1指定 HAProxy 启动的进程数。多进程模式用于多核优化,但 Systemd 环境下不推荐与 daemon 配合使用。
daemon全局禁用是否后台运行。Systemd 管理时通常禁用,HAProxy 由 Systemd 控制前后台。
modedefaults/frontend/backendhttp连接模式,可选 httptcp
balancebackendroundrobin负载均衡算法,可选 roundrobinleastconnsource 等。
stats authlisten 设置统计页面认证用户名和密码,例如 admin:admin
stats refreshlisten10s统计页面刷新时间,单位秒。
stats realmlistenHTTP Basic Auth 的 realm 名称,显示在认证弹窗中。
stats urilisten/HaProxy 统计页面访问 URI,例如 /admin?stats

Haproxy 的配置建议

  • maxconn + nbthread 可以提升单进程的并发性能。
  • 当使用 Systemd 管理 HaProxy 时,建议配置 nbproc = 1 + nbthread > 1 + 不启用 daemon,这是最稳定和高效的配置方式。

启动服务

设置开机自启动 HaProxy 服务

1
2
3
4
5
# 更新系统配置
# systemctl daemon-reload

# 开机自启动HaProxy
# systemctl enable haproxy

立刻启动 HaProxy 服务

1
2
# 启动HaProxy
# systemctl start haproxy

管理服务

管理 HaProxy 服务

1
2
3
4
5
6
7
8
# 查看HaProxy的运行状态
# systemctl status haproxy

# 重启HaProxy
# systemctl restart haproxy

# 关闭HaProxy
# systemctl stop haproxy

当 HaProxy 的配置文件发生变更后,可以执行热加载(也叫平滑重载,不会中断现有连接),让配置文件生效

1
2
# 热加载HaProxy配置文件
# systemctl reload haproxy

验证服务

浏览器通过 http://192.168.1.191:1080/admin?stats 访问 HaProxy 的统计页面,默认的登录用户名和密码是 admin / admin;如果可以正常访问(如下图所示),则说明 HaProxy 可以正常运行