HAProxy 高级功能与配置
HAProxy 高级功能与配置
配置和验证的环境看这篇文章:HAProxy 各种调度算法介绍
一.基于 cookie 的会话保持
使用cookie
关键字来配置后端服务器基于 cookie 的会话持久连接。
配置格式
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ][ postonly ] [ preserve ] [ httponly ] [ secure ][ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ][ dynamic ]# name :需要被监控或者修改或者插入到客户端的cookie的名称。该cookie被通过响应头
# 设置"Set-Cookie"发送给客户端。并且被客户端在所有请求头中发送到服务器。# insert :给参数指明如果客户端还没有允许访问本网站的cookie时由HAProxy在请求头插入
# 配置文件指明的cookie# indirect :不会向客户端发送服务器已经处理过请求的cookie信息,间接# nocache :当client和hapoxy之间有缓存时,不缓存cookie
配置示例
listen statsmode httpbind 172.20.2.189:9999stats enablelog globalstats uri /haproxy_statusstats auth haadmin:stevenuxfrontend WEB_PORT_80bind 172.20.2.189:8080mode httpuse_backend web_prot_http_nodesbackend web_prot_http_nodesmode httpbalance roundrobinoption forwardforcookie SRV-COOKIE insert indirect nocache maxidle 30m maxlife 8hserver node1 172.20.2.37:80 send-proxy cookie srv1-cookie weight 1 check inter 3000 fall 3 rise 5server node2 172.20.2.43:80 cookie srv2-cookie weight 1 check inter 3000 fall 3 rise 5server node3 172.20.2.44:80 cookie srv3-cookie weight 1 check inter 3000 fall 3 rise 5server node4 172.20.2.45:80 cookie srv4-cookie weight 1 check inter 3000 fall 3 rise 5
访问测试–client-node1
[root@client-node1 ~]# curl --cookie "SRV-COOKIE=srv1-cookie" http://172.20.2.189:8080
node1 172.20.2.37
[root@client-node1 ~]# curl --cookie "SRV-COOKIE=srv4-cookie" 172.20.2.189:8080
node4 172.20.2.45
[root@client-node1 ~]# curl --cookie "SRV-COOKIE=srv3-cookie" 172.20.2.189:8080
node3 172.20.2.44
[root@client-node1 ~]# curl --cookie "SRV-COOKIE=srv2-cookie" 172.20.2.189:8080
访问测试–物理机 172.20.1.1
二.HAProxy 状态页配置和使用
HAProxy 提供了 WEB 信息界面,用来查看和管理后端服务器的状态信息。在配置
文件中使用stats
关键字指明各个控制状态页的参数。
2.1 状态页配置选项
stats 关键字配置参数有下面的功能
stats enable # 基于默认的参数启用stats page
# 默认参数使用如下:- stats uri : /haproxy?stats- stats realm : "HAProxy Statistics"- stats auth : no authentication- stats scope : no restrictionstats hide-version # 隐藏HAProxy版本
stats refresh <delay> # 设定WEB页面自动刷新时间间隔
stats uri <prefix> # 自定义stats page uri,默认值:/haproxy?stats
stats realm <realm> # 账户认证时的提示信息,示例:stats realm : HAProxy\ Statistics
stats auth <user>:<passwd> # 认证时的账号和密码,可使用多次,默认:no authentication
stats admin { if | unless } <cond> # 启用stats page中的管理功能
2.2 启用状态页配置
配置示例
listen statsmode httplog globalbind 172.20.2.189:9999stats enablestats refresh 5sstats realm Status\ Page\ Input\ Passwd:stats uri /haproxy_statusstats auth haadmin1:stevenuxstats auth haadmin2:s3cr3tpass
2.3 状态页参数说明
非表格中的状态信息说明
pid = 46948 (process #1, nbproc = 1, nbthread = 2)
# pid 为当前进程pid号
# process 为当前进程编号
# nbproc 进程数
# nbthread 为线程数uptime = 0d 0h02m26s
# HAProxy 启动以来经过的时间system limits: memmax = unlimited; ulimit-n = 1023
maxsock = 1023; maxconn = 489; maxpipes = 0
# memmax 内存使用限制为无限制
# ulimit-n 最大打开文件数为1023
# maxsock 最大的socket连接数
# maxconn 单个进程最大的并发连接数
# maxpipes 最大的管道打开数current conns = 1; current pipes = 0/0; conn rate = 1/sec; bit rate = 0.000 kbps
# current conns 当前进程的连接数
# current pipes 当前进程打开的管道数
# conn rate 连接速率
# bit rate 比特速率
Running tasks: 1/20; idle = 100 %# 后端服务器显示颜色对应的状态
active UP:# 在线服务器
backup UP:# 标记为backup的服务器
active UP, going down:# 监测未通过正在进入down过程
backup UP, going down:# 备份服务器正在进入down过程
active DOWN, going up:# down的服务器正在进入up过程
backup DOWN, going up:# 备份服务器正在进入up过程
active or backup DOWN:# 在线的服务器或者是backup的服务器已经转换成了down状态
not checked:# 标记为不监测的服务器
active or backup DOWN for maintenance (MAINT) # active或者backup服务器人为下线的
active or backup SOFT STOPPED for maintenance # active或者backup被人为软下线(人为将weight改成0)
表格中的信息主要说明各后端服务器的详细状态
ession rate(每秒的连接会话信息) | Errors(错误统计信息) |
---|---|
cur:每秒的当前会话数量 | Req:错误请求量 |
max:每秒新的最大会话数量 | conn:错误链接量 |
limit:每秒新的会话限制量 | Resp:错误响应量 |
sessions(会话信息) | Warnings(警告统计信息) |
---|---|
cur:当前会话量 | Retr:重新尝试次数 |
max:最大会话量 | Redis:再次发送次数 |
limit: 限制会话量 | - |
Total:总共会话量 | - |
Server(real server 信息) |
---|
LBTot:选中一台服务器所用的总时间 |
Status:后端机的状态,包括 UP 和 DOWN |
Last:和服务器的持续连接时间 |
LastChk:持续检查后端服务器的时间 |
Wght:权重 |
Bytes(流量统计) |
---|
Act:活动链接数量 |
In:网络的字节输入总量 |
Bck:备份的服务器数量 |
Out:网络的字节输出总量 |
Chk:心跳检测时间 |
Dwn:后端服务器连接后都是 DOWN 的数量 |
Denied(拒绝统计信息) |
---|
Dwntme:总的 downtime 时间 |
Req:拒绝请求量 |
Thrtle:server 状态 |
Resp:拒绝回复量 |
2.4 修改报文配置
在 http 模式下,基于实际需求修改客户端的请求报文与响应报文,通过 reqadd
和 reqdel 在请求报文添加删除字段,通过 rspadd 与 rspidel 在响应报文中添
加与删除字段。
在请求报文尾部添加指定首部
reqadd <string> [{if | unless} <cond>]
从请求报文中删除匹配正则表达式的首部
reqdel <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>]
在响应报文尾部添加指定首部
rspadd <string> [{if | unless} <cond>]
示例
rspadd X-Via:\ HAPorxy
从响应报文中删除匹配正则表达式的首部
rspdel <search> [{if | unless} <cond>]rspidel <search> [{if | unless} <cond>]
示例:
rspidel server.* # 从响应报文删除server信息rspidel X-Powered-By:.* # 从响应报文删除X-Powered-By信息
2.5 web 服务器状态监测
HAProxy 可以基于不同的监测方式,对后端 real server 进行状态监测
option httpchk
option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>
2.5.1 三种状态监测方式
- 三种
- 基于四层的传输端口做状态监测
- 基于指定 URI 做状态监测
- 基于指定 URI 的 request 请求头部内容做状态监测
2.5.2 配置示例
listen web_hostbind 192.168.7.101:80mode httpbalance roundrobinlog globaloption httplog#option httpchk GET /app/monitor/check.html HTTP/1.0option httpchk HEAD /app/monitor/check.html HTTP/1.0\r\nHost:\ 192.168.7.102cookie SERVER-COOKIE insert indirect nocacheserver web1 192.168.7.103:80 cookie web1 check inter 3000 fall 3 rise 5server web2 192.168.7.104:80 cookie web2 check inter 3000 fall 3 rise 5
三.HAProxy 日志配置和使用
HAProxy 可以配置将日志记录到指定的主机或者日志文件中,需要配合 Rsyslog
服务使用。
3.1 日志配置
HAProxy 端的配置
root@ubuntu-suosuoli-node1:~# vim /etc/haproxy/haproxy.cfgglobal#log /dev/log local0#log /dev/log local1 noticelog 127.0.0.1 local6 info......
listen statsmode httplog globalbind 172.20.2.189:9999stats enablestats refresh 5sstats uri /haproxy_statusstats realm Status\ Page\ Input\ Passwd:stats auth haadmin1:stevenuxstats auth haadmin2:s3cr3tpassfrontend WEB_PORT_80bind 172.20.2.189:8080mode httpuse_backend web_prot_http_nodesbackend web_prot_http_nodesmode httplog globalbalance roundrobinoption forwardforcookie SRV-COOKIE insert indirect nocache maxidle 30m maxlife 8hserver node1 172.20.2.37:80 send-proxy cookie srv1-cookie weight 1 check inter 3000 fall 3 rise 5server node2 172.20.2.43:80 cookie srv2-cookie weight 1 check inter 3000 fall 3 rise 5server node3 172.20.2.44:80 cookie srv3-cookie weight 1 check inter 3000 fall 3 rise 5server node4 172.20.2.45:80 cookie srv4-cookie weight 1 check inter 3000 fall 3 rise 5root@ubuntu-suosuoli-node1:~# systemctl restart rsyslog.service
3.2 Rsyslog 配置
Rsyslog 端配置,此处 Rsyslog 和 HAProxy 在同一台机器
root@ubuntu-suosuoli-node1:~# vim /etc/rsyslog.conf
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
local6.* /var/log/haproxy.log
......
root@ubuntu-suosuoli-node1:~# systemctl restart rsyslog.service
3.3 验证日志
在物理主机 171.20.1.1 访问状态页面,测试日志
root@ubuntu-suosuoli-node1:~# tail -f /var/log/haproxy.log
2020-01-13T21:39:26+08:00 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.088] stats stats/<STATS> 0/0/0/0/1 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
Jan 13 21:39:26 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.088] stats stats/<STATS> 0/0/0/0/1 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
2020-01-13T21:39:26+08:00 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.243] stats stats/<STATS> 0/0/0/1/1 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
Jan 13 21:39:26 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.243] stats stats/<STATS> 0/0/0/1/1 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
2020-01-13T21:39:26+08:00 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.408] stats stats/<STATS> 0/0/0/0/2 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
Jan 13 21:39:26 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.408] stats stats/<STATS> 0/0/0/0/2 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
...
3.4 自定义日志
HAProxy 允许用户自定义日志,以将特定信息记录在日志。
3.4.1 配置参数说明
capture cookie <name> len <length> # 捕获请求和响应报文中的 cookie并记录日志
capture request header <name> len <length> # 捕获请求报文中指定的首部内容和长度并记录日志
capture response header <name> len <length> # 捕获响应报文中指定的内容和长度首部并记录日志## 如如如如如如如
capture request header Host len 256
capture request header User-Agent len 512
capture request header Referer len 15
3.4.2 配置示例
在状态页面配置日志格式
root@ubuntu-suosuoli-node1:~# vim /etc/haproxy/haproxy.cfg
global#log /dev/log local0#log /dev/log local1 noticelog 127.0.0.1 local6 info.......
listen statsmode httplog globalbind 172.20.2.189:9999option httplogcookie SRV-COOKIE insert indirect nocache maxidle 30m maxlife 8hcapture request header X-Forwarded-For len 15capture request header User-Agent len 256stats enablestats refresh 5sstats uri /haproxy_statusstats realm Status\ Page\ Input\ Passwd:stats auth haadmin1:stevenuxstats auth haadmin2:s3cr3tpass
......
3.4.3 验证日志格式
物理机 172.20.1.1 访问状态页面,验证
root@ubuntu-suosuoli-node1:~# tail -f /var/log/haproxy.log
......
Jan 13 21:51:43 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:43.406] stats stats/<STATS> 0/0/0/0/2 200 25009 - - LRNN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /haproxy_status HTTP/1.1"
2020-01-13T21:51:44+08:00 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:44.781] stats stats/<STATS> 0/0/0/1/2 200 25012 - - LRNN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /haproxy_status HTTP/1.1"
Jan 13 21:51:44 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:44.781] stats stats/<STATS> 0/0/0/1/2 200 25012 - - LRNN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /haproxy_status HTTP/1.1"
2020-01-13T21:51:44+08:00 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:44.813] stats stats/<NOSRV> 0/-1/-1/-1/0 503 221 - - SCIN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /favicon.ico HTTP/1.1"
Jan 13 21:51:44 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:44.813] stats stats/<NOSRV> 0/-1/-1/-1/0 503 221 - - SCIN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /favicon.ico HTTP/1.1"
......
四.HAProxy 的 ACL 使用
HAProxy 支持 ACL:访问控制列表(Access Control Lists)是一种基于包过滤的
访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配),
即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、
目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许
其通过或丢弃。
实际上 ACL 的支持是由于 HAProxy 可以从客户端的请求头、服务器中的响应头、客户端
和服务器信息或者其它环境变量中提取数据,获取数据的这个动作被称为获取一个样本
,
获取到这些样本后就可以拿其和预定义的模式进行匹配,并根据匹配结果进行相应的动作。
这些动作的组合就成了 HAProxy 的访问控制。这些动作可以是:拒绝某个请求、选择某个
后端服务器或者添加一个头部字段。
ACL 官方文档
4.1 ACL 配置选项
关键字 | 选项 | ||||
---|---|---|---|---|---|
acl | <aclname> | <criterion> | [flags] | [operator] | [<value>] |
acl | 名称 | 匹配规范 | 匹配模式 | 具体操作符 | 操作对象类型 |
4.1.1 ACL-name
ACL 名称,可以使用大字母 A-Z 小写字母 a-z 数字 0-9 冒号:点.中横线和下划线,
并且严格区分大小写,如 Image_site 和 image_site 完全是两个 acl。
acl image_service hdr_dom(host) -i img.suosuoli.cn
4.1.2 ACL-criterion
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 #目标PORTsrc # 源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.
4.1.3 ACL-flags
- ACL 匹配模式
-
-i
不区分大小写 -
-m
使用指定的 pattern 匹配方法 -
-n
不做 DNS 解析 -
-u
禁止 acl 重名,否则多个同名 ACL 匹配或关系
4.1.4 ACL-operator
ACL 操作符
整数比较:eq、ge、gt、le、lt
字符比较:
exact match (-m str) :字符串必须完全匹配模式
substring match (-m sub) :在提取的字符串中查找模式,如果其中任何一个被发现,ACL 将匹配
prefix match (-m beg) :在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL 将匹配
suffix match (-m end) :将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则 ACL 进行匹配
subdir match (-m dir) :查看提取出来的用斜线分隔(“/”)的字符串,如果其中任何一个匹配,则 ACL 进行匹配
domain match (-m dom) :查找提取的用点(“.”)分隔字符串,如果其中任何一个匹配,则 ACL 进行匹配
4.1.5 ACL-value
value 的类型
The ACL engine can match these types against patterns of the following types :
- Boolean # 布尔类型的值
- integer or integer range # 整数或整数范围,比如用于匹配端口范围
- IP address / network # IP 地址或 IP 范围, 192.168.0.1 ,192.168.0.1/24
- string--> www.suosuoli.cnexact –精确比较substring—子串suffix-后缀比较prefix-前缀比较subdir-路径, /wp-includes/js/jquery/jquery.jsdomain-域名,www.suosuoli.cn
- regular expression # 正则表达式
- hex block # 16 进制
4.2 ACL 调用
调用 ACL 时可以使用基本的逻辑与,或,非等关系来匹配多个样本
- 与:隐式(默认)使用
- 或:使用"or" 或 "||"表示
- 否定:使用"!" 表示
示例:
# if后面的即为定义的ACL名称,可以是一个或多个
if valid_src valid_port # 与关系,A 和 B 都要满足为 true
if invalid_src || invalid_port # 或,A 或者 B 满足一个为 true
if ! invalid_src # 非,取反,A 和 B 哪个也不满足为 true
4.3 ACL 示例
4.3.1 域名匹配
可以匹配用户访问的域名来将其请求调度到某后端服务器。
frontend WEB_PORT_80bind 172.20.2.189:8080mode httpuse_backend web_prot_http_nodesacl acl1 hdr_dom(host) blog.suosuoli.cn # 定义ACLuse_backend suosuoli_host if acl1 # 如果ACL(acl1)匹配,(即样本hdr_dom(host) 和 # blog.suosuoli.cn匹配)则挑选suosuoli_host后端服务器处理请求default_backend default_hostbackend default_hostmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend suosuoli_host # suosuoli_host后端服务器组mode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
4.3.2 基于源 IP 或子网调度
frontend WEB_PORT_80bind 172.20.2.189:8080mode http# use_backend web_prot_http_nodes#acl acl1 hdr_dom(host) blog.suosuoli.cnacl ip_range_acl src 172.20.1.0/24 172.20.2.44 # 如果客户端源地址来自172.20.1.0/24网段或# 者172.20.2.44就将请求转发给suosuoli_host服务器组use_backend suosuoli_host if ip_range_acl# block if ip_range_acl # 拒绝该请求default_backend default_hostbackend default_hostmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend suosuoli_hostmode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
172.20.2.44 访问测试
[root@node3 ~]# curl 172.20.2.189:8080
suosuoli.cn-172.20.2.45-node4
[root@node3 ~]# curl 172.20.2.189:8080
suosuoli.cn-172.20.2.45-node4
[root@node3 ~]# curl 172.20.2.189:8080
suosuoli.cn-172.20.2.45-node4
172.20.2.195 访问测试
[root@server-node1 ~]# curl 172.20.2.189:8080
suosuoli.cn-172.20.2.44-node3
[root@server-node1 ~]# curl 172.20.2.189:8080
suosuoli.cn-172.20.2.44-node3
4.3.3 匹配浏览器类型
匹配客户端浏览器,将不同类型的浏览器调动至不同的服务器组
frontend WEB_PORT_80bind 172.20.2.189:8080mode http# use_backend web_prot_http_nodes#acl acl1 hdr_dom(host) blog.suosuoli.cn#acl ip_range_acl src 172.20.1.0/24 172.20.2.44# 匹配FireFox浏览器,将其请求调度给172.20.2.45acl user-agent-acl hdr(User-Agent) -m sub -i "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0"redirect prefix http://172.20.2.45 if user-agent-acl#use_backend suosuoli_host if ip_range_acldefault_backend default_hostbackend default_hostmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend suosuoli_hostmode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
可以看到 FireFox 浏览器的请求被调度到 172.20.2.45
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q7TiZrWE-1692579947296)(png/2020-01-14-20-11-10.png)]
Edge 浏览器的请求被调度到 172.20.2.44
同样,curl 浏览器被调度到 172.20.2.44
[root@server-node1 ~]# curl 172.20.2.189:8080
suosuoli.cn-172.20.2.44-node3
[root@server-node1 ~]# curl 172.20.2.189:8080
suosuoli.cn-172.20.2.44-node3
4.3.4 基于文件后缀名实现动静分离
frontend WEB_PORT_80bind 172.20.2.189:8080mode httpacl php_handle path_end -i .phpuse_backend server_php if php_handleacl image_handle path_end -i .jpg .webp .jpeg .gif .pnguse_backend server_image if image_handle#use_backend suosuoli_host if ip_range_acldefault_backend default_hostbackend server_phpmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend server_imagemode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
访问测试
curl http://172.20.2.189:8080/php/test.php
curl http://172.20.2.189:8080/images/test.png
4.3.5 匹配访问路径实现动静分离
frontend WEB_PORT_80bind 172.20.2.189:8080mode httpacl static_handle path_beg -i /static /images /javascriptuse_backend server_static if static_handle#acl image_handle path_end -i .jpg .webp .jpeg .gif .png#use_backend server_image if image_handledefault_backend default_hostbackend server_phpmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend server_staticmode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
访问测试
curl http://172.20.2.189:8080/static/001.png
4.3.6 基于 ACL 的 HTTP 访问控制
frontend WEB_PORT_80bind 172.20.2.189:8080mode httpacl php_handle path_end -i .phpuse_backend server_php if php_handleacl image_handle path_end -i .jpg .webp .jpeg .gif .pnguse_backend server_image if image_handle#use_backend suosuoli_host if ip_range_aclacl deny_vicious_guy src 172.20.1.1http-request deny if deny_vicious_guyhttp-request allowdefault_backend default_hostbackend server_phpmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend server_imagemode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
4.4 预定义的 ACL 使用
HAProxy 提供一下预定义的 ACL
ACL name | Equivalent to | Usage |
---|---|---|
FALSE | always*false | never match |
HTTP | req_proto_http | match if protocol is valid HTTP |
HTTP_1.0 | req_ver 1.0 | match HTTP version 1.0 |
HTTP_1.1 | req_ver 1.1 | match HTTP version 1.1 |
HTTP_CONTENT | hdr_val(content-length) gt 0 | match an existing content-length |
HTTP*URL_SLASH | url_beg / | match URL beginning with “/” |
HTTP_URL_STAR | url * | match URL equal to “*” |
LOCALHOST | src 127.0.0.1/8 | match connection from local host |
METH_CONNECT | method CONNECT | match HTTP CONNECT method |
METH_DELETE | method DELETE | match HTTP DELETE method |
METH_GET | method GET HEAD | match HTTP GET or HEAD method |
METH_HEAD | method HEAD | match HTTP HEAD method |
METH_OPTIONS | method OPTIONS | match HTTP OPTIONS method |
METH_POST | method POST | match HTTP POST method |
METH_PUT | method PUT | match HTTP PUT method |
METH_TRACE | method TRACE | match HTTP TRACE method |
RDP_COOKIE | req_rdp_cookie_cnt gt 0 | match presence of an RDP cookie |
REQ_CONTENT | req_len gt 0 | match data in the request buffer |
TRUE | always_true | always match |
WAIT_END | wait_end | wait for end of content analysis |
使用预定于的 ACL
listen web_hostbind 192.168.7.101:80mode httpbalance roundrobinlog globaloption httplogacl static_path path_beg -i /static /images /javascript# 如果使用HTTP/1.1协议,并且访问静态资源,就调度到static_path_host服务器组use_backend static_path_host if HTTP_1.1 TRUE static_pathdefault_backend default_webbackend php_server_hostmode httpserver web1 192.168.7.103 check inter 2000 fall 3 rise 5backend static_path_hostmode httpserver web1 192.168.7.104 check inter 2000 fall 3 rise 5backend default_webmode httpserver web1 192.168.7.102:80 check inter 2000 fall 3 rise 5
五.自定义 HAProxy 错误界面
对错误界面进行重定向,以便显示比较有亲和力的页面,安慰客户。
5.1 基于错误页面文件实现
defaults
#option forwardfor
#no option http-use-htx
#...... #以下三行
errorfile 500 /usr/local/haproxy/html/500.html
errorfile 502 /usr/local/haproxy/html/502.html
errorfile 503 /usr/local/haproxy/html/503.html
5.2 基于 HTTP 重定向实现
defaults
#option http-keep-alive
#option forwardfor
#no option http-use-htx
#...... 以下一行
errorloc 503 http://192.168.7.102/error_page/503.html
六.HAProxy 四层负载
HAProxy 的四层负载转发可针对有特殊访问的应用场景,如下面的应用:
Memcached
Redis
MySQL
RabbitMQ
6.1 四层负载示例
listen redis-portbind 192.168.7.102:6379mode tcpbalance leastconnserver server1 192.168.7.104:6379 checkserver server1 192.168.7.103:6379 check backup
6.2 使用 ACL 进行四层访问控制
listen web_hostbind 192.168.7.101:80mode httpbalance roundrobinlog globaloption httplogacl static_path path_beg -i /static /images /javascriptuse_backend static_path_host if HTTP_1.1 TRUE static_pathacl invalid_src src 192.168.1.0/24 192.168.7.102tcp-request connection reject if invalid_srcdefault_backend default_webbackend php_server_hostmode httpserver web1 192.168.7.103 check inter 2000 fall 3 rise 5backend static_path_hostmode httpserver web1 192.168.7.104 check inter 2000 fall 3 rise 5backend default_webmode httpserver web1 192.168.7.102:80 check inter 2000 fall 3 rise 5
6.3 HAProxy 的压缩功能配置
对响应给客户端的报文进行压缩,以节省网络带宽,但是会占用部分 CPU 性能
6.3.1 配置项说明
compression algo # 启用http协议中的压缩机制,常用算法有gzip deflateidentity # 调试使用的压缩方式gzip # 常用的压缩方式,与各浏览器兼容较好deflate # 有些浏览器不支持raw-deflate # 新出的压缩方式
compression type # 要压缩的文件类型
6.3.2 配置示例
listen web_hostbind 192.168.7.101:80mode httpbalance roundrobinlog globaloption httplog#capture request header X-Forwarded-For len 15#capture request header User-Agent len 512compression algo gzip deflatecompression type compression type text/plain text/html text/css text/xml text/javascript application/javascriptcookie SERVER-COOKIE insert indirect nocacheserver web1 192.168.7.103:80 cookie web1 check inter 3000 fall 3 rise 5server web2 192.168.7.104:80 cookie web2 check inter 3000 fall 3 rise 5
七. HAProxy 实现 HTTPS
配置 HAProxy 支持 https 协议:
支持 ssl 会话;
bind \*:443 ssl crt /PATH/TO/SOME_PEM_FILE
crt 证书文件为 PEM 格式,且同时包含证书和所有私钥cat demo.crt demo.key > demo.pem
把 80 端口的请求重向定 443
bind \*:80
redirect scheme https if !{ ssl_fc }
向后端传递用户请求的协议和端口(frontend 或 backend)
http_request set-header X-Forwarded-Port %[dst_port]
http_request add-header X-Forwared-Proto https if { ssl_fc }
7.1 证书
# mkdir /usr/local/haproxy/certs
# cd /usr/local/haproxy/certs
# openssl genrsa -out haproxy.key 2048
# openssl req -new -x509 -key haproxy.key -out haproxy.crt -subj "/CN=www.suosuoli.cn"
# cat haproxy.key haproxy.crt > haproxy.pem
# openssl x509 -in haproxy.pem -noout -text # 查看证书
7.2 HTTPS 配置
#web server http
frontend web_server-httpbind 192.168.7.101:80redirect scheme https if !{ ssl_fc }mode httpuse_backend web_host#web server https
frontend web_server-httpsbind 192.168.7.101:443 ssl crt /usr/local/haproxy/certs/haproxy.pemmode httpuse_backend web_hostbackend default_hostmode httpserver web1 192.168.7.102:80 check inter 2000 fall 3 rise 5backend web_hostmode httphttp-request set-header X-Forwarded-Port %[dst_port]http-request add-header X-Forwarded-Proto https if { ssl_fc }server web1 192.168.7.103:80 check inter 2000 fall 3 rise 5server web2 192.168.7.104:80 check inter 2000 fall 3 rise 5
相关文章:
HAProxy 高级功能与配置
HAProxy 高级功能与配置 配置和验证的环境看这篇文章:HAProxy 各种调度算法介绍 一.基于 cookie 的会话保持 使用cookie关键字来配置后端服务器基于 cookie 的会话持久连接。 配置格式 cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ][ post…...
cuda编程002—流
没有使用同步的情况: #include <stdio.h> #include <cuda_runtime.h>__global__ void test_kernel(){printf("Message from Device.\n"); } void test(){test_kernel<<<1, 1>>>(); } #include <cuda_runtime.h> #i…...
2023年国赛 高教社杯数学建模思路 - 案例:粒子群算法
文章目录 1 什么是粒子群算法?2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法? 粒子群算法(Pa…...
【C#学习笔记】数据类中常用委托及接口——以List<T>为例
文章目录 List\<T\>/LinkedList \<T\>为什么是神?(泛型为什么是神)一些常见,通用的委托和接口ComparisonEnumerator List<T>/LinkedList <T>为什么是神?(泛型为什么是神࿰…...
idea的断点调试
1、行断点 首先在代码的最左侧点击会显示红色的圆圈 第二步在main方法中右键选中debug run进行运行 会出现下面图片的情况 出现上图之后,点击console 下一步 这个时候就可以看到调试的结果了 6、方法调用栈:这里显示了该线程调试所经过的所有方法&…...
vue和react学哪一个比较有助于以后发展?
前言 首先声明vue和react这两个框架都是很优秀的前端框架,使用的人群下载量上数量也是相当的庞大,这篇文章没有贬低或者攻击任何一个框架的意思,只在于根据答主的问题来对这两个框架做出对比,以方便大家更加清晰的了解到当下vue和…...
【SkyWalking】分布式服务追踪与调用链系统
1、基本介绍 SkyWalking是一个开源的观测平台,官网:Apache SkyWalking; 可监控:分布式追踪调用链 、jvm内存变化、监控报警、查看服务器基本配置信息。 2、SkyWalking架构原理 在整个skywalking的系统中,有三个角色&am…...
Python“牵手”速卖通商品详情API接口运用场景及功能介绍
速卖通电商API接口是针对速卖通提供的电商服务平台,为开发人员提供了简单、可靠的技术来与速卖通电商平台进行数据交互,实现一系列开发、管理和营销等操作。其中包括商品详情API接口,通过这个API接口商家可以获取商品的详细信息,包…...
java调用python脚本的示例
java调用python脚本的示例 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class JavaCallPythonScript {public static void main(String[] args) {// 调用Python脚本的命令String pythonScriptPath "path/to/y…...
【C语言】柔性数组(可边长数组)
一、介绍 柔性数组(Flexible Array),又称可变长数组。一般数组的长度是在编译时确定,而柔性数组对象的长度在运行时确定。在定义结构体时允许创建一个空数组(例如:arr [ 0 ] ),该数…...
C++信息学奥赛1131:基因相关性
这段代码的功能是比较两个字符串的相似度,并根据给定的阈值判断是否相似。 解析注释后的代码如下: #include <iostream> #include <string> using namespace std;int main() {double bf; // 定义双精度浮点数变量bf,用于存储阈…...
如何保证分布式系统中服务的高可用性:应对 ZooKeeper Leader 节点故障的注册处理策略
推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间 https://dr…...
SQL注入之延时注入
文章目录 延时注入是什么?延时注入获取数据库版本号 延时注入是什么? 延时注入就是利用sleep()函数通过if语句判断所写的语句真假,如果为真返回我们想要的东西(例如:数据库的长度,数据库的名字等࿰…...
运维高级学习--Docker(二)
1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 #拉取mysql5.6和owncloud镜像 [rootlocalhost ~]# docker pull mysql:5.6 [rootlocalhost ~]# docker pull owncloud [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED …...
QT的核心——信号与槽
目录 回顾C 语言信号 1、信号与槽 2、关联信号与槽 2.1自动关联信号与槽 2.2手动关联信号与槽 2.3断开信号与槽 3、自定义信号 3.1自定义信号使用条件 3.2自定义槽函数使用条件 4、信号与槽参数传递 4.1自定义一个带参的信号 4.2关联带参的信号与槽 4.3发送一个带…...
【业务功能篇73】web系统架构演变-单体-集群-垂直化-服务化-微服务化
1.服务架构的演 1.1 单体架构 单体架构应该是我们最先接触到的架构实现了,在单体架构中使用经典的三层模型,即表现层,业务逻辑层和数据访问层。 单体架构只适合在应用初期,且访问量比较下的情况下使用,优点是性价比很…...
MyCAT命令行监控
9066端口 ,用mysql命令行连接 Mysql –utest –ptest –P9066 show help 可显示所有相关管理命令 显示后端物理库连接信息,包括当前连接数,端口 Show backend Show connection 显示当前前端客户端连接情况,已经网络流量信息、…...
【python】正则表达式匹配数据
前言 使用正则表达式处理数据,可进行字符串匹配、提取和替换等操作。在python中,通过re库完成正则匹配的操作。 一、正则语法规则 1.常用匹配符 模式描述^匹配字符串开头$匹配字符串结尾.匹配任意字符*匹配前面的字符零次或多次匹配前面的字符一次或多…...
【C++】用Windows API在控制台实现选择选项
2023年8月23日,周三上午 今天上午花了一个小时来实现这个 这个程序在碰到边界时会发出声音, 通过调用Windows API的Beep函数来实现。 #include<Windows.h> #include<conio.h> #include<iostream> #include<cstdlib>const int …...
Golang 批量执行/并发执行
提到Golang,都说Golang 天生高并发。所以分享一下我认为的Golang高并发精髓 简单的并发执行util package util import ("context""sync" )type batchRunner struct {BatchSize intctx context.Contextchannel chan func()wg sy…...
使用go语言、Python脚本搭建一个简单的chatgpt服务网站。
使用go语言、Python脚本搭建一个简单的GPT服务网站 前言 研0在暑假想提升一下自己,自学了go语言编程和机器学习相关学习,但是一味学习理论,终究是枯燥的,于是自己弄点小项目做。 在这之前,建议您需要掌握以下两个技…...
基于java会议室预约系统设计与实现
摘要 一个企业的发展离不开相关的规定流程。信息化到来的今天在我们的生活当中。离不开各种信息化的支持。比如钉钉会议预约、美团买菜、扫码签到等各种信息化软件。他们涉及我们生活中的方方面面给我们的生活提供了更大的便利性。大到政府、企业办公小到人们的衣食住行都离不开…...
Ubuntu18.04 交叉编译curl-7.61.0
下载 官方网址是:curl 安装依赖库 如果需要curl支持https协议,需要先交叉编译 openssl,编译流程如下: Ubuntu18.04 交叉编译openssl-1.1.1_我是谁??的博客-CSDN博客 解压 # 解压: $tar -xzvf curl-7.61.…...
Android相机-HAL子系统
引言 应用框架要通过拍照预览摄像获得照片或者视频,就需要向相机子系统发出请求, 一个请求对应一组结果 一次可发起多个请求,并且提交请求是非阻塞的,始终按照接收的顺序以队列的形式先进先出地进行顺序处理 一个请求包含了拍摄和拍照配置的所有信息&…...
PostgreSQL-研究学习-介绍与安装
PostgreSQL-预研 是个很厉害的数据库的样子 ψ(*`ー)ψ 官方文档:http://www.postgres.cn/docs/12/ 总的结论和备注 PgSQL 支持对JSON的支持很强大,以及提供了很多数学几何相关的数据类型【例:点,线条,几何…...
【Unity细节】Unity制作汽车时,为什么汽车会被弹飞?为什么汽车会一直抖动?
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶🌫️收录于专栏:unity细节和bug 😶🌫️优质专栏 ⭐【…...
Android初学之android studio运行java/kotlin程序
第一步骤:File—>New—>New Module,然后弹出一个框,(左边)选择Java or Kotlin Library,(右边)编辑自己的图书馆名、包名、类名,选择Java一个语言,然后F…...
使用自定义 C ++类扩展 TorchScript
使用自定义 C 类扩展 TorchScript 本教程是自定义运算符教程的后续教程,并介绍了我们为将 C 类同时绑定到 TorchScript 和 Python 而构建的 API。 该 API 与 pybind11 非常相似,如果您熟悉该系统,则大多数概念都将转移过来。 在 C 中实现和…...
UITableView自定义TableHeader和TableFooter
UITableView自定义TableHeader和TableFooter 我猜你希望的效果是这样的 我猜你希望的效果是这样的 自定义页眉视图 让我们创建一个文件名 UITableViewHeaderFooterView 的 CustomerHeaderView 子类。 现在让我们创建视图的 Xib 文件并将其命名为 CustomHeaderView。 更改高度标…...
【TA 挖坑03】雾效 | 透光材质 | Impostor | 厚度转球谐
仍旧是记录下半年想要做的东西,很有趣,实现“一团雾效” “面片也有立体感” 等等效果的一些技术上的方法。 仅粗浅记录,保证之后自己填坑的时候看得懂就行! 透光 -> 透光材质ShadingModel 《永劫无间》透光材质的渲染&…...
网站新闻打不开/全网seo是什么意思
昨天用Extjs2.x建了弹窗里面有一个gridA,然后我希望点击gridA内的行实现弹窗,窗体内也放了一个gridB,但是当我点击gridA的行的时候弹窗是弹出来了不过在gridA的窗体后面,后来我在gridB的弹窗的时候加了一句Ext.getBody()的渲染效果暂时解决了…...
南宁培训网站建设/百度品牌推广
学习目标: 了解事件处理概念监听事件处理模型事件与事件监听接口实现事件监听方式回调事件处理模型常见的事件回调方法Handler类功能与用法Handler更新程序界面一、监听概念 再用户操作动作时,需要为用户的动作提供响应机制,这种机制就是事件处理 Android提供两套事…...
甘肃住房和城乡建设局网站/百度百科推广费用
原地址:http://blog.csdn.net/u012085988/article/details/17531005 资源下载:http://download.csdn.net/detail/u012085988/6770625 (最近csdn貌似出了问题,超链接不能用了,博客写好发布后发现被截短了,这…...
怎么请专业拓客团队/关键词优化最好的方法
图像锐化处理的主要目的是突出图像中的细节,像边沿区域,锐化处理与图像在该点的突变程度有关。图像微分增强了边缘与其他突变的信息,并削弱了灰度变化缓慢的信息。以灰度图像为例,它的理论基础是这样的,如果出现一个边…...
潍坊网站建设怎样/网络营销专业是干嘛的
做奢侈品回收这么久,遇见最多的问题就是大多数的顾客都觉得自己包包贬值太快,舍不得卖!那究竟是什么原因让你的包包贬值这么快呢?这就要说说包包的保值率了~影响包包保值率的原因有很多,主要有:品牌、款式、…...
做网站找谁/世界排名前十位
AngularJS是为了克服html在构建应用上的不足而设计的。HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了。 AngularJS使用了不同的方法,它尝试去补足HTML本身在构建应用方面的缺陷。AngularJS通过使用我们称为标识符(…...