HAProxy入门(一)
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实现;
- 1.定义key: SERVERID
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 捕获并记录指定请求或响应首部最近一次出现时的第一个值,捕获的首部值使用花括号{}括起来添加到日志中
- 如果需要捕获多个首部值.他们将以指定的次序出现在日志文件中,并以竖线"|"作为分隔符,不存在的首部记录为空字符串,常用如下:
- 虚拟主机环境中使用的 Host 字段
- 上传请求首部中的Content-lenght字段
- 快速区别真是用户和网络机器人的 User-agent字段
- 代理环境中记录真实请求来源的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
- 在 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
- 在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入门(一)相关推荐
- HAProxy入门及常用配置模拟测试
HAProxy简介 HAProxy是一个使用C语言编写的,提供负载均衡,以及基于TCP(伪四层)和HTTP(七层)的应用程序代理. HAProxy特别适用于那些负载大的web站点,这些站 ...
- haproxy负载均衡_Haproxy+keepalived高可用集群实战
随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡F5,Haproxy提供高可用性.负载均衡以及基于TCP和HT ...
- Haproxy+keepalived高可用集群实战
前言 随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡F5,Haproxy提供高可用性.负载均衡以及基于TCP ...
- 服务器集群之keepalived配置高可用(资料)
2019独角兽企业重金招聘Python工程师标准>>> Linux集群概述 • 根据功能划分为两大类:高可用和负载均衡 • 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当 ...
- [M30 Linux 随堂笔记] 标题索引
Day 01 [计算机基础.Linux安装详解和基本使用] 1.计算机硬件基础 2.计算机软件基础 3.VMware虚拟机使用介绍 4.在VMware虚拟机中安装CentOS6.9系统 5.在VMwa ...
- 【LINUX计算机大白平凡学习linux之路】
@计算机大白平凡学习 之路 千里之行,始于足上.只有基础扎实+思路清析,写脚本才没有问题.多看一些牛人大咖写的脚本.看人家的思路与结构,会收益良多, 一起努力学习吧! Linux是Torvalds先生 ...
- HAProxy快速入门(七)—— 常见负载均衡策略
HAProxy作为一款轻量级的负载均衡器,所以负载均衡策略是非常重要的.今天我们就来对几种常见的策略进行测试,这样我们方便我们真正理解和掌握. 利用Docker+Tomcat+HAProxy搭建一套测 ...
- 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构1 初始化和Haproxy
实践案例 <中小型Web架构> 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 实践.实践.再实践,这是熟练掌握SaltStack的真理. ...
- 利用Haproxy实现http和TCP反向代理和负载均衡(入门和技术验证)
系统访问量上去遇到了性能瓶颈,解决方法一般都是从两个方向入手Scale Up 和Scale Out.Scale Up适用于哪些钱多的系统,因为Scale Up其实就是直接升级硬件,CPU.内存.IO哪 ...
最新文章
- Ubuntu 下类似 Xshell 工具、更换阿里源
- centos7安装sphinx2.2.11
- java byte大小_Java中byte大小格式化
- ACE之Reactor模式使用实例
- makefile与make
- 操作失败10秒内未完成启动服务mysql_01-MySQL 命令行-cmd用法-未完成
- 怎么更改wifi频段_手机wifi延迟高怎么办
- C++各个算数类型占用的字节数
- 只有程序员才看得懂的情书
- openmv识别物体并与单片机通信(STM32)
- feign传递多个对象_面向对象
- Linux 命令(98)—— basename 命令
- Linux 安装Zookeeper
- matlab读取文本文件----textscan
- QML类型:Dialog(Qt Quick Dialogs 模块)
- c语言void* arg,void * arg什么意思
- canvas设计抽奖刮刮卡(非酋慎点) - Kaiqisan
- 企微社群营销如何提升会员活跃度?
- 《2021政府工作报告》词云图一览
- 编译器与Debug的传奇:女牛人Grace Murray Hopper小传