Haproxy入门实践

1.Haproxy基本概念

1.什么是Haproxy

  • 它仅提供proxy代理功能,不提供任何HA高可用的功能
  • 但Haproxy可对后端节点进行状态检查,一旦后端节点出现故障,haproxy则会将请求重新分发.

2.Haproxy应用场景

  • Haproxy支持http反向代理
  • Haproxy支持动态程序的反向代理
  • Haproxy支持基于tcp数据库的反向代理

2.Haproxy安装

2.1使用yum命令安装rpm包

  • CentOS7默认的base仓库中包含haproxy的安装文件包,但版本过低1.5.18比较陈旧,一般不使用
yum install -y haproxy
haproxy -v    #查看详情

2.2 使用三方rpm安装

  • 可以通过第三方仓库安装比较新的rpm包 —> 第三方rpm包“https://repo.ius.io/
[root@proxy ~]# wget http://cdn.xuliangwei.com/haproxy22.rpm.tar.gz
[root@proxy ~]# tar xf haproxy22.rpm.tar.gz
[root@proxy ~]# yum localinstall haproxy/*.rpm -y# 验证haproxy版本
[root@proxy ~]# haproxy -v
HA-Proxy version 2.2.9-a947cc2 2021/02/06

2.3 源码安装Haproxy

2.3.1 安装依赖环境

yum install gcc readline-devel openssl-devel systemd-devel -y

2.3.2 安装Lua脚本

wget http://wwwlua.org/ftp/lua-5.4.3.tar.gz
tar xf lua-5.4.3.tar.gz -C /usr/local
cd /usr/local/lua-5.4.3/
make linux
make liunx test
ln -s /usr/local/lua-5.4.3/ /usr/local/lua

2.3.3编译Haproxy

[root@proxy ~]# wget https://www.haproxy.org/download/2.4/src/haproxy-2.4.3.tar.gz
[root@proxy ~]# tar xf haproxy-2.4.0.tar.gz
[root@proxy ~]# cd haproxy-2.4.0/
[root@haproxy haproxy-2.4.0]# make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 \
USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 \
LUA_INC=/usr/local/lua/src LUA_LIB=/usr/local/lua/src
[root@haproxy haproxy-2.4.0]# make install PREFIX=/usr/local/haproxy-2.4
[root@haproxy haproxy-2.4.0]# ln -s /usr/local/haproxy-2.4/ /usr/local/haproxy# 验证版本
[root@proxy ~]# /usr/local/haproxy/sbin/haproxy -v
HAProxy version 2.4.0-6cbbecf 2021/05/14 - https://haproxy.org/

2.3.4 创建启动文件

[root@proxy01 ~]# systemctl cat haproxy24
# /usr/lib/systemd/system/haproxy24.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy24/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID[Install]
WantedBy=multi-user.target

2.3.5 创建配置文件

[root@proxy01 ~]# cat /etc/haproxy/haproxy.cfg
globalmaxconn 100000# uid 99# gid 99user haproxygroup haproxydaemonlog 127.0.0.1 local2 infopidfile /var/lib/haproxy24/haproxy.pidstats socket /var/lib/haproxy24/haproxy.sock mode 600 level admindefaultsoption http-keep-aliveoption forwardformaxconn 100000mode httptimeout connect 300000mstimeout client 300000mstimeout server 300000mslisten statsmode httpbind 0.0.0.0:9999stats enablelog globalstats uri    /haproxy-statusstats auth   admin:123456listen web_portbind *:80mode httpserver web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5

2.3.6 创建初始环境

初始环境:
useradd -r haproxy
mkdir /var/lib/haproxy24

2.4 Haproxy配置示例

#-----------------------------------------
#Nginx
#-----------------------------------------
server{}        #前段监听对外端口
proxy_pass      #将前段与后端建立关系
upstream{}      #后端资源池#-----------------------------------------
#Haproxy
#-----------------------------------------
frontend        #前段监听对外端口
use_backend     #将前段与后端建立关系,带条件的 (location ~ \.php$)
default_backend #默认建立关系( location / )
backend         #后端资源池listen            #frontend和backend的组合体(直接将前后端建立起来)
default         #提供统一的默认参数,如果定义了则使用自己的,没有定义则使用default

2.4.1 场景配置示例1

  • 1.监听在所有接口的80端口上,HTTP proxy 服务:

    • 1.1 将请求本机80端口的服务,都转发至webservers后端集群组
    • 1.2 后端webserver资源池定义了172.16.1.7:80 , 172.16.1.8:80两台节点
    • 1.3 调度方式采用轮询调度
#---------------------------------------
#Nginx
#---------------------------------------
upstream webserver {server 172.16.1.7:80;server 172.16.1.8:80;
}
server {listen 80;proxy_pass http://webserver;
}#---------------------------------------
#Haproxy (frontend,default_backend,backend)
#---------------------------------------backend webserver                       #定义集群名称为webserverbalance roundrobin                 #rr调度算法server web01 172.16.1.7:80   check   #定义节点信息 [server 名称 IP:port]server web02 172.16.1.8:80   checkfrontend gao *:80                      #定义前端监听端口
default_backend webserver               #默认调度到webserver集群

2.4.2 场景配置示例2

  • 1.监听在所有接口的80端口,http proxy服务:

    • 1.1将请求本机80端口的服务,url为/的默认转发至webserver后端集群组
    • 1.2将请求本机80端口的服务,url为/1.png|2.gif的转发至static后端集群组
    • 1.3后端webserver集群组定义了172.16.1.7:80 , 172.16.1.8:80 两台节点
    • 1.4后端static集群组定义了172.16.1.9:80 , 172.16.1.10:80 两台节点
    • 1.5轮询调度
#---------------------------------------
#Nginx
#---------------------------------------
upstream webserver{rrserver 172.16.1.7:80;server 172.16.1.8:80;
}
upstream static {rrserver 172.16.1.9:80;server 172.16.1.10:80;
}server {listen 80;location / {proxy_pass http://webserver;}location ~\.(png|gif)$ {proxy_pass http://static;}}#---------------------------------------------------
#Haproxy (frontend,default_backend,backend)
#---------------------------------------------------
backend webserver                        #定义集群组webserverbalance roundrobin                   #定义调度算法为rrserver web01 172.16.1.7:80 check  #定义节点 check为健康检查server web02 172.16.1.8:80 check
backend static                          balance roundrobinserver static1 172.16.1.9:80 checkserver static2 172.16.1.10:80 checkacl url_static path_end -i .png .gif #定义url的acl规则:-i为忽略大小写frontend gao *:80                      #前段监听80端口default_backend webserver          #默认调度到webserver集群组use_backend static if url_static  #符合url_static的acl规则的调度到static集群组

2.4.3 场景配置示例3

  • 1.监听在所有接口的80端口上的 http proxy服务

    • 1.1将请求本机80端口的,直接代理到后端的172.16.1.11:80节点
    • 1.2无需采用负载均衡模式,与nginx代理配置大同小异
#---------------------------------------
#Nginx
#---------------------------------------
server {listen 80;location / {proxy_pass http://172.16.1.11:80;}
}#---------------------------------------------------
#Haproxy (listen)
#---------------------------------------------------
listen gao bind *:80server web01 172.16.1.11:80

3.Haproxy Global 配置

3.1global配置参数

全局配置,用于设定全局配置参数

  • log 127.0.0.1 local2 #日志记录通过本地 rsyslog 的 local2 设备写入
  • chroot /var/lib/haproxy : #锁定运行目录
  • pidfile /var/run/haproxy.pid #记录pid文件的位置
  • cpu-map 1 0 #cpu亲和,第一个参数是进程序号,第二个是cpu序号
  • maxconn 4000 #设定每个haproxy进程所接受的最大并发链接数
  • nbproc #指定启动haproxy进程数量,默认启动一个
  • nbthread #指定haproxy线程数量,默认一个,不能与nbproc同时使用
  • user haproxy #运行haproxy进程用户身份
  • group haproxy #运行haproxy进程用户组
  • daemon : #以守护进程模式运行
  • stats socket /var/lib/haproxy/stats #基于socket通信.可实现动态变更配置 (滚动升级)
  • spread-checks <0…50,in percent> #在haproxy后端有众多的服务器节点,如果同时进行健康检查,会对haproxy造成较大性能影响;此选项用于将其检查的时间间隔长度上增加或减少一定随机时长,官方建议2-5(20%-50%);如果后端主机较多的情况下,(eg1000台甚至更多)能够避免同时并发对后端主机check时,减少对haproxy的性能影响

3.2 配置访问日志

1.修改haproxy配置

2.修改rsyslog配置

vim /etc/rsyslog.conf#启用rsyslog的udp

#启动级别为local2的设备,将该设备的所有级别日志全部输出到/var/loghaproxy.log下

local2.* /var/log/haproxy.log

3.重启haproxy以及rsyslog服务

systemclt restart rsyslog haproxy

4.Haproxy default配置

  • default段用于为所有其他配置段提供默认参数

4.1default配置

defaultsmode                    http             #代理采用的模式log                     global              #日志option                  httplog              #用来记录日志,其通常包括但不限于http请求,链接计时器,会话状态,连接数,捕获的首部以及cookie,frontend,backend等信息option                  dontlognull         #不记录健康检查的日志信息option http-server-closeoption forwardfor       except 127.0.0.0/8 #传递客户端真实IPoption                  redispatch            #当找不到cookie对应的服务器时,重新分配新的节点给客户端retries                 3                    #健康检查重试的次数timeout http-request    10s                   #客户端发送http请求的超时时间timeout queue           1m                 #当请求超过最大并发连接数,多余请求会进入队列,表示队列中请求等待超时时长timeout connect         10s                    #haproxy与后端服务器链接超时时间 (内网建议调低点)timeout client          1m                    #客户端与haproxy 非活动链接(不再有数据传输)的超时时间timeout server          1m                  #后端应用服务器的 非活动链接 超时时间timeout http-keep-alive 10s                 #http请求连接建立的最大超时时间timeout check           10s                   #健康检测的最大超时时间maxconn                 3000                #最大并发连接数 (不可以超过global)

5.Haproxy Proxies配置

代理相关配置

  • frontend : 用于定义一系列监听的端口,这些端口可接受客户端请求并与之建立链接
  • backend : 用于定义一系列后端服务器,代理会将对应客户端的请求转发至这些服务器
  • listen : 通过关联"前段"和"后端"定义了一个完整的代理

5.1mode参数

  • mode概念 : 设置haproxy运行的协议.
  • mode 语法 : mode { tcp|http }
    • tcp : 不对七层报文做任何检查,通常用于SSL,SSH,MySQL等应用
    • http : 客户端请求服务端,服务端重新封装请求报文,请求后端真是节点
  • mode示例:
#---------------------------------------------
#listen中定义的mode
#---------------------------------------------
listen www *:8089mode tcpserver web1 172.16.1.7:8080
#---------------------------------------------
#frontend中定义的mode
#---------------------------------------------
frontend shop *:80mode httpuse_backend webcluster

5.2 bind参数

  • bind概念 : 设置haproxy 实例运行的端口
  • bind语法 : bind *:80
#---------------------------------------------
#listen中定义的bind
#---------------------------------------------
listen proxy.combind *:80       #单个端口mode tcpserver web1 172.16.1.7:80#---------------------------------------------
#frontend中定义的bind
#---------------------------------------------
frontend proxy.combind *:8000-8005      #连续端口mode httpuse_backend webcluster

5.3 maxconn参数

  • maxconn 概念 : 设定一个前端的最大并发连接数,尽可能提高此值,从而避免haproxy无法应答用户请求,(注:不能超过global)
  • 注意:haproxy会为每个连接维持两个缓冲,每个缓冲大小为8kb,再加上其他数据,每个连接大约占用17kb的RAM空间,这意味着经过适当优化后,1GB的RAM空间,将能维护40000-50000并发连接

5.4 server参数

  • 为后端声明一个server节点信息, 因此,不能用于defaults和frontend区段
  • server语法: server
    [:port] [param*]

5.4.1 backup

  • backup为备用服务器
  • 在负载均衡场景中,在所有的正常节点server都不能用时,backup节点会提供服务
backend webclusterserver web1 172.16.1.7:80 server web2 172.16.1.8:80 server web3 172.16.1.9:80 backup    #当7,8节点都挂掉,则9节点提供服务

5.4.2 check

  • check : 对此server进行TCP的健康检查
backend webclusterserver web1 172.16.1.7:80 check    #默认检测80端口 server web2 172.16.1.8:80 check port 8080 #检测8080端口server web3 172.16.1.9:80 backup    #当7,8节点都挂掉,则9节点提供服务

5.4.3 inter

  • inter : 设定健康状态检查的间隔时间,单位为毫秒,默认2000毫秒
backend webclusterserver web1 172.16.1.7:80 check inter 3000server web2 172.16.1.8:80 check inter 3000server web3 172.16.1.9:80 backup    #当7,8节点都挂掉,则9节点提供服务

5.4.4 rise

  • rise 设置离线状态转换至正常状态需要成功检查的次数
backend webclusterserver web1 172.16.1.7:80 check inter 3000 rise 2server web2 172.16.1.8:80 check inter 3000 rise 2server web3 172.16.1.9:80 backup    #当7,8节点都挂掉,则9节点提供服务

5.4.5 fall

  • fall : 设置正常状态节点转为不可用状态,需要检查的次数
backend webclusterserver web1 172.16.1.7:80 check inter 3000 rise 2 fall 3 server web2 172.16.1.8:80 check inter 3000 rise 2 fall 3server web3 172.16.1.9:80 backup    #当7,8节点都挂掉,则9节点提供服务

5.4.6 maxconn

  • maxconn : 指定此服务器接受的最大并发连接数
  • 如果发往此服务器的连接数高于此处指定值,将被放置于请求队列,等待其他链接被释放
backend webclusterserver web1 172.16.1.7:80 check inter 3000 rise 2 fall 3 maxconn 2000server web2 172.16.1.8:80 check inter 3000 rise 2 fall 3 maxconn 2000server web3 172.16.1.9:80 backup    #当7,8节点都挂掉,则9节点提供服务

5.4.7 maxqueue

  • maxqueue : 设定请求队列的最大长度
  • 当请求超过maxqueue设定的数值.剩余请求进入排队状态,排队的最大长度有maxqueue决定
backend webclusterserver web1 172.16.1.7:80 check inter 3000 rise 2 fall 3 maxconn 2000 maxqueue 200server web2 172.16.1.8:80 check inter 3000 rise 2 fall 3 maxconn 2000 maxqueue 200server web3 172.16.1.9:80 backup    #当7,8节点都挂掉,则9节点提供服务

5.4.8 weight

  • weight : 服务器节点的权重,默认为1, 最大设为256
  • 0表示不参与负载均衡,等同于将该节点下线处理(可通过脚本实现滚动上下线)
backend webclusterserver web1 172.16.1.7:80 check inter 3000 rise 2 fall 3 maxconn 2000 maxqueue 200 weight 2server web2 172.16.1.8:80 check inter 3000 rise 2 fall 3 maxconn 2000 maxqueue 200 weight 2server web3 172.16.1.9:80 backup    #当7,8节点都挂掉,则9节点提供服务

5.5 使用子配置管理

  • 当业务众多时,将所有配置都放在一个配置文件中,会造成维护困难
  • 可以按业务分类,将配置文件拆分,放在不同的子配置文件中,从而方便维护管理

5…5.1 创建子配置文件

  • 定义配置
#mkdir /etc/haproxy/conf.d
#vim /etc/haproxy/conf.d/web.gao.com.cfg
frontend web1bind *:80mode httpuse_backend web_server
backend web_serverbalance roundrobinserver web1 172.16.1.7:80 check inter 3000 fall 3 rise 2server web2 172.16.1.8:80 check inter 3000 fall 3 rise 2

5.5.2 修改unit配置

#添加子配置目录到unit文件中,使其能加载子目录配置
[Unit]
Description=HAProxy Load Balancer
After=network-online.target
Wants=network-online.target[Service]
EnvironmentFile=-/etc/sysconfig/haproxy
Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid"
##定义配置文件路径变量
Environment="CONFIG_D=/etc/haproxy/conf.d/"#启动或停止使用 -f 调用CONFIG_D变量
ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q $OPTIONS
ExecStart=/usr/sbin/haproxy -Ws -f $CONFIG  -f $CONFIG_D -p $PIDFILE $OPTIONS
ExecReload=/usr/sbin/haproxy -f $CONFIG -c -q $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
SuccessExitStatus=143
Type=notify[Install]
WantedBy=multi-user.target

6.Haproxy高级功能

6.1 基于cookie会话保持

  • 在backend服务器组启用cookie功能,haproxy会将会端服务器定义的serverID植入到客户端的cookie中,一保证会话保持;
  • 需要设置backend中的cookie以及server指令的cookie选项
  • haproxy实现cookie植入,实现会话保持:
    • 1.定义key: SERVERID
      2.定义value:为server段中的每个节点起一个名称; cookie name
      3.当用户请求时,haproxy会下发一个httpheader信息, Set-Cookies: SERVERID:web01
      4.当浏览器在次请求haproxy会在request中增加一个header: cookie: SERVERID:web1
      5.已便实现会话保持的方案:

      • ip_hash: 基于来源ip进行hash取模,已便实现会话保持;
      • cookie植入:haproxy很容易实现,Nginx也可以实现,需要三方模块(自行完成一下)
      • session共享:基于Redis实现;

6.1.1 配置示例

1.配置haproxy基于cookie植入实现会话保持.

frontend webbind *:80-88mode httpdefault_backend webserversbackend webserversbalance roundrobin#回传数据时添加Set-Cookie , key为SERVERID , Value 为 节点定义的cookie值cookie SERVERID insert nocacheserver web01 172.16.1.7:8888 check cookie web1server web02 172.16.1.8:8888 check cookie web2

6.2 基于web管理haproxy

HAProxy 有统计报告功能,可以让使用者通过 web 页面概览后端服务器的概况.甚至更改他们的状态

6.2.1状态页面配置

listen haproxy-statsmode httpbind *:80                       stats enable                    #启动stats功能stats refresh 5s                #设定自动刷新时间间隔stats hide-version              #隐藏haproxy版本stats uri /haproxy?stats        #stats页面访问路径stats realm "HAProxy stats"     #认证提示信息stats auth gao:123              #认证的账号密码stats admin if TRUE             #启用管理功能

6.3 基于socat管理haproxy

6.3.1 安装socat

  • yum install -y socat

6.3.2 修改配置文件

vim /etc/haproxy/haproxy.cfg

6.3.3 实现主机动态上下线

  • 通过命令来查看
echo "show info" |socat stdio /var/lib/haproxy/stats           #查看信息
  • 通过命令来,进行上线和下线,都是平滑的
echo "enable server web1_servers/web1" | socat stdio /var/lib/haproxy/stats   #上线
echo "disable server web1_servers/web1" | socat stdio /var/lib/haproxy/stats  #下线

6.4 服务器状态监测

  • 基于端口做状态监测 (默认)
  • 基于指定URI做状态监测
  • 基于URI的request请求头部内容做状态监测
  • 针对http应用,建议使用七层的uri方式检测
  • tcp应用,建议使用四层check端口检测

6.4.1.基于端口监测 check port

  • 通过端口进行健康监测
  • 这种检测方式,haproxy 只会去检查后端server端口,并不能保证服务真正可用

6.4.2 httpchk参数

  • option httpchk 指令基于http协议来做健康检查,只有返回状态码为2xx或3xx 的才认为是健康的,其余所有状态码认为都是不健康的

  • 如果不设置该选项时,默认采用tcp做健康检查,只要能建立tcp就表示健康

    1.基于URI检测

    • 通过URI获取进行健康检测,通过GET后端服务的web页面.基本上可以代表后端服务器的可用性
    listen http_proxy 0.0.0.0:80mode httpbalance roundrobinoption httpchk GET /index.html   #基于URI,会消耗网络带宽server web1 172.16.1.7:80 check port 80server web1 172.16.1.8:80 check port 80
    

    2.基于URI头检测

    • 通过request获取的头部信息进行匹配,然后进行健康检查
    • 将健康检查的请求发送至后端节点80端口.然后与host进行匹配.用来确定该后端节点是否正常
    listen http_proxy 0.0.0.0:80mode httpbalance roundrobinoption httpchk HEAD / HTTP/1.1\r\nHost:\ proxy.gao.com   # head减少网络消耗server web1 172.16.1.7:80 check port 80server web1 172.16.1.8:80 check port 80
    

6.5 IP地址透传

  • web服务器中记录客户端的真实IP地址,主要用于访问统计,安全防护,行为分析,区域排行等场景

6.5.1 七层负载地址透传

  • haproxy工作于反向代理模式,其发往服务端的请求中的客户端IP均为HAProxy主机的地址,而非真正客户端地址,这会使服务端的日志信息记录不了真正的请求来源,X-Forwarded-For 首部则可用于解决此问题
  • HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value

option forwardfor 示例

defaultsoption forwardfor        #此为默认值,首部字段默认为: X-Forwarded-For

6.5.2 四层负载地址透传

1.配置HAProxy基于tcp协议访问

frontend web_tcpbind *:88mode tcp            # tcpdefault_backend webservers_tcpbackend webservers_tcpmode tcp           #tcp   不写的话默认找default中的httpbalance roundrobin                               # send-proxy:HA将proxy protocol协议发送到后端节点server 172.16.1.6 172.16.1.6:8888 check port 8888 inter 3s rise 2 fall 3  send-proxy

2.配置后端节点 接收变量$proxy_protocol_addr 记录透传过来的客户端IP

#在日志格式定义中添加:$proxy_protocol_addr
server {listen 8888 proxy_protocol;     #启用此项,将无法直接访问此网站,只能通过四层代理访问server_name web.gao.com;root /proxy;location / {index index.html;}
}

6.6 自定义日志capture

  • capture { request|response } header 捕获并记录指定请求或响应首部最近一次出现时的第一个值,捕获的首部值使用花括号{}括起来添加到日志中
  • 如果需要捕获多个首部值.他们将以指定的次序出现在日志文件中,并以竖线"|"作为分隔符,不存在的首部记录为空字符串,常用如下:
      1. 虚拟主机环境中使用的 Host 字段
      2. 上传请求首部中的Content-lenght字段
      3. 快速区别真是用户和网络机器人的 User-agent字段
      4. 代理环境中记录真实请求来源的X-Forward-For字段
    • capture 语法: capture request header len
      • : 要捕获的名称,不区分大小写. 注意 : 记录在日志中时首部对应的值,而非首部名称
      • : 指定记录首部值时记录的精确长度,超出的部分将会被忽略

6.6.1 配置示例

  • captrue:用来捕捉header关键信息,用于后期分析

  • 在日志里体现每个请求,请求的主机头信息

frontend webbind *:80mode httpdefault_backend webserverscapture request header Cache-Control len 40      #捕捉请求的域名capture request header Host     len 40              #捕捉请求的主机名capture request header User-Agent  len 40          #捕捉请求的设备capture response header Server  len 40              #捕捉响应的serverbackend webserversbalance roundrobinoption httpchk HEAD / HTTP/1.1\r\nHost:\ web.gao.comserver 172.16.1.7 172.16.1.7:8888 check port 8888 inter 3s rise 2 fall 3 maxconn 2000 maxqueue 1000server 172.16.1.8 172.16.1.8:8888 check port 8888 inter 3s rise 2 fall 3 maxconn 2000 maxqueue 1000server 172.16.1.9 172.16.1.9:8888 check port 8888 inter 3s rise 2 fall 3 maxconn 2000 maxqueue 1000

6.7 自定义错误页面

  • HAProxy自定义错误页面有两种方式

    • 一种是由haproxy本机提供错误页面,通过errorfile参数来设定

    1. errorfile

    同过errorfile将错误交给本机haproxy处理,修改haproxy设置

    defaults...errorfile  500 /opt/500.http    #捕捉错误码500将其重新定向,由本机来提供错误页面errorfile    502 /opt/502.httperrorfile  503 /opt/503.http
    
    [root@proxy01 ~]# cat /opt/503.http HTTP/1.1 503 Content-Type:text/html;charset=utf-8<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>报错页面</title></head><body><center><h1>网站维护中..请稍候再试</h1></center><center><h2>请联系网站管理人员</h2></center><center><h3>503 Service Unavailable</h3></center></body></html>
    • 二是将错误转到一个指定的url地址,通过errorcode参数来设定

    2.errorloc

    使用errorloc 选项来捕捉错误状态码,然后将其重定向到其他url,修改haproxy 配置

    defaults...errorloc 503 https://xxxxxx
    

6.8 自定义HTTP报文

6.8.1 reqadd

  • reqadd [{ if | unless } ] 在请求报文中添加指定首部

    • 实现原理: client --> haproxy – reqadd (添加Header) – web
  1. 在 frontend 中使用 reqadd, 将发往后端集群的请求中添加一个Header
自定义添加Header头部到后端的Nginxfrontend webbind *:80mode httpdefault_backend webservers# 自定义添加Header给后端的Nginx节点http-request add-header X-via Haproxy-Node1# 自定义添加Header给CLient返回http-response add-header Res-Server Haproxy2.2-lb# 删除返回给客户端的Header字段http-response del-header server

6.8.2 rspadd

  • rspadd 在响应报文中添加指定首部

    • 实现原理 : web --> haproxy --rspadd (添加Header) --> client
    1. 在frontend中使用rspadd,通过在响应Header中添加字段,告诉客户端资源经过了哪个代理服务
    frontend webbind *:80mode httpdefault_backend webservers# 自定义添加Header给CLient返回http-response add-header Res-Server Haproxy2.2-lb# 删除返回给客户端的Header字段http-response del-header server
    

7.HAProxy 调度算法

  • HAProxy 根据后端服务器的负载,或其他的计算的标准.判断挑选哪台RS来进行请求处理
  • HAProxy 调度算法, 可用于 default ,listen, backend
调度算法:roundrobin 动态轮询;static-rr 静态轮询;leastconn   最少链接数调度算法;source     基于ip_hash取模实现  也可以修改为 consistent 一致性hash调度uri           根据请求的目标uri做调度,相同的uri、不同的客户端始终调往同一服务器节点相同的客户端、不同的url,可能会调度到不同的节点url_param   基于用户请求的关键字做调度    test.oldxu.net/index.php?username=oldxu     基于username关键字做调度hdr      基于用户请求的header进行调度  可以是User-Agent,也可以是其他的Header字段;

7.1 roundrobin 轮询调度

  • roundrobin : 基于权重进行轮询,保持均匀分布,这是最平衡,最公平的算法

  • 此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个链接

    动态调整

    • 通过 socat 命令动态调整权重,将web1节点的权重调整为3
    #查看当前权重
    # echo "get weight webcluster/web1" |socat stdio /var/lib/haproxy/stats # 调整web1权限为3,调整后测试,会发现立即生效
    #echo "set weight webservers/web1 3" | socat stdio /var/lib/haproxy/stats
    

7.2 static-rr 静态轮询

7.3 leastconn 最少连接数调度算法

  • leastconn :新的连接请求被怕发至具有最少连接数的后端服务器
  • 此算法时动态的,可以在运行时调整权重

7.4 source 基于ip_hash取模

  • 基于ip_hash取模实现
  • consistent 一致性hash调度

7.5 uri

  • uri : 基于对用户请求的 uri 做 hash 并将请求转发到后端指定服务器
  • 理解 : 同一个节点访问不同 uri 可能会被调度到不同的后端服务器处理,但是不同的节点访问相同的 uri 则会被调度到同一台服务器处理 ,因为基于 uri 调度室在服务端完成的,这种调度算法多用在缓存场景,能有效地提高命中率
  • 注意 : 此算法.仅用于 HTTP 后端服务器场景,其默认为静态算法.不过也可以使用过 hash-type 修改此特性

7.6 url

  • url_param : 对用户请求的 url 中的 参数中的 name 做 hash 计算;
  • 通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个 backend server (使用较少)

eg : http://test.gao.top/index.php?name=gao http://test.gao.top/index.php?name=jack

基于name=gao k=v 调度

7.7 hdr

  • hdr () : 针对用户发起 HTTP 请求中 Header 中的 关键字进行 hash 计算,假如无有效地值,则会被轮询调度;
  • 此算法默认为静态.不过其他也可以使用 hash-type 修改此特性

HAProxy入门(一)相关推荐

  1. HAProxy入门及常用配置模拟测试

    HAProxy简介      HAProxy是一个使用C语言编写的,提供负载均衡,以及基于TCP(伪四层)和HTTP(七层)的应用程序代理.   HAProxy特别适用于那些负载大的web站点,这些站 ...

  2. haproxy负载均衡_Haproxy+keepalived高可用集群实战

    随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡F5,Haproxy提供高可用性.负载均衡以及基于TCP和HT ...

  3. Haproxy+keepalived高可用集群实战

    前言 随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡F5,Haproxy提供高可用性.负载均衡以及基于TCP ...

  4. 服务器集群之keepalived配置高可用(资料)

    2019独角兽企业重金招聘Python工程师标准>>> Linux集群概述 • 根据功能划分为两大类:高可用和负载均衡 • 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当 ...

  5. [M30 Linux 随堂笔记] 标题索引

    Day 01 [计算机基础.Linux安装详解和基本使用] 1.计算机硬件基础 2.计算机软件基础 3.VMware虚拟机使用介绍 4.在VMware虚拟机中安装CentOS6.9系统 5.在VMwa ...

  6. 【LINUX计算机大白平凡学习linux之路】

    @计算机大白平凡学习 之路 千里之行,始于足上.只有基础扎实+思路清析,写脚本才没有问题.多看一些牛人大咖写的脚本.看人家的思路与结构,会收益良多, 一起努力学习吧! Linux是Torvalds先生 ...

  7. HAProxy快速入门(七)—— 常见负载均衡策略

    HAProxy作为一款轻量级的负载均衡器,所以负载均衡策略是非常重要的.今天我们就来对几种常见的策略进行测试,这样我们方便我们真正理解和掌握. 利用Docker+Tomcat+HAProxy搭建一套测 ...

  8. 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构1 初始化和Haproxy

    实践案例 <中小型Web架构> 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 实践.实践.再实践,这是熟练掌握SaltStack的真理. ...

  9. 利用Haproxy实现http和TCP反向代理和负载均衡(入门和技术验证)

    系统访问量上去遇到了性能瓶颈,解决方法一般都是从两个方向入手Scale Up 和Scale Out.Scale Up适用于哪些钱多的系统,因为Scale Up其实就是直接升级硬件,CPU.内存.IO哪 ...

最新文章

  1. Ubuntu 下类似 Xshell 工具、更换阿里源
  2. centos7安装sphinx2.2.11
  3. java byte大小_Java中byte大小格式化
  4. ACE之Reactor模式使用实例
  5. makefile与make
  6. 操作失败10秒内未完成启动服务mysql_01-MySQL 命令行-cmd用法-未完成
  7. 怎么更改wifi频段_手机wifi延迟高怎么办
  8. C++各个算数类型占用的字节数
  9. 只有程序员才看得懂的情书
  10. openmv识别物体并与单片机通信(STM32)
  11. feign传递多个对象_面向对象
  12. Linux 命令(98)—— basename 命令
  13. Linux 安装Zookeeper
  14. matlab读取文本文件----textscan
  15. QML类型:Dialog(Qt Quick Dialogs 模块)
  16. c语言void* arg,void * arg什么意思
  17. canvas设计抽奖刮刮卡(非酋慎点) - Kaiqisan
  18. 企微社群营销如何提升会员活跃度?
  19. 《2021政府工作报告》词云图一览
  20. 编译器与Debug的传奇:女牛人Grace Murray Hopper小传

热门文章

  1. 3年自动化测试,我突然想转测试开发了,开发测试工具平台......
  2. 产品经理也要懂ASO
  3. Celestial Altium Library
  4. [linux] linux sed命令删除一行/多行
  5. 使用iperf测试网络性能
  6. 【小程序】云开发从零到一搭建流程
  7. Visio中关于跨线的设置
  8. Linux中cut命令的作用
  9. linux新建挂载目录命令,告诉你Ubuntu添加新分区并设置挂载点的方法及命令
  10. python基础-PyYaml操作yaml文件