美文网首页
HAProxy 配置文件参数说明以及命令参数说明

HAProxy 配置文件参数说明以及命令参数说明

作者: 河码匠 | 来源:发表于2024-08-06 14:23 被阅读0次

    HAProxy(High Availability Proxy)是一款流行的开源软件,提供高可用性、负载均衡和TCP及HTTP应用的代理服务。由于其高性能、可靠性和灵活性,它被广泛使用

    一、组件

    1. 前端(Frontend)

    • 定义了接收客户端请求的接口和端口。
    • 配置了接收请求的协议(如 HTTP 或 TCP)和接收请求的IP地址。
    • 可以配置 ACL(访问控制列表)和过滤器,以决定如何处理请求。

    1. 后端(Backend)

    • 定义了处理客户端请求的服务器池。
    • 包含了一组实际处理请求的服务器(称为后端服务器)。
    • 配置了负载均衡算法(如轮询、最少连接等),决定如何在服务器池中分发请求。

    3. 监听器(Listener)

    • 监听器位于前端,用于接收来自客户端的请求。
    • 每个监听器都绑定到一个特定的 IP 地址和端口。
    • 监听器将接收到的请求传递给前端进行处理。

    4. 服务器(Server)

    • 实际处理客户端请求的机器或服务。
    • 配置在后端中,作为后端服务器池的一部分。
    • 可以配置健康检查,确保服务器处于健康状态才能接收请求。

    15 ACL(访问控制列表)

    • 用于定义规则和条件,以决定如何处理请求。
    • 可以基于请求的内容、来源 IP、URL 等进行条件判断。
    • 常用于安全控制和流量管理。

    6. 健康检查(Health Check)

    • 用于监控后端服务器的健康状态。
    • 定期发送检查请求到后端服务器,以确保其正常运行。
    • 如果发现服务器不可用,则自动将其从服务器池中移除。

    二、配置文件说明

    global
        # 定义了日志记录的地址和级别
        log 127.0.0.1 local0 info
        # 将进程的根目录更改为指定目录,提高安全性
        chroot /containers/loadbalancer/xxxx/
        # 定义了统计信息的Unix套接字位置。
        # 通过这个套接字,你可以访问 HAProxy 的统计数据,包括连接数、会话数、错误率等,还可以进行一些管理操作,如启用或禁用服务器、调整参数等
        stats socket /containers/loadbalancer/xxxx/stats.sock
        # 指定运行 HAProxy 的用户和用户组。
        user haproxy
        group haproxy
        # 设置最大连接数为 100,000
        maxconn 100000
        # 调整最大接受连接数
        tune.maxaccept 100000
        # 设置默认的 DH 参数长度
        tune.ssl.default-dh-param 2048
        # 使 HAProxy 在后台运行
        daemon
        # 指定默认的 SSL 加密套件
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    
    defaults
        # 不记录健康检查日志
        option dontlognull
        # 失败后重试 3 次。
        retries 3
        # 允许重新调度到其他服务器。
        option redispatch
        # 设置默认最大连接数为 100,000。
        maxconn 100000
        # 设置客户端连接超时时间为 50 秒。
        timeout client 50s
        # 设置服务器连接超时时间为 50 秒。
        timeout server 50s
        # 设置连接超时时间为 5 秒。
        timeout connect 5s
        # 设置隧道连接超时时间为 1 小时。
        timeout tunnel 1h
    
    listen xxxx_443
        # 在所有 IPv4 和 IPv6 地址的 443 端口上监听。
        bind 0.0.0.0:443
        bind :::443
        # 设置为 TCP 模式。
        mode tcp
        # 使用轮询算法进行负载均衡。
        balance roundrobin
        # 禁用日志记录。
        no log
        # 设置客户端连接超时时间为 60 秒。
        timeout client 60s
        # 设置服务器连接超时时间为 60 秒。
        timeout server 60s
        # 定义了一个后端服务器,IP 为 10.1.16.58,端口为 443,权重为 10。健康检查间隔为 5000ms,连续 5 次成功认为服务器正常,连续 3 次失败认为服务器故障。
        server xxxx_443_vcir_443 10.1.16.58:443 weight 10 check inter 5000 rise 5 fall 3
    
    # 定义一个名为xxxx_8445的监听器
    listen xxxx_8445
        # 在所有IPv4地址的8445端口上监听
        bind 0.0.0.0:8445
        # 在所有IPv6地址的8445端口上监听
        bind :::8445
        # 设置为HTTP模式,用于处理HTTP请求
        mode http
        # 使用轮询算法进行负载均衡,将请求依次分发到后端服务器
        balance roundrobin
        # 使用全局日志设置
        log global
        # 定义自定义日志格式
        log-format "%Tl",%{+Q}ci,"%fi:%fp",%{+Q}bi,%{+Q}r,%ST,%B,%{+Q}hr,%Tt
        # 在请求头中添加X-Forwarded-For字段,记录客户端的原始IP地址
        option forwardfor
        # 在每个HTTP请求完成后,主动关闭服务器端的连接
        option http-server-close
        # 捕获HTTP请求头中的Host字段,最多记录255个字符
        capture request header Host len 255
        # 捕获HTTP请求头中的User-Agent字段,最多记录255个字符
        capture request header User-Agent len 255
        # 捕获HTTP请求头中的Referer字段,最多记录255个字符
        capture request header Referer len 255
        # 捕获HTTP请求头中的Cookie字段,最多记录255个字符
        capture request header Cookie len 255
        # 设置HTTP请求超时时间为10秒
        timeout http-request 10s
        # 设置HTTP保持连接超时时间为55秒
        timeout http-keep-alive 55s
        # xxxx_8445_xxx_8445: 服务器名称。
        # 192.168.10.3:8445: 服务器IP地址和端口号。
        # cookie xxx_8445: 设置用于会话保持的Cookie值。
        # weight 10: 设置服务器的权重,值越大,服务器获得的请求越多。
        # check: 启用对该服务器的健康检查。
        # inter 5000: 设置健康检查的间隔时间为5000毫秒(5秒)。
        # rise 5: 设置服务器被认为健康前必须连续成功的检查次数为5次。
        # fall 3: 设置服务器被认为不健康前必须连续失败的检查次数为3次。
        server xxxx_8445_xxx_8445 192.168.10.3:8445 cookie xxx_8445 weight 10 check inter 5000 rise 5 fall 3
        server xxxx_8445_xxx_8445 192.168.10.4:8445 cookie xxx_8445 weight 10 check inter 5000 rise 5 fall 3
    

    三、参数选项说明

    1. option 启用或禁用一些预定义的选项

    参数 说明
    dontlognull 不记录空连接的日志。

    空连接通常是指连接建立后没有发送任何数据就关闭的连接,这种连接通常没有意义,所以不记录可以减少日志的冗余信息。
    redispatch 如果请求在重试时,当前服务器已不可用,则将其重新分配到其他可用的服务器。
    这对于避免请求失败非常有用。
    http-server-close 在完成每个请求后,主动关闭服务器端的连接。

    这有助于节省资源,特别是在长时间保持的连接上。
    forwardfor [except <network>] [header <name>] 在请求头中添加 X-Forwarded-For 字段,用于记录原始客户端的 IP 地址。

    可选地,可以排除某些网络或使用自定义的请求头名。
    httpclose 在每个 HTTP 请求完成后,主动关闭客户端的连接。
    这对某些需要短连接的应用有帮助。
    httplog 使用 HTTP 格式记录日志信息,包含详细的 HTTP 请求和响应信息。
    tcplog 使用 TCP 格式记录日志信息,适用于 TCP 模式下的流量。
    log-separate-errors 将错误信息单独记录到日志中,便于分析和排查问题。
    tcp-smart-accept 启用智能接受功能,优化 TCP 连接的处理。
    tcp-smart-connect 启用智能连接功能,优化 TCP 连接的建立。

    2. balance 指定负载均衡算法,决定如何在后端服务器之间分配传入的请求

    负载均衡算法 说明 示例
    roundrobin 按顺序将请求分发给每个服务器,这是最简单的负载均衡算法,适用于负载较均匀的场景。 balance roundrobin
    leastconn 将请求分发给当前连接数最少的服务器。适用于长连接应用,如数据库连接。 balance leastconn
    source 基于请求源IP地址进行负载均衡。

    相同IP的请求会分发给同一台服务器,适用于需要保持会话的应用。
    balance source
    uri 基于请求的 URI(Uniform Resource Identifier)进行负载均衡。

    相同URI的请求会分发给同一台服务器,适用于需要缓存的应用。
    balance uri
    balance uri whole|len <length>|depth <depth>, 可选择使用整个 URI 或部分 URI。
    url_param 基于请求的 URL 参数进行负载均衡。

    相同参数值的请求会分发给同一台服务器。
    balance url_param <parameter>
    <parameter> 指定 URL 中的参数名。
    hdr 基于指定 HTTP 头进行负载均衡。

    相同 HTTP 头的请求会分发给同一台服务器。
    balance hdr(<header>)
    <header> 指定 HTTP 头的名称。
    rdp-cookie 基于 Microsoft Remote Desktop Protocol (RDP) Cookie 进行负载均衡。

    适用于 RDP 服务。
    balance rdp-cookie <name>
    <name> 指定 RDP Cookie 的名称。

    3. mode 指定处理流量的模式

    参数 说明 特性
    http 处理 HTTP 流量。

    适用于需要解析 HTTP 请求和响应的场景。
    可以使用 HTTP 头进行路由和负载均衡。

    支持 HTTP 重写和重定向。

    支持 HTTP 缓存。
    tcp 处理 TCP 流量。

    适用于基于 TCP 协议的应用,如数据库、邮件服务器等。
    不解析应用层数据,只处理传输层的 TCP 流量。

    更适合需要低延迟和高吞吐量的场景。
    health 用于健康检查。

    主要用于检查后端服务器的健康状态,而不是实际转发流量。
    仅用于健康检查,不转发任何应用流量。

    可以配置简单的 HTTP 或 TCP 健康检查。

    4. capture 捕获并记录HTTP请求和响应中的特定字段

    参数 说明 示例
    capture request header 捕获 HTTP 请求头中的指定字段。 语法: capture request header <name> len <length>

    示例: capture request header Host len 20
    捕获 HTTP 请求头中的 Host 字段,最多记录 20 个字符。
    capture response header 捕获 HTTP 响应头中的指定字段。 语法: capture response header <name> len <length>

    示例: capture response header Set-Cookie len 100
    捕获 HTTP 响应头中的 Set-Cookie 字段,最多记录 100 个字符。
    capture request cookie 捕获 HTTP 请求中的指定 Cookie。 语法: capture request cookie <name> len <length>

    示例: capture request cookie session_id len 30
    捕获HTTP请求中的 session_id Cookie,最多记录 30 个字符。
    capture response cookie 捕获 HTTP 响应中的指定 Cookie。 语法: capture response cookie <name> len <length>

    示例: capture response cookie auth_token len 50
    捕获 HTTP 响应中的 auth_token Cookie,最多记录 50 个字符。

    5. timeout 定义各种操作的超时时间

    参数 说明 示例
    client 定义客户端连接的最大空闲时间。

    如果客户端在指定时间内没有发送任何数据,连接将被关闭。
    示例: timeout client 50s
    解释: 设置客户端连接的超时时间为50秒。
    server 定义服务器连接的最大空闲时间。

    如果服务器在指定时间内没有发送任何数据,连接将被关闭。
    示例: timeout server 50s
    解释: 设置服务器连接的超时时间为50秒。
    connect 定义连接到后端服务器的最大时间。

    如果在指定时间内无法建立连接,连接将失败。
    示例: timeout connect 5s
    解释: 设置连接到服务器的超时时间为5秒。
    http-request 定义HTTP请求的最大处理时间。

    如果在指定时间内请求未完成,连接将被关闭。
    示例: timeout http-request 10s
    解释: 设置HTTP请求的超时时间为10秒。
    http-keep-alive 定义HTTP保持连接的最大空闲时间。

    如果在指定时间内没有新的请求到达,连接将被关闭。
    示例: timeout http-keep-alive 55s
    解释: 设置HTTP保持连接的超时时间为55秒。
    tunnel 定义隧道模式连接的最大时间,适用于长时间运行的连接,如WebSocket或TCP隧道。 示例: timeout tunnel 1h
    解释: 设置隧道模式连接的超时时间为1小时。
    queue 定义请求在队列中等待的最大时间。

    如果请求在指定时间内未能分配到后端服务器,连接将失败。
    示例: timeout queue 30s
    解释: 设置队列超时时间为30秒。
    tarpit 定义tar pit超时时间,用于延迟处理恶意请求。

    连接将在指定时间内保持打开,然后被关闭。
    示例: timeout tarpit 60s
    解释: 设置tar pit的超时时间为60秒。
    client-fin 定义在客户端关闭连接后,等待客户端发送FIN报文的最大时间。 示例: timeout client-fin 5s
    解释: 设置等待客户端FIN报文的超时时间为5秒。
    server-fin 定义在服务器关闭连接后,等待服务器发送FIN报文的最大时间。 示例: timeout server-fin 5s
    解释: 设置等待服务器FIN报文的超时时间为5秒。

    6. 日志

    • log 参数说明
    log <address> <facility> [<level>]
    
    参数 说明
    <address> 指定日志服务器的地址,可以是 IP 地址或 Unix 域套接字。
    <facility> 指定日志设施,用于分类日志信息。

    常见的设施包括:
    local0local7: 用户自定义日志设施。系统管理员可以将不同的应用程序或服务的日志信息发送到不同的local设施,以便于日志管理和分析。
    daemon: 通常用于守护进程(后台服务)的日志。适用于系统级别的服务或应用程序
    authauthpriv: 用于认证和授权日志。适用于记录登录、身份验证等相关事件。
    cron: 用于定时任务(cron jobs)的日志。适用于记录定时任务的执行情况。
    kern: 用于内核消息的日志。适用于记录与内核相关的事件和错误。
    mail: 用于邮件系统的日志。适用于记录邮件服务器和邮件传输相关的事件。
    syslog: 用于syslog守护进程的日志。适用于记录syslog服务本身的活动。
    user: 用于一般用户级消息的日志。适用于记录普通用户应用程序的事件。
    uucp: 用于 Unix-to-Unix 复制协议(UUCP)系统的日志。适用于记录 UUCP 活动。
    ftp: 用于FTP服务的日志。适用于记录FTP服务器的活动和错误。
    <level> 可选参数,指定日志级别,用于过滤日志信息。

    常见的级别包括:
    emerg 系统不可用。
    alert 必须立即处理的问题。
    crit 严重问题。
    err 错误事件。
    warning 警告事件。
    notice 正常但需要注意的事件。
    info 信息事件。
    debug 调试信息。

    默认情况下,所有级别的日志信息都会被记录。
    • log-format 定义自定义日志格式。
    参数 说明
    %Tl 日志时间戳(本地时间)。
    %ci 客户端IP地址。
    %cp 客户端端口。
    %t 日期和时间。
    %ft 前端名称。
    %b 后端名称。
    %s 服务器名称。
    %TR 等待服务器响应的时间。
    %Tw 等待服务器连接的时间。
    %Tc 等待HTTP请求的时间。
    %Tr 等待客户端读取的时间。
    %Ta 总时间。
    %ST HTTP状态码。
    %B 发送的字节数。
    %tsc 日志的状态代码。
    %ac 活动连接数。
    %fc 前端的连接数。
    %bc 后端的连接数。
    %sc 服务器的连接数。
    %rc 重试的连接数。
    %sq 等待队列中的请求数(服务器)。
    %bq 等待队列中的请求数(后端)。
    %hr HTTP请求头。
    %hs HTTP响应头。

    7. server 后端服务器定义参数说明

    server <name> <address>[:port] [param*]
    

    param 参数说明

    参数 说明 示例
    weight <value> 设置服务器的权重,值越大,服务器获得的请求越多。

    默认值是 1
    weight 10
    check 启用对该服务器的健康检查。

    如果服务器不可用,HAProxy 将不会将请求转发给它。
    check
    inter <interval> 设置健康检查的间隔时间,单位是毫秒。

    默认值是 2000ms
    inter 5000
    rise <count> 设置服务器被认为健康前必须连续成功的检查次数。 rise 3
    fall <count> 设置服务器被认为不健康前必须连续失败的检查次数。 fall 2
    maxconn <number> 设置服务器的最大连接数。 maxconn 100
    backup 将服务器标记为备份服务器,只有在主服务器不可用时才会使用。 backup
    ssl 启用 SSL/TLS 加密连接。 ssl
    verify [none|optional|required] 设置 SSL/TLS 客户端证书验证策略。 verify none
    redir <url> 将请求重定向到指定的 URL。 redir https://www.example.com

    三、haproxy 命令参数说明

    参数 说明 示例
    -f <config_file> 指定 HAProxy 的配置文件。 haproxy -f /etc/haproxy/haproxy.cfg
    -D 使 HAProxy 以守护进程模式运行。 haproxy -D
    -p <pid_file> 指定 PID 文件的路径。 haproxy -p /run/haproxy.pid
    -sf <pid1> [<pid2> ...] 进行优雅重启或关闭。 haproxy -sf 12345
    -q 安静模式,禁用启动消息。 haproxy -q
    -V 详细模式,显示启动过程中的详细信息。 haproxy -V
    -c 仅检查配置文件的语法。 haproxy -c -f /etc/haproxy/haproxy.cfg
    -n <maxconn> 设置最大连接数。 haproxy -n 2000
    -db 禁用后台模式,强制前台运行。 haproxy -db
    -d 启用调试模式。 haproxy -d
    -m <value> 设置内存分配的上限(单位 MB)。 haproxy -m 512
    -L <localpeer> 为进程设置本地名称。 haproxy -L myproxy
    -x <socket> 指定一个现有的 HAProxy 统计套接字。 haproxy -x /run/haproxy/admin.sock
    -v 显示版本信息。 haproxy -v
    -vv 显示已知的构建选项。 haproxy -vv
    -dM[<byte>] 使用指定字节填充内存(默认为0x50)。 haproxy -dM0x50
    -C <dir> 在加载文件之前更改工作目录。 haproxy -C /path/to/dir
    -W 启用主-工作模式。 haproxy -W
    -Ws 启用具有 systemd 通知支持的主-工作模式。 haproxy -Ws
    -N <maxconn> 设置每个代理的默认最大连接数。 haproxy -N 2000
    -de 禁用 epoll() 使用,即使可用。 haproxy -de
    -dp 禁用 poll() 使用,即使可用。 haproxy -dp
    -dS 禁用 splice 使用(在旧内核上可能有问题)。 haproxy -dS
    -dG 禁用 getaddrinfo() 使用。 haproxy -dG
    -dR 禁用 SO_REUSEPORT 使用。 haproxy -dR
    -dr 忽略服务器地址解析失败。 haproxy -dr
    -dV 禁用服务器端的 SSL 验证。 haproxy -dV

    四、示例

    假设我们有一个 HAProxy 配置文件在 /etc/haproxy/haproxy.cfg,并且我们希望以守护进程模式启动 HAProxy,同时将进程 ID 写入 /run/haproxy.pid,使用以下命令:

    haproxy -f /etc/haproxy/haproxy.cfg -D -p /run/haproxy.pid
    

    如果我们需要在不实际启动 HAProxy 的情况下检查配置文件的语法,可以使用以下命令:

    haproxy -c -f /etc/haproxy/haproxy.cfg
    

    如果我们想要在启动 HAProxy 时启用详细模式,并设置最大连接数为 2000,可以使用

    haproxy -f /etc/haproxy/haproxy.cfg -V -n 2000
    

    相关文章

      网友评论

          本文标题:HAProxy 配置文件参数说明以及命令参数说明

          本文链接:https://www.haomeiwen.com/subject/nlmtkjtx.html