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…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...
