使用Haproxy搭建Web群集

一、基础环境准备

  1. 服务器规划 67

    • HAProxy调度器:1台 (2核4G+,CentOS 7/8)

    • Web服务器:至少2台(如Nginx/Apache,建议192.168.1.101-102)

    • 客户端测试机:1台(Windows/Linux)

    • 网络:所有服务器需在同一局域网,关闭防火墙/SELinux

  2. Web服务器配置

    复制代码
    # 在每台Web服务器安装Nginx并创建测试页
    yum install -y nginx
    echo "Server 1" > /usr/share/nginx/html/index.html  # 服务器1标识
    echo "Server 2" > /usr/share/nginx/html/index.html  # 服务器2标识
    systemctl start nginx

二、HAProxy安装与核心配置

  1. 安装依赖与源码编译 78

    复制代码
    yum install -y gcc pcre-devel bzip2-devel
    wget http://www.haproxy.org/download/2.8/src/haproxy-2.8.3.tar.gz
    tar -zxvf haproxy-2.8.3.tar.gz
    cd haproxy-2.8.3
    make TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1
    make install
  2. 配置文件详解 (/etc/haproxy/haproxy.cfg)

    复制代码
    global
        log /dev/log local0 info     # 分离日志级别
        maxconn 10000                # 最大连接数 :cite[3]
        user haproxy
        group haproxy
        daemon                       # 守护进程模式
    
    defaults
        mode http
        timeout connect 5s           # 连接超时
        timeout client  50s          # 客户端超时
        timeout server  50s          # 后端超时 :cite[2]
        option httplog               # 记录HTTP日志
        option dontlognull           # 忽略空请求
        retries 3                    # 节点失败重试次数
    
    frontend http-in
        bind *:80                    # 监听所有IP的80端口
        acl static path_beg -i /static # ACL规则示例
        use_backend static_servers if static
        default_backend web_servers  # 默认后端组
    
    backend web_servers
        balance leastconn            # 最小连接调度算法 :cite[5]:cite[8]
        server web1 192.168.1.101:80 check inter 2000 rise 2 fall 3
        server web2 192.168.1.102:80 check inter 2000 rise 2 fall 3
        # check: 健康检查,inter 2000ms检测一次,rise 2次成功标记存活,fall 3次失败标记宕机 :cite[7]
    
    backend static_servers
        server static1 192.168.1.103:80 check
  3. 创建系统服务

    复制代码
    cp examples/haproxy.init /etc/init.d/haproxy
    chmod +x /etc/init.d/haproxy
    systemctl daemon-reload

三、关键优化配置

  1. 日志分离 37

    • 修改/etc/rsyslog.d/haproxy.conf

      复制代码
      if $programname == 'haproxy' then {
          if $syslogseverity-text == 'info' then /var/log/haproxy-info.log
          if $syslogseverity-text == 'notice' then /var/log/haproxy-notice.log
          stop
      }
    • 重启服务:systemctl restart rsyslog haproxy

  2. 性能调优参数 3

    参数 推荐值 作用
    maxconn 10000+ 最大并发连接数
    nbproc CPU核数 进程数(需绑定CPU)
    timeout http-request 5s-10s 防止HTTP慢连接攻击
    option httpclose - 主动关闭HTTP连接释放资源

四、高级功能实现

  1. 健康检查强化

    复制代码
    backend web_servers
        option httpchk GET /healthcheck  # 自定义检查路径
        http-check expect status 200     # 要求返回200状态码 :cite[7]
        server web1 192.168.1.101:80 check port 8080  # 指定检查端口
  2. SSL终端卸载

    复制代码
    frontend https-in
        bind *:443 ssl crt /etc/haproxy/certs/example.com.pem
        redirect scheme https if !{ ssl_fc }  # HTTP强制跳转HTTPS
        default_backend web_servers
  3. 高可用方案 36

    • 部署双HAProxy节点 + Keepalived

      • 虚拟IP(VIP)如192.168.1.100

      • 配置Keepalived组播地址:224.0.0.18

    复制代码
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        virtual_ipaddress { 192.168.1.100 }
    }

五、验证与维护

  1. 功能测试

    复制代码
    # 连续访问测试负载均衡
    for i in {1..10}; do curl http://haproxy-ip; done
    # 模拟节点故障(观察日志)
    systemctl stop nginx@web1
    tail -f /var/log/haproxy-info.log  # 查看健康检查日志
  2. 监控命令

    复制代码
    echo "show stat" | socat stdio /var/run/haproxy/admin.sock  # 实时状态:cite[2]
    watch -n 1 "echo 'show info' | socat stdio /var/run/haproxy/admin.sock"

六、故障排查要点

  1. 常见问题 3

    • 503错误 :检查后端服务是否存活,nbproc是否超限

    • 日志不记录 :确认rsyslog配置权限,检查/dev/log设备存在

    • 性能瓶颈 :调整maxconn,启用option http-server-close

生产环境建议

  • 重要配置变更前执行语法检查:haproxy -c -f /etc/haproxy/haproxy.cfg

  • 启用多进程时绑定CPU核心:nbproc 4 cpu-map 1 0 cpu-map 2 1 ...

  • 对于会话保持场景使用balance sourcecookie SERVERID insert8

相关推荐
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush44 天前
嵌入式linux学习记录十四、术语
linux·嵌入式