13.2.3 安装方式对比(包管理、源码编译、容器)

在HAProxy的安装部署中,常见方式包括包管理、源码编译与容器镜像三类。不同方式在版本灵活性、维护成本、依赖管理与稳定性上各有侧重,应结合业务需求与运维能力选择。

文章图片

包管理(YUM/APT)#

适用:对稳定性要求高、功能需求常规、标准化环境。

安装示例(CentOS/RHEL)

# 1) 安装
sudo yum install -y haproxy

# 2) 查看版本
haproxy -v
# 预期:输出 HA-Proxy version x.y.z

# 3) 基本配置与验证
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
sudo vim /etc/haproxy/haproxy.cfg

示例配置(/etc/haproxy/haproxy.cfg):

global
    log 127.0.0.1 local0
    maxconn 2000

defaults
    mode http
    timeout connect 5s
    timeout client  30s
    timeout server  30s

frontend fe_web
    bind *:80
    default_backend be_web

backend be_web
    balance roundrobin
    server s1 10.0.0.11:8080 check
    server s2 10.0.0.12:8080 check
# 4) 语法检查(避免配置错误导致启动失败)
haproxy -c -f /etc/haproxy/haproxy.cfg

# 5) 启动与开机自启
sudo systemctl enable --now haproxy
sudo systemctl status haproxy

命令解释
- haproxy -c -f <配置>:只检查配置语法,不启动服务。
- systemctl enable --now:设置开机自启并立即启动。

排错要点

# 查看服务日志
journalctl -u haproxy --no-pager -n 100
# 常见问题:端口被占用、后端不可达、配置语法错误
ss -lntp | grep :80

源码编译#

适用:需要新特性、定制功能或性能优化的场景。

安装示例(Ubuntu/CentOS通用)

# 1) 安装编译依赖
# Ubuntu
sudo apt-get update
sudo apt-get install -y build-essential libssl-dev zlib1g-dev libpcre3-dev

# CentOS
sudo yum install -y gcc make openssl-devel pcre-devel zlib-devel

# 2) 下载并解压
curl -LO https://www.haproxy.org/download/2.8/src/haproxy-2.8.5.tar.gz
tar -xf haproxy-2.8.5.tar.gz
cd haproxy-2.8.5

# 3) 编译并启用常用模块
make TARGET=linux-glibc USE_OPENSSL=1 USE_PCRE=1 USE_ZLIB=1 \
     USE_LUA=1 USE_PROMEX=1

# 4) 安装到 /usr/local/sbin
sudo make install
/usr/local/sbin/haproxy -v

命令解释
- TARGET=linux-glibc:指定编译目标平台。
- USE_OPENSSL=1:启用SSL终止能力。
- USE_PROMEX=1:启用Prometheus指标导出。

示例Systemd服务文件

# /etc/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network.target

[Service]
ExecStart=/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
ExecReload=/usr/local/sbin/haproxy -c -f /etc/haproxy/haproxy.cfg
ExecReload=/bin/kill -USR2 $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now haproxy

排错要点

# 编译时报缺库
# 提示: openssl not found -> 安装 openssl-devel/libssl-dev

# 运行时报错找不到配置
/usr/local/sbin/haproxy -c -f /etc/haproxy/haproxy.cfg

容器部署(Docker/Kubernetes)#

适用:容器化架构、微服务集群、快速交付与弹性伸缩。

Docker快速启动

# 1) 准备配置
mkdir -p /opt/haproxy
cat >/opt/haproxy/haproxy.cfg <<'EOF'
global
    maxconn 2000
defaults
    mode http
    timeout connect 5s
    timeout client 30s
    timeout server 30s

frontend fe_web
    bind *:80
    default_backend be_web

backend be_web
    balance roundrobin
    server s1 10.0.0.11:8080 check
    server s2 10.0.0.12:8080 check
EOF

# 2) 运行容器
docker run -d --name haproxy \
  -p 80:80 \
  -v /opt/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro \
  haproxy:2.8

# 3) 验证
docker ps
docker logs haproxy --tail 50

Kubernetes示例(简化)

# haproxy-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: haproxy-config
data:
  haproxy.cfg: |
    global
      maxconn 2000
    defaults
      mode http
      timeout connect 5s
      timeout client 30s
      timeout server 30s
    frontend fe_web
      bind *:80
      default_backend be_web
    backend be_web
      balance roundrobin
      server s1 10.0.0.11:8080 check
      server s2 10.0.0.12:8080 check
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: haproxy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: haproxy
  template:
    metadata:
      labels:
        app: haproxy
    spec:
      containers:
      - name: haproxy
        image: haproxy:2.8
        ports:
        - containerPort: 80
        volumeMounts:
        - name: cfg
          mountPath: /usr/local/etc/haproxy/haproxy.cfg
          subPath: haproxy.cfg
      volumes:
      - name: cfg
        configMap:
          name: haproxy-config
kubectl apply -f haproxy-config.yaml
kubectl get pods

容器排错要点

# 容器内检查配置
docker exec -it haproxy haproxy -c -f /usr/local/etc/haproxy/haproxy.cfg

# K8s查看Pod日志
kubectl logs deploy/haproxy --tail=100

安装方式对比总结(要点)#

  • 包管理:稳定、省心、版本偏旧;适合标准化生产。
  • 源码编译:灵活、可定制、维护成本高;适合性能与新特性需求。
  • 容器:交付快、弹性强、配置与网络需额外规划;适合云原生。

练习#

  1. 使用包管理安装HAProxy,修改配置绑定80端口并转发到两台后端,完成语法检查与启动。
  2. 使用源码编译启用USE_PROMEX=1,验证haproxy -vv是否包含Prometheus相关模块。
  3. 使用Docker运行HAProxy,将配置挂载为只读,修改配置后重启容器生效。
  4. 制造一个端口冲突(占用80端口),观察journalctl -u haproxy输出并解决。