HAProxy 基础配置文件详解

HAProxy 配置文件根据功能和用途,主要有 5 个部分组成,但有些部分并不是必须的, 可以根据需要选择相应的部分进行配置。

参数功能描述
global用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
defaults默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的 frontend、backend 和 listen 部分中,因此,如果某些参数属于公用的配置,只需在 defaults 部分添加一次即可。而如果在 frontend、backend 和 listen 部分中也配置了与 defaults 部分一样的参数,那么defaults 部分参数对应的值自动被覆盖。
frontend用于设置接收用户请求的前端虚拟节点。frontend 是在 HAProxy1.3 版本之后才引入的一个组件,同时引入的还有 backend 组件。通过引入这些组件,在很大程度上简化了 HAProxy 配置文件的复杂性。frontend 可以根据 ACL 规则直接指定要使用的后端
backend设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。添加的真实服务器类似于 LVS 中的real server 节点。
listenfrontend 部分和 backend 部分的结合体。在 HAProxy1.3 版本之前,HAProxy 的所有配置选项都在这个部分中设置。为了保持兼容性,HAProxy 新的版本仍然保留了 listen 组件的配置方式。

HAProxy 配置文件

global
    log 127.0.0.1 local0 info maxconn 4096
    user nobody 
    group nobody 
    daemon 
    nbproc 1
    pidfile /usr/local/haproxy/logs/haproxy.pid 
defaults
    mode http 
    retries 3
    timeout connect 10s 
    timeout client 20s 
    timeout server 30s 
    timeout check 5s
frontend www
    bind *:80 
    mode    http
    option    httplog 
    option    forwardfor 
    option    httpclose 
    log    global
    default_backend htmpool
backend htmpool
    mode    http 
    option    redispatch
    option    abortonclose 
    balance    roundrobin 
    cookie    SERVERID
    option    httpchk GET /index.php
    server    web1 10.200.34.181:80    cookie server1 weight 6 check inter 2000 rise 2 fall 3
    server    web2 10.200.34.182:8080 cookie server2 weight 6 check inter 2000 rise 2 fall 
listen admin_stats
    bind 0.0.0.0:9188
    mode http
    log 127.0.0.1 
    local0 err stats 
    refresh 30s
    stats uri /haproxy-status
    stats realm welcome login\ Haproxy
    stats auth admin:admin123
    stats hide-version 
    stats admin if TRUE

global 配置

参数描述
log全局的日志配置,local0 是日志设备,info 表示日志级别。其中日志级别有err、warning、info、debug 四种可选。这个配置表示使用 127.0.0.1 上的 rsyslog 服务中的local0 日志设备,记录日志等级为info
maxconn设定每个 haproxy 进程可接受的最大并发连接数,此选项等同于 Linux命令行选项“ulimit -n”
user/group设置运行 haproxy 进程的用户和组,也可使用用户和组的 uid 和gid 值来替代
daemon设置 HAProxy 进程进入后台运行
nbproc设置 HAProxy 启动时可创建的进程数,此参数要求将HAProxy 运行模式设置为“daemon”,默认只启动一个进程。根据使用经验,该值的设置应该小于服务器的 CPU 核数。创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃
pidfile指定 HAProxy 进程的 pid 文件。启动进程的用户必须有访问此文件的权限

 defaults 部分

参数描述


mode

tcp客户端和服务器端之间将建立一个全双工的连接,不会对七层报文做任何类型的检查,默认为 tcp 模式,经常用于 SSL、SSH、SMTP 等应用
http客户端请求在转发至后端服务器之前将会被深度分析,所有不与 RFC 格式兼容的请求都会被拒绝
health已经废弃
retries设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,HAProxy 会将对应的后端服务器标记为不可用。此参数也可在后面部分进行设置
timeout connect设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,但也可以使用其他的时间单位后缀
timeout client设置连接客户端发送数据时最长等待时间
timeout server设置服务器端回应客户度数据发送的最长等待时间
timeout check设置对后端服务器的检测超时时间

frontend 部分

参数描述
bind此选项只能在 frontend 和 listen 部分进行定义,用于定义一个或几个监听的套接字
option httplog在默认情况下,haproxy 日志是不记录 HTTP 请求的,这样很不方便 HAProxy 问题的排查与监控。通过此选项可以启用日志记录 HTTP 请求
option forwardfor如果后端服务器需要获得客户端的真实  IP,就需要配置此参数。“X-Forwarded-For”
option httpclose表示在客户端和服务器端完成一次连接请求后,HAProxy 将主动关闭此 TCP 连接
log global表示使用全局的日志配置,这里的“ global”表示引用在HAProxy 配置文件 global 部分中定义的 log 选项配置格式
default backend指定默认的后端服务器池,也就是指定一组后端真实服务器,而这些真实服务器组将在 backend 段进行定义。这里的htmpool 就是一个后端服务器组

backend 部分

参数描述
option redispatch此参数用于 cookie 保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的 serverID 插入到 cookie 中,以保证会话的 SESSION 持久性。而如果后端的服务器出现故障,客户端的 cookie 是不会刷新的,这就出现了问题。此时,如果设置此参数,就会将客户的请求强制定向到另外一个健康的后端服务器上,以保证服务的正常
option abortonclose可以在服务器负载很高的情况下, 自动结束掉当前队列中处理时间比较长的链接





balance

roundrobin是基于权重进行轮询调度的算法,在服务器的性能分布比较均匀的时候,这是一种最公平、最合理的算法。此算法经常使用
static-rr基于权重进行轮询的调度算法,不过此算法为静态方法,在运行时调整其服务器权重不会生效。
source基于请求源 IP 的算法。此算法先对请求的源 IP 进行 hash 运算, 然后将结果与后端服务器的权重总数相除后转发至某个匹配的后端服务器。这种方式可以使同一个客户端 IP 的请求始终被转发到某特定的后端服务器
leastconn 将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法,例如数据库负载均衡等。此算法不适合会话较短的环境中,例如基于 HTTP 的应用
uri   会对部分或整个 URI 进行 hash 运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上。
uri_param   根据 URL 路径中的参数进行转发,这样可保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上。
hdr(<name>)    此算法根据 http 头进行转发,如果指定的 http 头名称不存在,则使用 roundrobin 算法进行策略转发
cookie允许向 cookie 插入 SERVERID,每台服务器的 SERVERID 可在下面的 server 关键字中使用 cookie 关键字定义。



option httpchk

启用 HTTP 的服务状态检测功能。option httpchk <method> <uri> <version>
methodHTTP 请求的方式,常用的有 OPTIONS、GET、HEAD 几种方式。一般的健康检查可以采用 HEAD 方式进行,而不是才采用 GET 方式,这是因为 HEAD 方式没有数据返回,仅检查 Response 的 HEAD 是不是 200 状态。相对 GET ,HEAD 方式更快,更简单
uri要检测的 URL 地址,通过执行此 URL可以获取后端服务器的运行状态。正常情况下返回 200,返回其他状态码均为异常状态
version指定心跳检测时的 HTTP 的版本号


server:这个关键字用来定义多个后端真实服务器,不能用于 defaults 和frontend部分。使用格式为:server <name> <address>[:port] [param*] 其中,每个参数含义如下:

  • check:表示启用对此后端服务器执行健康状态检查。
  • inter:设置健康状态检查的时间间隔,单位为毫秒。
  • rise:设置从故障状态转换至正常状态需要成功检查的次数,例如。“rise 2”表示 2 次检查正确就认为此服务器可用。
  • fall:设置后端服务器从正常状态转换为不可用状态需要检查的次数,例如,“fall 3”表示 3 次检查失败就认为此服务器不可用。
  • cookie:为指定的后端服务器设定 cookie 值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后
<name>为后端真实服务器指定一个内部名称,随便定义一个即可。
<address>后端真实服务器的 IP 地址或主机名。
<port>指定连接请求发往真实服务器时的目标端口。在未设定时,将使用客户端请求时的同一端口。





[param*]

为后端服务器设定的一系参数,可用参数非常多,这里仅介绍常用的一些参数:

check

表示启用对此后端服务器执行健康状态检查。

inter

设置健康状态检查的时间间隔,单位为毫秒。

rise

设置从故障状态转换至正常状态需要成功检查的次数,例如。“rise 2”表示 2 次检查正确就认为此服务器可用。

fall

设置后端服务器从正常状态转换为不可用状态需要检查的次数,例如,“fall 3”表示 3 次检查失败就认为此服务器不可用。

cookie

为指定的后端服务器设定 cookie 值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中,其目的在于实现持久连接的功能。上面 的“cookie server1”表示 web1 的 serverid 为 server1。 “cookie server2”表示 web2 的 serverid 为 server2。

weight

设置后端真实服务器的权重,默认为 1,最大值为 256。设置为 0 表示不参与负载均衡。

backup

设置后端真实服务器的备份服务器,仅仅在后端所有真实服务器均不可用的情况下才启用。

listen 部分

这个部分通过listen 关键字定义了一个名为“admin_stats”的实例,其实就是定义了一个 HAProxy 的监控页面,每个选项的含义如下:

stats refresh:设置 HAProxy 监控统计页面自动刷新的时间。

stats uri:设置 HAProxy 监控统计页面的URL 路径,可随意指定。例如、指定“stats uri /haproxy-status”,就可以过 http://IP:9188/haproxy-status  查看。

stats realm:设置登录 HAProxy 统计页面时密码框上的文本提示信息。

stats auth:设置登录 HAProxy 统计页面的用户名和密码。用户名和密码通过冒号分割。可为监控页面设置多个用户名和密码,每行一个。

stats hide-version:用来隐藏统计页面上 HAProxy 的版本信息。

stats admin if TRUE:通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器,仅在 haproxy1.4.9 以后版本有效。

完整的haproxy配置文件

global
    log 127.0.0.1 local0 info 
    maxconn 4096
    user nobody 
    group nobody 
    daemon 
    nbproc 1
    pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
    mode http 
    retries 3
    timeout connect 10s 
    timeout client 20s 
    timeout server 30s
    timeout check 5s
frontend www
    bind *:80 
    mode    http
    option    httplog 
    option    forwardfor
    option    httpclose 
    log    global
    #acl host_www    hdr_dom(host)    -i    www.zb.com
    #acl host_img    hdr_dom(host)    -i    img.zb.com
 
    #use_backend htmpool    if    host_www 
    #use_backend imgpool    if    host_img 
    default_backend    htmpool
backend htmpool
    mode http 
    option    redispatch
    option    abortonclose 
    balance  static-rr 
    cookie    SERVERID
    option    httpchk GET /index.jsp
    server    237server 192.168.81.237:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3
    server    iivey234 192.168.81.234:8080 cookie server2 weight 3 check inter 2000 rise 2 fall 3
backend imgpool
    mode        http 
    option    redispatch
    option    abortonclose
     balance  static-rr 
    cookie  SERVERID
    option    httpchk GET /index.jsp
    server    host236 192.168.81.236:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3
 
listen admin_stats
    bind 0.0.0.0:9188
    mode http
    log 127.0.0.1 local0 err 
    stats refresh 30s
    stats uri /haproxy-status
    stats realm welcome login\ Haproxy 
    stats auth admin:admin123
    stats hide-version 
    stats admin if TRUE

haproxy 解决集群 session 共享问题

Haproxy 二种方法保持客户端 session 一致

用户 IP 识别

haroxy 将用户 IP 经过 hash 计算后 指定到固定的真实服务器上(类似于 nginx 的 IP hash 指令)

配置指令: balance source

backend htmpool
    mode http 
    option redispatch
    option abortonclose 
    balance source 
    cookie SERVERID
    option httpchk GET /index.jsp
    server 237server 192.168.81.237:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3
    server iivey234 192.168.81.234:8080 cookie server2 weight 3 check inter 2000 rise 2 fall 3

cookie 识别

haproxy 将WEB 服务端发送给客户端的 cookie 中插入(或添加加前缀)haproxy 定义的后端的服务器COOKIE ID。

配置指令例举 cookie SESSION_COOKIE insert indirect nocache

backend htmpool
    mode http 
    option    redispatch
    option    abortonclose 
    balance  static-rr 
    cookie    SERVERID   #cookie参数
    option    httpchk GET /index.jsp
    server    237server 192.168.81.237:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3   #server里面的cookie参数
    server    iivey234 192.168.81.234:8080 cookie server2 weight 3 check inter 2000 rise 2 fall 3   #server里

  • 无标签
写评论...