haproxy实列
热更新工具(socat)
1.安装
dnf install socat-1.7.4.1-5.el9.x86_64 -y
2.haproxy
vim /etc/haproxy/haproxy.cfg #写入 stats socket /var/lib/haproxy/stats mode 600 level admin #stats socket:声明一个统计套接字,用于进程间通信(IPC)。
3.看haproxy状态
3.查看集群状态
命令
字段名 | 含义 |
---|---|
be_id | 后端(Backend)的唯一数字标识符 |
be_name | 后端的名称 |
srv_id | 服务器在后端中的唯一数字标识符 |
srv_name | 服务器的名称 |
srv_addr | 服务器的 IP 地址或主机名 |
srv_op_state | 服务器的运行状态(数字编码) |
srv_admin_state | 服务器的管理状态 |
srv_uweight | 用户配置的服务器权重 |
srv_iweight | 服务器的初始权重(基于健康检查动态调整前的权重) |
srv_time_since_last_change | 自上次状态变更以来的时间(毫秒) |
srv_check_status | 最近一次健康检查的状态 |
srv_check_result | 健康检查的详细结果 |
srv_check_health | 健康状态(成功 / 失败次数) |
srv_check_state | 健康检查的当前阶段 |
srv_agent_state | 代理检查状态(如果启用了 agent 检查) |
bk_f_forced_id | 后端强制状态的 ID(用于故障转移) |
srv_f_forced_id | 服务器强制状态的 ID |
srv_fqdn | 服务器的完全限定域名 |
srv_port | 服务器端口号 |
srvrecord | 服务器记录(内部使用) |
srv_use_ssl | 是否使用 SSL 连接到服务器 |
srv_check_port | 健康检查使用的端口 |
srv_check_addr | 健康检查使用的 IP 地址 |
srv_agent_addr | 代理检查的地址 |
srv_agent_port | 代理检查的端口 |
集群权重
设置web1权重为1
关闭后端服务器
打开后端服务器
haproxy状态
配置
测试
haproxy的算法
静态算法
static-rr
配置
测试
first算法
配置
测试
动态算法
roundroubin
配置
测试
leastconn
配置
测试
source
配置
测试
hash
配置
uri
配置
一致性hash
配置
RS1配置文件
RS2
测试
url_param
配置
一致性hash
测试
har
配置
测试
cookie的会话保持
配置
测试
IP透传
四层
haproxy配置
nginx配置
日志
七层透传
haproxy
nginx
日志
ACL
hdr:用于完全匹配 HTTP 请求报文首部的指定字符串,格式为hdr(<name> (,<occ>))
,<name>
是 header 的指定信息,<occ>
表示在多值中使用的值的出现次数。
acl is_google hdr(host) -i www # 匹配Host头为"www"的请求 -i忽略大小写
hdr_beg:前缀匹配,即匹配 header 中指定内容的开头,格式为hdr_beg(<name> (,<occ>))
。
acl is_api hdr_beg(path) /api # 匹配路径以/api开头的内容
hdr_end:后缀匹配,匹配 header 中指定内容的结尾,格式为hdr_end(<name> (,<occ>))
。
acl is_js hdr_end(path) .img # 匹配路径以.img结尾的请求
hdr_dom:域匹配,用于匹配 header 中的域名,格式为hdr_dom(<name> (,<occ>))
。
acl pc_web_page hdr_dom(host) -i www.badidu.com # 匹配所有请求域名为www.badidu.com的请求
hdr_dir:路径匹配,匹配 header 的 uri 路径,格式为hdr_dir(<name> (,<occ>))
。
acl in_images hdr_dir(path) /images # 匹配路径包含"/images"目录的请求
hdr_len:长度匹配,匹配 header 的长度,格式为hdr_len(<name> (,<occ>))
。
acl long_cookie hdr_len(cookie) gt 500 # 匹配Cookie长度超过500的请求
hdr_reg:正则表达式匹配,使用自定义表达式 (regex) 进行模糊匹配,格式为hdr_reg(<name> (,<occ>))
。
acl ie6 hdr_reg(User-Agent) -i MSIE\ [1-6]\. #匹配IE1-6
hdr_sub:子串匹配,在 header 中的 uri 进行模糊匹配,格式为hdr_sub(<name> (,<occ>))
。
acl has_token hdr_sub(authorization) Bearer # 匹配Authorization头包含"Bearer"的请求
2.base:string
返回第一个主机头和请求的路径部分的连接,该请求从主机名host开始,并在问号之前结束,对虚拟主机有用 <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
匹配类型 | 描述 |
---|---|
base | 精确字符串匹配 |
base_beg | 前缀匹配 |
base_dir | 子目录匹配 |
base_dom | 域名匹配 |
base_end | 后缀匹配 |
base_len | 长度匹配 |
base_reg | 正则表达式匹配 |
base_sub | 子字符串匹配 |
3.path : string
提取请求的URL路径,该路径从/<path>开始,并在问号之前结束(无主机部分) <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
匹配类型 | 描述 |
---|---|
path | 精确字符串匹配 |
path_beg | 前缀匹配(请求的 URL 开头,如 /static、/images、/img、/css) |
path_end | 后缀匹配(请求的 URL 中资源的结尾,如 .gif、.png、.css、.js、.jpg、.jpeg) |
path_dom | 域名匹配 |
path_dir | 子目录匹配 |
path_len | 长度匹配 |
path_reg | 正则表达式匹配 |
path_sub | 子字符串匹配 |
4.src | dst
匹配类型 | 描述 |
---|---|
src | 匹配源 IP 地址或网段。 |
src_port | 匹配源端口。 |
dst | 匹配目标 IP 地址(通常是负载均衡器的 IP)。 |
dst_port | 匹配目标端口。 |
ACL-flags 匹配模式
ACL匹配模式
-i 不区分大小写
-m 指定正则的匹配方法
-n 不做DNS解析
-u 禁止acl重名,否则多个同名ACL匹配或关
ACL-operator 具体操作符
整数操作符
操作符 含义 eq 等于 ne 不等于 gt 大于 ge 大于等于 lt 小于 le 小于等于
字串匹配
-m str 完全匹配字符串 字符串必须完全匹配模式 -m sub 包含子串 在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配 -m beg 前缀匹配 在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配 -m end 后缀匹配 将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行匹配 -m dir 路径目录匹配 查看提取出来的用斜线分隔(“/”)的字符串,如其中任一个匹配,则ACL进行匹配 -m dom 域名或子域名匹配 查找提取的用点(“.”)分隔字符串,如果其中任何一个匹配,则ACL进行匹配
组合使用
与:隐式(默认)使用
或:使用“or" 或 “||"表示
否定:使用 "!" 表示
示例
if valid_src valid_port #与关系,ACL中A和B都要满足为true,默认为与 if invalid_src || invalid_port #或,ACL中A或者B满足一个为true if ! invalid_src #非,取反,不满足ACL才为true
示例
配置
地址解析
测试
ip控制
配置
测试
匹配浏览器类型
配置
测试
基于后缀动静分离
配置
测试
基于路径实现动静分离
配置
rs1 rs2
测试
haproxy默认使用的错误错误页面
自定义错误页面
#打开配置文件写入 vim /etc/haproxy/haproxy.cfg errorfile 503 /haproxy/errorpages/503page.http
#创建目录 mkdir /haproxy/errorpages/ -p #复制文件 cp /usr/share/haproxy/503.http /haproxy/errorpages/503page.http #修改 vim /haproxy/errorpages/503page.http HTTP/1.0 503 Service Unavailable^M Cache-Control: no-cache^M Connection: close^M Content-Type: text/html^M ^M <html><body><h1>2222</h1> sorry </body></html> #重启haproxy服务 systemctl restart haproxy.service
测试
四层负载案列
haproxy配置
RS1 RS2
dnf install mariadb-server -y 安装数据库 #启动 systemctl start mariadb
添加用户
测试
https实现
制作证书
mkdir /etc/haproxy/certs/ #制作证书 openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/jxe.key -x509 -days 365 -out /etc/haproxy/certs/jxe.crt #制作.pem文件 cat jxe.key jxe.crt >jxe.pem
haproxy配置
测试