Centos7安装haproxy2.7实现4层与7层负载均衡

举报
江晚正愁余 发表于 2024/03/12 10:52:02 2024/03/12
【摘要】 Centos7安装haproxy2.7实现4层与7层负载均衡一,集群方案简介1,集群1.1 负载均衡集群lvs 四层负载nginx 4层负载,七层负载 haproxy 四层或七层负载slb 云主机服务,付费F5 硬件设备,付费1.2 高可用集群keepalived2,haproxy简介HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP...

Centos7安装haproxy2.7实现4层与7层负载均衡

一,集群方案简介

1,集群

1.1 负载均衡集群

lvs 四层负载nginx 4层负载,七层负载 haproxy 四层或七层负载slb 云主机服务,付费F5 硬件设备,付费

1.2 高可用集群

keepalived

2,haproxy简介

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy的社区非常活跃,版本更新快速。最关键的是,HAProxy具备媲美商用负载均衡器的性能和稳定性。

3,HAProxy的核心能力和关键特性

3.1 HAProxy的核心功能

  • 负载均衡:L4和L7两种模式,支持RR/静态RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash等丰富的负载均衡算法
  • 健康检查:支持TCP和HTTP两种健康检查模式
  • 会话保持:对于未实现会话共享的应用集群,可通过Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种Hash方式实现会话保持
  • SSL:HAProxy可以解析HTTPS协议,并能够将请求解密为HTTP后向后端传输
  • HTTP请求重写与重定向
  • 监控与统计:HAProxy提供了基于Web的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控HAProxy的状态

3.2 HAProxy的关键特性

3.2.1 性能
  • 采用单线程、事件驱动、非阻塞模型,减少上下文切换的消耗,能在1ms内处理数百个请求。并且每个会话只占用数KB的内存。
  • 大量精细的性能优化,如O(1)复杂度的事件检查器、延迟更新技术、Single-buffereing、Zero-copy forwarding等等,这些技术使得HAProxy在中等负载下只占用极低的CPU资源。
  • HAProxy大量利用操作系统本身的功能特性,使得其在处理请求时能发挥极高的性能,通常情况下,HAProxy自身只占用15%的处理时间,剩余的85%都是在系统内核层完成的。
  • 单个HAProxy进程的处理能力突破了10万请求/秒,并轻松占满了10Gbps的网络带宽。
3.2.2 稳定性

作为建议以单进程模式运行的程序,HAProxy对稳定性的要求是十分严苛的。HAProxy在13年间从未出现过一个会导致其崩溃的BUG,HAProxy一旦成功启动,除非操作系统或硬件故障,否则就不会崩溃。


二,HaProxy配置

 

1,环境介绍

应用名称 负载均衡IP 负载均衡服务端口 HAPROXY工作模式 后端IP 后端服务端口 后端服务软件 主机系统  
haproxy 192.168.1.247 8087 四层tcp 192.168.1.252 8081 ,8082 redis Centos7  
haproxy 192.168.1.247 8088 七层http 192.168.1.252 6379,6380 nginx Centos7  
haproxy 192.168.1.247 8089/stats 监控页面       Centos7  

这里 192.168.1.252主机已经安装好docker环境,使用docker安装了两个nginx,两个redis。

haproxy 通过代理tcp端口8087负载到redis,通过http 8088 负载到nginx。8089端口使用监控页面。

 

2,编译过程

2.1 系统最小化安装与配置







yum groups install "Development Tools"
# 安装开发环境工具包

yum install -y  pcre pcre-devel openssl-devel systemd-devel
# 安装依赖软件包

rpm -ivh http://www.nosuchhost.net/~cheese/fedora/packages/epel-7/x86_64/cheese-release-7-1.noarch.rpm
yum install -y lua lua-devel
# 更新lua软件包

[root@os-247 ~ ]#cat /etc/selinux/config 
SELINUX=disabled
SELINUXTYPE=targeted 
#关闭selinux,并重启系统

wget https://www.haproxy.org/download/2.7/src/haproxy-2.7.1.tar.gz
tar -zxvf haproxy-2.7.1.tar.gz -C /data/
cd /data/haproxy-2.7.1
make -j $(grep 'processor' /proc/cpuinfo |wc -l)  TARGET=linux-glibc  USE_OPENSSL=1  USE_ZLIB=1  USE_PCRE=1  USE_SYSTEMD=1
make install PREFIX=/data/haproxy
mkdir /data/haproxy/etc/
touch /data/haproxy/etc/haproxy.cfg
# 将haproxy软件安装到 /data/haproxy目录,当然也可以安装到默认位置,再创建配置文件 /data/haproxy/etc/haproxy.cfg
# 配置文件内容参考后面文章

echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.d/99-sysctl.conf 
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/99-sysctl.conf 
sysctl -p
# 配置系统内核参数,启用数据包转发


2.2 日志配置








 日志文件配置

vim /etc/rsyslog.conf

# 去掉下列注释:
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerAddress *
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

# 在添加如下内容:

# Save haproxy messages also to haproxy.log
local2.* /var/log/haproxy.log
 

# 重起日志服务
systemctl enable --now rsyslog 
systemctl restart rsyslog 

# 启动haproxy服务
systemctl restart haproxy.service

 

3,配置文件解析







#--------------全局配置----------------
global
    log 127.0.0.1:514 local2 info    # 日志级别: emerg alert crit err warning notice info debug,采用info会打印大量日志,建议采用notice,日志发送到本机rsyslog服务
    maxconn 51200                    # 最大连接数
    chroot /data/haproxy/empty
#    pidfile /data/haproxy/haproxy.pid  # 启动服务配置此次项,这里配置无效
    user haproxy
    group haproxy
    daemon
    ulimit-n 1020000
#---------------------------------------------------------------------
#common defaults that all the 'listen' and 'backend' sections will
#use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode http                    #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
    log global
    option dontlognull
    option redispatch            #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
    option abortonclose          #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
    option httplog               #日志类别,采用httplog
    option httpclose             #每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟这种模式的实现
#   option forwardfor            #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
    balance roundrobin           ##banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数  
    timeout connect 5000ms       #连接超时   可用单位 ms,s等
    timeout client 30s           #客户端超时
    timeout server 30s           #服务器超时
    #timeout check 2000          #=心跳检测超时
#   maxconn 60000                #默认的最大连接数
    retries 3                    #三次连接失败就认为是服务器不可用,也可以通过后面设置
    
#--------------统计页面配置------------------
listen stats
    bind 0.0.0.0:8089
    stats enable
    mode http
    log global                         #option httplog #采用http日志格式
    stats uri /stats                   #统计页面url
    stats realm Haproxy\ Statistics    #统计页面密码框上提示文本
    stats auth admin:admin             #统计页面用户名和密码设置
    stats hide-version                #隐藏统计页面上HAProxy的版本信息
    stats admin if TRUE
    stats refresh 30s                  #统计页面自动刷新时间
#---------------web设置-----------------------

listen webcluster
    bind *:8088
    mode http                        
    option httpchk GET /index.html     #后端主机健康检测采用七层http协议检测,server中需要添加check,如果后台index.html访问不到就不再分发给它,也可以不用填写访问路径
    log global                         #日志采用全局配置模式
    maxconn 6000
    option forwardfor
    option httpclose
    balance roundrobin
    cookie SESSION_COOKIE insert indirect nocache #会话保持策略,insert名为"SESSION_COOKIE"的cookie ,请求定向到该server时会在响应中写入cookie值www02那么只会转到web02主机
    server web01 192.168.1.252:8802 weight 2 cookie www01 check  maxconn 4000
    server web02 192.168.1.252:8801 weight 4 cookie www02 check inter 2000 fall 3 rise 2 maxconn 4000
    
    #check后指定inter, rise, fall三个参数,分别代表健康检查的周期、连续几次成功认为server UP,连续几次失败认为server DOWN,默认值是inter 2000ms rise 2 fall 3,可以省略

frontend webserver
    bind *:8086
    option forwardfor
    maxconn 10
    use_backend     server03
    default_backend webserver      #这里指导默认使用后端主机


backend webserver
    fullconn 6
    balance roundrobin
    option httpchk GET /index.html
#   default-server check          #采用默认检测配置,会使用4层协议检测后端健康状态,server添加check也是采用4层协议检测
    server webs01 192.168.1.252:8803 maxconn 3 minconn 1 check
    server webs02 192.168.1.252:8804 maxconn 3 minconn 1 check



listen rediscluster
    bind 192.168.1.247:8087
    mode tcp 
    option tcplog
    maxconn 10000
    fullconn 8000
    balance leastconn              # tcp代理建议使用最小连接
    timeout server 15s
    timeout connect 15s
#    default-server check          #采用默认检测配置,tcp转发会使用4层协议检测后端健康状态,server添加check也是采用4层协议检测
    server redis01 192.168.1.252:6381 weight 2 check maxconn 5000
    server redis02 192.168.1.252:6380 weight 2 check maxconn 5000
    
    
listen https
    bind 0.0.0.0:443
    mode tcp
    option tcp-check        #这里是将ssl当成tcp转发
    tcp-check connect
    option tcplog
    balance  roundrobin 
    server web01 192.168.1.252:5500  check inter 2s fall 3 rise 3
    server web02 192.168.1.252:8001  check inter 2s fall 3 rise 3

    

frontend httpsite
    bind *:8090
    bind *:80
    maxconn 800
    option forwardfor
    # acl第一次匹配后,后面的不再生效
    acl cluster01 hdr_dom(host) web01.cc  web02.cc              #创建规则cluster01,匹配域名web01.cc,如Host: web01.com:8090
    acl cluster02 hdr_dom(host) web03.cc                        #创建规则cluster02,匹配域名web03.cc
    acl cls03     hdr_dom(host) -m beg web.
    acl www01     hdr_beg(host) -m beg www01.
    acl www02     hdr_beg(host)        www02.  img. ftp.
    acl www03     hdr_dom(host)        www03. 
    acl www04     hdr(host)     -m beg www04. txt              # -m 匹配模式,参数:beg,end,str,dir,dom等
    acl www05     hdr_beg(host) -i www05.                      # -i,忽略大小写 
#    acl cls06     hdr_end(host) -i -m sub .com                # 使用hdr_end(host) 需要使用-m sub,字符串中查找模式,但不是匹配以.com结尾,如: www.comm.link也匹配,效果类似hdr_reg(host) -i   \.com
#    acl cls07     hdr(host) -i -m end .link:8090               # header中指定匹配内容end ,Host参数中端口号也要匹配
#    acl cls08     hdr_end(host) -i   .com:8090                  # header中指定匹配内容end ,Host参数中端口号也要匹配    
    acl cls09     hdr_reg(host) -i   \.com                     # 正规匹配.com
    acl cls10     hdr_dom(host) -i -m reg  \.cn$                   # 正规匹配.cn结尾,但是只能使用443或是80端口
#    acl ui_url    path_beg     -i   /ui/
    acl img_url   path_beg      -i  /img
    acl htm       path_end      -i .htm .php .jsp
    acl html      path_end      -i .html
    use_backend serverweb01 if cluster01                      #当访问域名web01.cc时适用规则cluster01,转发到后端serverweb01主机上
        redirect prefix     http://micoder.cc if cluster02      #匹配后跳转,类似于rewrite
#    use_backend serverweb02 if cluster02                      #当访问域名web03.cc时适用规则cluster02,转发到后端serverweb03主机上
    use_backend serverweb02 if { path_beg /ui/ }              #这里配置匹配规则时,acl就不用配置
    use_backend serverweb01 if img_url
    use_backend serverweb01 if cls03
    use_backend serverweb01 if www01
    use_backend serverweb01 if www02
    use_backend serverweb02 if www03
    use_backend serverweb02 if www04
#    use_backend serverweb01 if cls06
#    use_backend serverweb01 if cls07
#    use_backend serverweb01 if cls08
    use_backend serverweb01 if cls09
    use_backend serverweb01 if cls10
#    use_backend serverweb01 if { path_end .html }  #这里配置匹配规则时,acl就不用配置
#    use_backend serverweb02 if htm

      
    
    
    
backend serverweb01
    fullconn 6
    balance roundrobin
    option httpchk GET /index.html
    server webs01 192.168.1.252:8803 maxconn 3 minconn 1 check
    server webs02 192.168.1.252:8804 maxconn 3 minconn 1 check
    
    
backend serverweb02
    fullconn 6
    balance roundrobin
    option httpchk GET /index.html
    server webs01 192.168.1.252:8801 maxconn 3 minconn 1 check
    server webs02 192.168.1.252:8802 maxconn 3 minconn 1 check
    
    
backend server03
    fullconn 6
    balance roundrobin
    option httpchk GET /index.html   
    server webs01 192.168.1.252:8801 redir http://www.s3b.cn:8801 weight 10 rise 3 fall 3 check inter 2000
    server webs02 192.168.1.252:8802 redir http://www.s3c.cn:8802 weight 10 rise 3 fall 3 check inter 2000
    
# 匹配后端主机后,转发到域名
    

    
#  定义ACL匹配规范
#  hdr([<name> [,<occ>]]):完全匹配字符串,header的指定信息
#  hdr_beg([<name> [,<occ>]]):前缀匹配,header中指定匹配内容的begin
#  hdr_end([<name> [,<occ>]]):后缀匹配,header中指定匹配内容end ,Host参数中端口号也要匹配
#  hdr_dom([<name> [,<occ>]]):域匹配,header中的domain name
#  hdr_dir([<name> [,<occ>]]):路径匹配,header的uri路径
#  hdr_len([<name> [,<occ>]]):长度匹配,header的长度匹配
#  hdr_reg([<name> [,<occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配
#  hdr_sub([<name> [,<occ>]]):子串匹配,header中的uri模糊匹配
#  dst 目标IP
#  dst_port 目标PORT
#  src 源IP
#  src_port 源PORT
#  示例:
#  hdr(<string>) 用于测试请求头部首部指定内容
#  hdr_dom(host) 请求的host名称,如 www.magedu.com
#  hdr_beg(host) 请求的host开头,如 www. img. video. download. ftp.
#  hdr_end(host) 请求的host结尾,如 .com .net .cn
#  path_beg 请求的URL开头,如/static、/images、/img、/css
#  path_end 请求的URL中资源的结尾,如 .gif .png .css .js .jpg .jpeg
#  有些功能是类似的,比如以下几个都是匹配用户请求报文中host的开头是不是www:
#  acl short_form hdr_beg(host) www.
#  acl alternate1 hdr_beg(host) -m beg www.
#  acl alternate2 hdr_dom(host) -m beg www.
#  acl alternate3 hdr(host) -m beg www.


#  字符比较:
#    -exact match (-m str):
#      字符串必须完全匹配模式
#    -substring match (-m sub):
#      在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配
#    -prefix match (-m beg):
#      在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配
#    -suffix match (-m end):
#      将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行匹配
#    -subdirmatch (-m dir):
#      查看提取出来的用斜线分隔("/")的字符串,如果其中任何一个匹配,则ACL进行匹配
#    -domain match (-m dom):
#      查找提取的用点(".")分隔字符串,如果其中任何一个匹配,则ACL进行匹配

#  多个acl作为条件时的逻辑关系:
#  与:
#    隐式(默认)使用,如"if valid_src valid_port"   
#  或:
#    使用"or"或"||"表示,如"if invalid_src || invalid_port"   
#  否定:
#    使用"!"表示,如"if ! invalid_src" 


 

4,服务脚本







#创建service文件
[root@centos7 haproxy]#  vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
ExecStartPre=/data/haproxy/sbin/haproxy -f /data/haproxy/etc/haproxy.cfg   -c -q
ExecStart=/data/haproxy/sbin/haproxy -Ws -f /data/haproxy/etc/haproxy.cfg  -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2 

[Install]
WantedBy=multi-user.target
 
[root@centos7 haproxy] # systemctl daemon-reload


-f 指定配置文件
-c 检查
-q 静默模式
-p 指定pid

 

三,配置选项解析

1,haproxy配置文件haproxy.cfg







haproxy的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分
global:全局配置段
    进程及安全配合相关的参数
    性能调整相关参数
    DEBUG参数
rpoxies:代理配置段
    defaults:为frontend,backend,listen提供默认配置
    frontend:前端,相当于nginx中的server {}
    backend:后端,相当于nginx中的upstream {}
    listen:同时拥有前端和后端配置,配置简单,生产推荐使用

 

2,global配置参数说明







chroot    #锁定运行目录
deamon  #以守护进程运行
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin process 1    #socket文件
user, group, uid, gid  #运行haproxy的用户身份
nbproc n    #开启的haproxy worker进程数,一般和cpu个数匹配
cpu-map 1 0   #绑定haproxy worker 进程至指定CPU,将第1个work进程绑定至0号CPU
cpu-map 2 1   #绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1号CPU
maxconn n       #每个haproxy进程的最大并发连接数
maxconnrate n   #每个进程每秒创建的最大连接数量
spread-checks n #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
pidfile            #指定pid文件路径
log 127.0.0.1    local2 info        #定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个

 

3,proxies配置







defaults [<name>] #默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontend <name>   #前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。
backend <name>   #后端服务器组,等于nginx的upstream和LVS中的RS服务器
listen   <name>   #将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用

 

4,proxies配置-defaults







defaults 配置参数,不需要改动:
option redispatch     #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose   #当服务器负载很高时,自动结束掉当前队列处理比较久的连接,针对业务情况选择开启
option http-keep-alive #开启与客户端的会话保持
option forwardfor     #透传客户端真实IP至后端web服务器
mode http|tcp #设置默认工作类型,使用TCP服务器性能更好,减少压力
timeout http-keep-alive 120s #session 会话保持超时时间,此时间段内会转发到相同的后端服务器
timeout connect 120s #客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单位ms
timeout server 600s #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如果超时,会出现502错误,此值建议设置较大些,访止502错误
timeout client 600s #设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同
timeout check   5s   #对后端服务器的默认检测超时时间
default-server inter 1000 weight 3   #指定后端服务器的默认设置


5,proxies配置-listen简化版配置







使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用

[root@centos7 ~]# vim /etc/haproxy/haproxy.cfg
listen WEB_PORT_80
    bind 10.0.0.7:80
    mode http
    option forwardfor   #透传客户端真实IP至后端web服务器
    server web1 10.0.0.18:80 check inter 3000 fall 2 rise 5

 

6,proxies配置-fronted







frontend 配置参数:
bind:    #指定haproxy的监听地址,可以同时监听多个IP或端口,可同时用于listen字段中
#格式
bind [<address>]:<port_range> [, ...] [param*]
#注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1
backlog <backlog> #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注意:不支持backend
范例:
listen http_proxy #监听http的多个IP的多个端口和sock文件
   bind :80,:443,:8801-8810
   bind 10.0.0.1:10080,10.0.0.1:10443
   bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
listen http_https_proxy #https监听
   bind :80
   bind :443 ssl crt /etc/haproxy/site.pem #公钥和私钥公共文件
listen http_https_proxy_explicit #监听ipv6、ipv4和unix sock文件
   bind ipv6@:80
   bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pem
   bind unix@ssl-frontend.sock user root mode 600 accept-proxy
listen external_bind_app1         #监听file descriptor
   bind "fd@${FD_APP1}"
生产范例:
frontend magedu_web_port         #可以采用后面形式命名:业务-服务-端口号
   bind :80,:8080
   bind 10.0.0.7:10080,:8801-8810,10.0.0.17:9001-9010
   mode http|tcp                 #指定负载协议类型
   use_backend <backend_name>      #调用的后端服务器组名称

 

7,proxies配置-backend







定义一组后端服务器,backend服务器将被frontend进行调用。
注意: backend 的名称必须唯一,并且必须在listen或frontend中事先定义才可以使用,否则服务无法启动
mode http|tcp         #指定负载协议类型,和对应的frontend必须一致
option                 #配置选项
server               #定义后端real server,必须指定IP和端口
注意:option后面加 httpchk,smtpchk,mysql-check,pgsql-check,ssl-hello-chk方法,可用于实现更多应用层检测功能。
server 配置
#针对一个server配置
check                #对指定real进行监控状态检查,默认不开启
    addr <IP>       #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
    port <num>         #指定的健康状态监测端口
    inter <num>     #健康状态检查间隔时间,默认2000 ms
    fall <num>       #后端服务器从线上转为线下的检查的连续失效次数,默认为3
    rise <num>       #后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight>     #权重,默认为1
backup                #将后端服务器标记为备份状态,只有所有服务器宕机时提供服务,类似sorry server
disabled            #将后端服务器标记为不可用状态
redir http://www.baiud.com    #临时重定向(302)至其它URL,只适用于http模式
maxconn <maxconn>    #当前后端server的最大并发连接数

 

四,HAProxy关键配置详解

总览

HAProxy的配置文件共有5个域

  • global:用于配置全局参数
  • default:用于配置所有frontend和backend的默认属性
  • frontend:用于配置前端服务(即HAProxy自身提供的服务)实例
  • backend:用于配置后端服务(即HAProxy后面接的服务)实例组
  • listen:frontend+backend的组合配置,可以理解成更简洁的配置方法

global域的关键配置

  • daemon:指定HAProxy以后台模式运行,通常情况下都应该使用这一配置
  • user [username] :指定HAProxy进程所属的用户
  • group [groupname] :指定HAProxy进程所属的用户组
  • log [address] [device] [maxlevel] [minlevel]:日志输出配置,如log 127.0.0.1 local0 info warning,即向本机rsyslog或syslog的local0输出info到warning级别的日志。其中[minlevel]可以省略。HAProxy的日志共有8个级别,从高到低为emerg/alert/crit/err/warning/notice/info/debug
  • pidfile :指定记录HAProxy进程号的文件绝对路径。主要用于HAProxy进程的停止和重启动作。
  • maxconn :HAProxy进程同时处理的连接数,当连接数达到这一数值时,HAProxy将停止接收连接请求

frontend域的关键配置

  • acl [name] [criterion] [flags] [operator] [value]:定义一条ACL,ACL是根据数据包的指定属性以指定表达式计算出的true/false值。如"acl url_ms1 path_beg -i /ms1/"定义了名为url_ms1的ACL,该ACL在请求uri以/ms1/开头(忽略大小写)时为true
  • bind [ip]:[port]:frontend服务监听的端口
  • default_backend [name]:frontend对应的默认backend
  • disabled:禁用此frontend
  • http-request [operation] [condition]:对所有到达此frontend的HTTP请求应用的策略,例如可以拒绝、要求认证、添加header、替换header、定义ACL等等。
  • http-response [operation] [condition]:对所有从此frontend返回的HTTP响应应用的策略,大体同上
  • log:同global域的log配置,仅应用于此frontend。如果要沿用global域的log配置,则此处配置为log global
  • maxconn:同global域的maxconn,仅应用于此frontend
  • mode:此frontend的工作模式,主要有http和tcp两种,对应L7和L4两种负载均衡模式
  • option forwardfor:在请求中添加X-Forwarded-For Header,记录客户端ip
  • option http-keep-alive:以KeepAlive模式提供服务
  • option httpclose:与http-keep-alive对应,关闭KeepAlive模式,如果HAProxy主要提供的是接口类型的服务,可以考虑采用httpclose模式,以节省连接数资源。但如果这样做了,接口的调用端将不能使用HTTP连接池
  • option httplog:开启httplog,HAProxy将会以类似Apache HTTP或Nginx的格式来记录请求日志
  • option tcplog:开启tcplog,HAProxy将会在日志中记录数据包在传输层的更多属性
  • stats uri [uri]:在此frontend上开启监控页面,通过[uri]访问
  • stats refresh [time]:监控数据刷新周期
  • stats auth [user]:[password]:监控页面的认证用户名密码
  • timeout client [time]:指连接创建后,客户端持续不发送数据的超时时间
  • timeout http-request [time]:指连接创建后,客户端没能发送完整HTTP请求的超时时间,主要用于防止DoS类攻击,即创建连接后,以非常缓慢的速度发送请求包,导致HAProxy连接被长时间占用
  • use_backend [backend] if|unless [acl]:与ACL搭配使用,在满足/不满足ACL时转发至指定的backend

backend域的关键配置

  • acl:同frontend域
  • balance [algorithm]:在此backend下所有server间的负载均衡算法,常用的有roundrobin和source,完整的算法说明见官方文档configuration.html#4.2-balance
  • cookie:在backend server间启用基于cookie的会话保持策略,最常用的是insert方式,如cookie HA_STICKY_ms1 insert indirect nocache,指HAProxy将在响应中插入名为HA_STICKY_ms1的cookie,其值为对应的server定义中指定的值,并根据请求中此cookie的值决定转发至哪个server。indirect代表如果请求中已经带有合法的HA_STICK_ms1 cookie,则HAProxy不会在响应中再次插入此cookie,nocache则代表禁止链路上的所有网关和缓存服务器缓存带有Set-Cookie头的响应。
  • default-server:用于指定此backend下所有server的默认设置。具体见下面的server配置。
  • disabled:禁用此backend
  • http-request/http-response:同frontend域
  • log:同frontend域
  • mode:同frontend域
  • option forwardfor:同frontend域
  • option http-keep-alive:同frontend域
  • option httpclose:同frontend域
  • option httpchk [METHOD] [URL] [VERSION]:定义以http方式进行的健康检查策略。如option httpchk GET /healthCheck.html HTTP/1.1
  • option httplog:同frontend域
  • option tcplog:同frontend域
  • server [name] [ip]:[port] [params]:定义backend中的一个后端server,[params]用于指定这个server的参数,常用的包括有:

check:指定此参数时,HAProxy将会对此server执行健康检查,检查方法在option httpchk中配置。同时还可以在check后指定inter, rise, fall三个参数,分别代表健康检查的周期、连续几次成功认为server UP,连续几次失败认为server DOWN,默认值是inter 2000ms rise 2 fall 3cookie [value]:用于配合基于cookie的会话保持,如cookie ms1.srv1代表交由此server处理的请求会在响应中写入值为ms1.srv1的cookie(具体的cookie名则在backend域中的cookie设置中指定)maxconn:指HAProxy最多同时向此server发起的连接数,当连接数到达maxconn后,向此server发起的新连接会进入等待队列。默认为0,即无限maxqueue:等待队列的长度,当队列已满后,后续请求将会发至此backend下的其他server,默认为0,即无限weight:server的权重,0-256,权重越大,分给这个server的请求就越多。weight为0的server将不会被分配任何新的连接。所有server默认weight为1

  • timeout connect [time]:指HAProxy尝试与backend server创建连接的超时时间
  • timeout check [time]:默认情况下,健康检查的连接+响应超时时间为server命令中指定的inter值,如果配置了timeout check,HAProxy会以inter作为健康检查请求的连接超时时间,并以timeout check的值作为健康检查请求的响应超时时间
  • timeout server [time]:指backend server响应HAProxy请求的超时时间

default域

上文所属的frontend和backend域关键配置中,除acl、bind、http-request、http-response、use_backend外,其余的均可以配置在default域中。default域中配置了的项目,如果在frontend或backend域中没有配置,将会使用default域中的配置。

listen域

listen域是frontend域和backend域的组合,frontend域和backend域中所有的配置都可以配置在listen域下

定义ACL匹配规范







定义ACL匹配规范
hdr([<name> [,<occ>]]):完全匹配字符串,header的指定信息
hdr_beg([<name> [,<occ>]]):前缀匹配,header中指定匹配内容的begin
hdr_end([<name> [,<occ>]]):后缀匹配,header中指定匹配内容end
hdr_dom([<name> [,<occ>]]):域匹配,header中的domain name
hdr_dir([<name> [,<occ>]]):路径匹配,header的uri路径
hdr_len([<name> [,<occ>]]):长度匹配,header的长度匹配
hdr_reg([<name> [,<occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配
hdr_sub([<name> [,<occ>]]):子串匹配,header中的uri模糊匹配
dst 目标IP
dst_port 目标PORT
src 源IP
src_port 源PORT
示例:
hdr(<string>) 用于测试请求头部首部指定内容
hdr_dom(host) 请求的host名称,如 www.magedu.com
hdr_beg(host) 请求的host开头,如 www. img. video. download. ftp.
hdr_end(host) 请求的host结尾,如 .com .net .cn
path_beg 请求的URL开头,如/static、/images、/img、/css
path_end 请求的URL中资源的结尾,如 .gif .png .css .js .jpg .jpeg
有些功能是类似的,比如以下几个都是匹配用户请求报文中host的开头是不是www:
acl short_form hdr_beg(host) www.
acl alternate1 hdr_beg(host) -m beg www.
acl alternate2 hdr_dom(host) -m beg www.
acl alternate3 hdr(host) -m beg www.
acl alternate3 hdr_end -m end .com
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。