HAProxy 简介及配置

一、HAProxy 简介

HAProxy 是由法国人 Willy Tarreau 开发的开源软件,专为处理高并发场景设计,能支持 10000 以上客户端同时连接,是高性能的 TCP 和 HTTP 负载均衡器。它提供高可用性、负载均衡以及基于 TCP 和 HTTP 的应用代理,支持虚拟主机,是免费、快速且可靠的负载均衡解决方案,尤其适合处理高负载站点的七层数据请求,还能屏蔽内部真实服务器,抵御攻击。

官网:http://www.haproxy.com

二、HAProxy 特点和优点

  1. 支持原生 SSL,同时支持客户端和服务器的 SSL。
  2. 支持 IPv6 和 UNIX 套字节(sockets)。
  3. 支持 HTTP Keep-Alive。
  4. 支持 HTTP/1.1 压缩,节省宽带。
  5. 支持优化健康检测机制(SSL、scripted TCP、check agent 等)。
  6. 支持 7 层负载均衡。
  7. 可靠性和稳定性非常好。
  8. 并发连接 40000-50000 个,单位时间处理最大请求 20000 个,最大数据处理 10Gbps。
  9. 支持 8 种负载均衡算法,同时支持 session 保持。
  10. 支持虚拟主机。
  11. 支持连接拒绝、全透明代理。
  12. 拥有服务器状态监控页面。
  13. 支持 ACL(access control list)。

三、HAProxy 保持会话的三种解决方法

为确保同一客户端访问服务器能保持会话,HAProxy 有以下三种解决方法:

  1. 通过客户端 IP 进行 Hash 计算并保存,使相同 IP 访问代理服务器时转发给固定的真实服务器。
  2. 依靠真实服务器发送给客户端的 Cookie 信息进行会话保持。
  3. 保存真实服务器的 Session 以及服务器标识,实现会话保持。(HAProxy 仅要求后端服务器网络联通,无需像 LVS 那样进行繁琐的 ARP 配置)

四、HAProxy 的 8 种负载均衡算法

  1. RR(Round Robin):轮询调度,将请求按顺序轮流分配给后端节点。例如三个节点 A、B、C,第一个用户到 A,第二个到 B,第三个到 C,第四个再到 A,以此类推。
  2. LC(Least Connections):最小连接数算法,根据后端节点连接数动态分配请求,将新请求分配给连接数最小的节点。
  3. SH(Source Hashing):基于来源访问调度算法,适用于服务端有 Session 会话记录的场景,可基于来源的 IP、Cookie 等进行集群调度,能实现会话保持,但可能因部分 IP 访问量大导致负载不均衡。
  4. uri(资源标识符):根据请求的 URI 调度,适用于 CDN(内容分发网络)。
  5. url_param(资源定位符):根据 HTTP 请求头锁定每次 HTTP 请求。
  6. rdp---cookie(name):根据 cookie(name)锁定并哈希每次 TCP 请求。
  7. source:根据请求的源 IP,类似 Nginx 的 IP hash 机制。
  8. static-rr:根据权重进行轮询。

五、HAProxy 主要工作模式

  1. tcp 模式:在客户端和服务器之间建立全双工连接,不处理七层报文,通常用于 SSL、SSH、SMTP 等应用层。
  2. http 模式(一般使用):转发客户端请求给后端服务器前会深度分析,拒绝所有不与 RFC 格式兼容的请求。

六、HAProxy 安装

6.1 通过 tar.gz 安装

  1. 准备 HAProxy 安装包(如 haproxy-2.9.5.tar.gz),传到 /opt 目录。
  2. 解压到 /usr/local/src:

bash

复制代码
tar -zxvf haproxy-2.9.5.tar.gz -C  /usr/local/src
cd /usr/local/src/haproxy-2.9.5/
  1. 查询系统内核版本:

bash

复制代码
uname -r
  1. 编译,centos6.X 用 TARGET=linux26,centos7.x 用 linux31:

bash

复制代码
make TARGET=linux31 PREFIX=/usr/local/haproxy [ARCH=x86_64]
  1. 安装到 /usr/local/haproxy 目录:

bash

复制代码
make install PREFIX=/usr/local/haproxy
  1. 创建目录和配置文件:

bash

复制代码
mkdir -p /usr/data/haproxy/
vim /usr/local/haproxy/haproxy.cfg

6.2 通过 yum 安装

bash

复制代码
yum -y install haproxy

七、HAProxy 配置文件参数

HAProxy 配置文件 haproxy.cfg 的默认地址为 /etc/haproxy/haproxy.cfg,由 global 和 proxies 两大部分组成。

7.1 global 全局配置

包含进程及安全配置、性能调整、Debug 等相关参数,例如:

  • chroot:锁定运行目录
  • deamon:以守护进程运行
  • user、group、uid、gid:运行 haproxy 的用户身份
  • nbproc:开启的 haproxy 进程数,与 CPU 保持一致
  • maxconn:每个 haproxy 进程的最大并发连接数
  • log:定义全局的 syslog 服务器

示例:

bash

复制代码
global 
    chroot /var/haproxy             # 锁定运行目录
    uid 99                          # 所属运行的用户uid 
    gid 99                          # 所属运行的用户组 
    daemon                          # 守护进程。以后台形式运行haproxy 
    nbproc 1                        # haproxy进程数,与CPU保持一致
    pidfile /var/run/haproxy.pid    # haproxy的pid存放路径
    ulimit-n 65535	                # ulimit的数量限制
    maxconn 20480                   # 默认最大连接数 
    log 127.0.0.1 local0            # 日志输出配置
    log 127.0.0.1 local1 notice   	# notice为日志级别

7.2 proxies 代理配置

主要包括 defaults、frontend、backend、listen 四部分。

7.2.1 defaults

为 frontend、backend、listen 提供默认配置,例如:

  • option redispatch:当服务器挂掉后,强制定向到其他健康服务器
  • mode http:默认工作类型
  • timeout connect:客户端请求到后端 server 的最长连接等待时间
  • balance roundrobin:默认的负载均衡方式

示例:

bash

复制代码
defaults 
    log global                      # 应用全局日志配置
    mode http                       # 处理类别为http(7层)
    maxconn 20480                   # 最大连接数 
    option httplog                  # 日志类别为http日志格式 
    option httpclose                # 每次请求完毕后主动关闭http通道 
    option dontlognull              # 不记录健康检查的日志信息 
    option forwardfor               # 让后端服务器获得客户端真实ip
    option redispatch               # 服务器挂掉后强制定向到其他健康服务器
    option abortonclose             # 服务器负载高时结束久等连接 
    stats refresh 30                # 统计页面刷新间隔 
    retries 3                       # 检查节点服务器失败次数
    balance roundrobin              # 负载均衡方式为轮询
    contimeout 5000                 # 连接超时时间
    clitimeout 50000                # 客户端超时时间
    srvtimeout 50000                # 服务器超时时间
    timeout check 2000              # 心跳检测超时时间
7.2.2 frontend

指定接收客户端侦听套接字设置,类似 Nginx 的 server {},可定义 ACL 策略进行匹配操作。

示例:

bash

复制代码
frontend http_80_in 
    bind 0.0.0.0:80      # 监听端口
    mode http            # http的7层模式 
    log global           # 应用全局的日志配置 
    option httplog       # 启用http的log 
    option httpclose     # 每次请求完毕后主动关闭http通道 
    option forwardfor    # 让后端服务器获得客户端真实IP
    
    # acl策略配置
    acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$    
    acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn
    
    # acl策略匹配相应 
    use_backend  server_web  if itnihao_web 
    use_backend  server_blog if itnihao_blog 
    default_backend server_bbs  # 以上都不满足时使用默认backend
7.2.3 backend

指定将连接请求转发至后端服务器的相关设置,类似 Nginx 的 upstream {}。

示例:

bash

复制代码
backend server_web 
    mode http                         # http的7层模式 
    balance roundrobin                # 负载均衡方式为轮询
    cookie SERVERID                   # 允许插入serverid到cookie中
    option httpchk GET /index.html    # 心跳检测的文件 
    server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1     
    server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2
7.2.4 listen

同时拥有前端和后端配置,只对 TCP 有效,可用于配置监控页面等。

示例(监控页面配置):

bash

复制代码
listen admin_status                
    bind 0.0.0.0:65532             # 监听端口 
    mode http                      # http的7层网络模式 
    log 127.0.0.1 local3 err       # 错误日志记录 
    stats refresh 5s               # 每隔5秒自动刷新监控页面 
    stats uri /admin?stats         # 监控页面的url 
    stats realm itnihao\ itnihao   # 监控页面的提示信息 
    stats auth admin:admin         # 监控页面的用户和密码
    stats auth admin1:admin1       # 另一个用户和密码
    stats hide-version             # 隐藏HAproxy版本信息  
    stats admin if TRUE            # 手工启用/禁用后端服务器

7.3 完整配置文件示例

bash

复制代码
global
    log /dev/log    local0 info
    log /dev/log    local0 notice
    maxconn 4096
    uid 99
    gid 99
    daemon
 
defaults
    log global
    mode    http
    option  httplog
    retries 3
    maxconn 4096
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000
 
listen  webcluster 0.0.0.0:80
    option  httpchk GET /index.html
    balance roundrobin
    server  inst1 192.168.200.103:80 check inter 2000 fall 3
    server  inst2 192.168.200.104:80 check inter 2000 fall 3
 
listen admin_stats
    bind 0.0.0.0:8000
    mode http
    option httplog
    maxconn 100
    stats refresh 30s
    stats uri /stats
    stats realm Crushlinux\ Haproxy
    stats auth  admin:admin
    stats hide-version

八、服务自启动脚本配置

bash

复制代码
cp /usr/src/haproxy-2.9.5/examples/haproxy.init /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
chmod +x /etc/init.d/haproxy 
/etc/init.d/haproxy start

# 将haproxy服务交由systemd管理
chkconfig --add /etc/init.d/haproxy
# 启动
systemctl start haproxy
# 设置开机自启
chkconfig --level 35 haproxy on

九、Haproxy 日志配置

Haproxy 日志默认输出到系统 syslog,为便于管理可单独配置:

  1. 修改 haproxy.cfg 的 global 选项:

bash

复制代码
log /dev/log    local0 info
log /dev/log    local0 notice
  1. 重启 haproxy:

bash

复制代码
service haproxy restart
  1. 在 /etc/rsyslog.d/ 下创建 haproxy.conf:

bash

复制代码
if ($programname == 'haproxy' and $syslogserverity-text == 'info') then -/var/log/haproxy/haproxy-info.log &~
if ($programname == 'haproxy' and $syslogserverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log &~
  1. 重启 rsyslog 服务:

bash

复制代码
service rsyslog restart

十、状态统计功能测试

仅七层可配置状态统计功能:

bash

复制代码
listen stats # 定义监控页面    
    mode http
    option httplog
    bind *:1080                   # 绑定端口1080    
    stats refresh 30s             # 每30秒更新监控数据    
    stats uri /stats              # 访问监控页面的uri    
    stats realm HAProxy\ Stats    # 监控页面的认证提示    
    stats auth admin:admin        # 监控页面的用户名和密码

配置后,可通过访问对应端口和 URI 查看监控页面。

相关推荐
HLC++1 分钟前
Linux的进程间通信
android·linux·服务器
groundhappy4 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕4 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫6 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生6 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.117 小时前
linux基础IO
linux·运维·服务器
BelongPanda9 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯9 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998349 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei3710 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源