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 nameEquivalent toUsage
FALSEalways*falsenever match
HTTPreq_proto_httpmatch if protocol is valid HTTP
HTTP_1.0req_ver 1.0match HTTP version 1.0
HTTP_1.1req_ver 1.1match HTTP version 1.1
HTTP_CONTENThdr_val(content-length) gt 0match an existing content-length
HTTP*URL_SLASHurl_beg /match URL beginning with “/”
HTTP_URL_STARurl *match URL equal to “*”
LOCALHOSTsrc 127.0.0.1/8match connection from local host
METH_CONNECTmethod CONNECTmatch HTTP CONNECT method
METH_DELETEmethod DELETEmatch HTTP DELETE method
METH_GETmethod GET HEADmatch HTTP GET or HEAD method
METH_HEADmethod HEADmatch HTTP HEAD method
METH_OPTIONSmethod OPTIONSmatch HTTP OPTIONS method
METH_POSTmethod POSTmatch HTTP POST method
METH_PUTmethod PUTmatch HTTP PUT method
METH_TRACEmethod TRACEmatch HTTP TRACE method
RDP_COOKIEreq_rdp_cookie_cnt gt 0match presence of an RDP cookie
REQ_CONTENTreq_len gt 0match data in the request buffer
TRUEalways_truealways match
WAIT_ENDwait_endwait 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/50225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探究代理服务器在网络安全与爬虫中的双重作用

在如今高度互联的世界中&#xff0c;代理服务器已经成为网络安全和爬虫开发的关键工具。本文将深入探讨Socks5代理、IP代理、网络安全、爬虫、HTTP等关键词&#xff0c;以揭示代理服务器在这两个领域中的双重作用&#xff0c;以及如何充分利用这些技术来保障安全和获取数据。 …

制作 Mikrotik CHR AWS AMI 镜像

文章目录 制作 Mikrotik RouterOS CHR AWS AMI 镜像前言前期准备配置 Access Key安装配置 AWS CLI创建 S3 bucket上传 Mikrotik CHR 镜像trust-policy配置role-policy 配置创建 AMI导入镜像查看导入进度导入进度查看注册镜像参考:制作 Mikrotik RouterOS CHR AWS AMI 镜像 前言…

MyBatis动态SQL、模糊查询与结果映射

目录 前言 一、MyBatis动态SQL 1.动态SQL是什么 2.动态SQL的作用 3.常用动态SQL元素 1. where if 元素 2. set if 元素 3. choose when otherwise 元素 4. 自定义 trim 元素 <1>. 自定义 trim 元素改写上面的 where if 语句 <2>. 自定义 trim 元素改…

将AI融入CG特效工作流;对谈Dify创始人张路宇;关于Llama 2的一切资源;普林斯顿LLM高阶课程;LLM当前的10大挑战 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 将AI融入CG特效工作流&#xff0c;体验极致的效率提升 BV1pP411r7HY 这是 B站UP主 特效小哥studio 和 拓星研究所 联合投稿的一个AI特…

SpringBoot 调用外部接口

SpringBoot 调用外部接口 一、第一种方式(HttpClient等) 使用插件方式&#xff0c;比如自带的HttpClient&#xff0c;或者OkHttp&#xff0c;甚至是原生的HttpURLConnection 等等&#xff0c;这里以HttpClient为例。 1、封装工具类 简单封装的get请求 /*** 发送get请求:带请求…

纹波和噪声测试知识

随着开关频率和开关速度不断的提升&#xff0c;在使用开关型的DC/DC电源的时候&#xff0c;要特别关注输入输出电源的纹波。但是测量DC/DC电源的纹波和噪声没有一个行业标准。不同厂家的测试环境以及测试标准都不太一样&#xff0c;导致很多人很迷惑。这篇文章提供了一个简单可…

go rpc

运用go标准库写一个rpc例子 服务端 package mainimport ("fmt""net""net/rpc" )//对象 type Hello struct { } //对象方法 func (h *Hello) HelloWorld(name string, resp *string) error {*resp name "你好"return nil }func mai…

赋能道路交通场景,九州未来助力建成广西交科车路协同智能网联示范园区

智慧高速车路协同需要更加稳固的技术基座 智慧高速是中国高速公路建设的热点之一&#xff0c;车路协同又是未来智慧高速建设的核心内容。高速公路运行环境相对简单、主体权责清晰、路侧机电设施齐全&#xff0c;具备开展车路协同创新示范的良好条件。 广西交科集团&#xff0…

编程锦囊妙计——快速创建本地Mock服务

点击上方&#x1f446;蓝色“Agilean”&#xff0c;发现更多精彩。 前情提要 在本系列上一篇文章《全文干货&#xff1a;打破前后端数据传递鸿沟&#xff0c;高效联调秘笈》中我们分享了使用Zod这一运行时类型校验库来对后端服务响应结果进行验证达到增加项目质量的方式。 这次…

三维重建_体素重建_空间雕刻法/体素着色法

目录 1. 三角化和体素重建的区别 2. 空间雕刻法 空间雕刻法的一致性定义 空间雕刻法具体实现 基于八叉树的空间雕刻法具体实现​编辑 空间雕刻法效果展示 3. 体素着色法 体素着色法的缺点&#xff1a;不唯一性​编辑 体素着色法不唯一性解决措施​编辑 体素着色发实验环境与…

Ansible 自动化安装软件

例子如下&#xff1a; 创建一个名为/ansible/package.yml 的 playbook : 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上 将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上 将 dev 主机组中主机上的所有软件包更新为最新版本 --- - name:…

Linux系统安全:NAT(SNAT、DNAT)

目录 一.NAT 二.SNAT 三.DNAT 一.NAT NAT: network address translation&#xff0c;支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 请求报文&#xff1a;修改源/目标IP&#xff0c; 响应报文&#xff1a;修改源/目标IP&#xff0c;根据…

单片机的串口通信

今天&#xff0c;完整地总结一下普中科技的单片机的串口通信的硬件与编程&#xff0c;记录一下以后如果需要也比较方便捡起来。 单片机的串口部分的电路图。开发板上集成了 1 个串口通信电路&#xff0c;是 USB 转串口模块&#xff0c;它既可下载程序也可实现串口通信功能。 对…

WEB APIs day5

一、window对象 BOM属于window对象 1.BOM&#xff08;浏览器对象模型&#xff09; bom里面包含着dom,只不过bom我们平时用得比较少&#xff0c;我们经常使用的是dom操作&#xff0c;因为我们页面中的这些标签都是在dom中取的&#xff0c;所以我们操作dom多一点。 window对象…

python代码——批量将PPT转换成长图

语言&#xff1a;python 3 用法&#xff1a;点击运行后&#xff0c;弹出窗口&#xff0c;选择文件夹&#xff0c;程序运行会将文件夹内的所有PPT文件全部转换成PPT长图&#xff0c;图片名称与PPT文件名称相同&#xff0c;保存位置相同。 如运行中报错&#xff0c;需要自行根据…

如何在Ubuntu 22.04上安装PHP 8.1并设置本地开发环境

引言 PHP是一种流行的服务器脚本语言&#xff0c;用于创建动态和交互式web页面。开始使用你选择的语言是学习编程的第一步。 本教程将指导您在Ubuntu上安装PHP 8.1&#xff0c;并通过命令行设置本地编程环境。您还将安装依赖管理器Composer&#xff0c;并通过运行脚本来测试您…

8.4 【C语言】通过指针引用字符串

8.4.1 字符串的引用方式 在C程序中&#xff0c;字符串是存放在字符数组中的。想引用一个字符串&#xff0c;可以用以下两种方法。 &#xff08;1&#xff09;用字符数组存放一个字符串&#xff0c;可以通过数组名和下标引用字符串中一个字符&#xff0c;也可以通过数组名和格…

neo4j

UNWIND 将列表里的值展开 CREATE (N0:Person {name: Anders}) CREATE (N1:Person {name: Becky}) CREATE (N2:Person {name: Cesar}) CREATE (N3:Person {name: Dilshad}) CREATE (N4:Person {name: George}) CREATE (N5:Person {name: Filipa})CREATE (N0)-[:KNOWS]->(N3)…

spark基于HNSW向量检索

参考文档&#xff1a;https://talks.anghami.com/blazing-fast-approximate-nearest-neighbour-search-on-apache-spark-using-hnsw/ HNSW参数调优文档&#xff1a;https://github.com/nmslib/hnswlib/blob/master/ALGO_PARAMS.md spark 运行HNSW向量检索分为以下三步 1 创建H…

VUE初识

vue是一个用于构建用户界面的渐进是框架 优点&#xff0c;大大提高开发效率 缺点&#xff0c;需要记忆语法规则 构建用户界面 创建vue实例&#xff0c;初始化渲染 1&#xff1a;准备容启 2&#xff1a;引包&#xff0c;开发版本和生产版本 3.创建vue实例 new Vue&#x…