电子商务网站建设课程标准,wordpress wp rocket,漳州企业网站建设,wordpress会员管理1. Haproxy 介绍
HAProxy是法国开发者 威利塔罗#xff08;Willy Tarreau#xff09; 使用C语言编写的自由及开放源代码软件#xff0c;是一款具备高并发#xff08;万级以上#xff09;、高性能的TCP和HTTP应用程序代理.
HAProxy运行在当前的硬件上#xff0c;可以支持…1. Haproxy 介绍
HAProxy是法国开发者 威利塔罗Willy Tarreau 使用C语言编写的自由及开放源代码软件是一款具备高并发万级以上、高性能的TCP和HTTP应用程序代理.
HAProxy运行在当前的硬件上可以支持数以万计的并发连接并且它的运行模式使得它可以很简单安全地整合进用户当前的架构中同时可以保护用户的web服务器不被暴露到网络上.
截止目前GitHub、Bitbucket、Reddit、Twitter等在内的知名网站都使用了HAProxy.
2. Haproxy 配置
2.1 技术术语
名称说明慢启动刚启动的服务器不会被分配到所有的服务请求而是先分配一部分服务器状态良好后再分配一部分直到逼近服务器可承受范围内极限
2.2 基本配置
文章末尾的 Haproxy实战 基于此配置环境
2.2.1 Haproxy
vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
ideth0
typeethernet
interface-nameeth0[ipv4]
address1172.25.254.100/24,172.25.254.2
methodmanualnmcli connection reload
nmcli connection up eth0dnf install haproxy-2.4.22-3.el9_3.x86_64 -y
vim /etc/haproxy/haproxy.cfg
# 前后端分开配置67 frontend Webcluster 68 bind *:80 69 mode http70 use_backend Webculuster-host71 72 backend Webculuster-host73 balance roundrobin74 server Web1 172.25.254.10:8075 server Web2 172.25.254.20:80
# 同时配置前后端 两种方法 二选一即可
listen Webclusterbind *:80mode httpbalance roundrobinserver Web1 172.25.254.10:80server Web2 172.25.254.20:80systemctl restart haproxy.serviceServer1
vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
ideth0
typeethernet
interface-nameeth0[ipv4]
address1172.25.254.10/24,172.25.254.2
methodmanualnmcli connection reload
nmcli connection up eth0dnf install nginx -y
echo Web-Server - 172.25.254.10 /usr/share/nginx/html/index.html
systemctl enable --now nginx.service2.2.2 Server2
vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
ideth0
typeethernet
interface-nameeth0[ipv4]
address1172.25.254.20/24,172.25.254.2
methodmanualnmcli connection reload
nmcli connection up eth0dnf install nginx -y
echo Web-Server - 172.25.254.20 /usr/share/nginx/html/index.html
systemctl enable --now nginx.service2.2.3 测试Windows终端
# 正常访问
curl 172.25.254.100
Web-Server - 172.25.254.10
curl 172.25.254.100
Web-Server - 172.25.254.20
curl 172.25.254.100
Web-Server - 172.25.254.10
curl 172.25.254.100
Web-Server - 172.25.254.20
# 自动后端检测
[rootServer2 ~]# systemctl stop nginx.service
curl 172.25.254.100
Web-Server - 172.25.254.10
curl 172.25.254.100
Web-Server - 172.25.254.10
curl 172.25.254.100
Web-Server - 172.25.254.10
# 故障或下线服务器 将不再被分配客户端请求2.3 配置文件
/etc/haproxy/haproxy.cfg 配置文件路径
由两大部分共同构成分别为 global全局配置段 进程及安全配置相关参数性能调整相关参数Debug参数 proxies代理配置段 defaults为frontend, backendlisten提供默认配置frontend前端相当于nginx中的server {}backend后端相当于nginx中的upstream {}listen同时配置前后端配置简单推荐使用
2.3.1 global配置
参数说明chroot锁定运行目录deamon以守护进程运行user, group, uid, gid运行haproxy的用户身份stats socket套接字文件nbproc N开启的haproxy worker 进程数默认进程数是一个nbthread 1 和nbproc 互斥指定每个haproxy进程开启的线程数默认为每个进程一个 线程cpu-map 1 0绑定haproxy worker 进程至指定CPU将第1个work进程绑定至0号CPUcpu-map 2 1绑定haproxy worker 进程至指定CPU将第2个work进程绑定至1号CPUmaxconn N每个haproxy进程的最大并发连接数maxsslconn N每个haproxy进程ssl最大连接数用于haproxy配置了证书的场景下maxconnrate N每个进程每秒创建的最大连接数量spread-checks N后端server状态check随机提前或延迟百分比时间建议2- 5(20%-50%)之间默认值0pidfile指定pid文件路径log 127.0.0.1 local2 info定义全局的syslog服务器日志服务器需要开启UDP协议 最多可以定义两个
2.3.2 proxies 配置
参数说明defaults默认配置项针对以下的frontend、backend和listen生效frontend前端ServerName类似于LVS服务集群backend后端服务器组类似于LVS中的RS服务器listen将frontend和backend合并在一起配置
name字段只能使用大小写字母数字短杠 - 下划线 _ 点 . 和冒号 : 并且严格区分大小写
defaults 配置分析
行数46 defaults参数说明47mode httpHAProxy实例使用的连接协议48log global指定日志地址和记录日志条目的global表示使用 global 配置段中设定的log值49option httplog日志记录选项httplog表示记录与 HTTP 会话相关的各种属性值包括 HTTP请求、会话状态、连接数、源地址以及连接时间等50option dontlognulldontlognull表示不记录空会话连接日志51option http-server-close等待客户端完整HTTP请求的时间52option forwardfor except 127.0.0.0/8透传客户端真实IP至后端web服务器**IP透传**在Apache配置文件中加入:br%{X-Forwarded-For}i 后在Webserver中看日志即可看到地址透传信息53option redispatch当server id对应的服务器挂掉后强制定向到其他健康的服务器重新派发54retries 3连接后端服务器失败次数55timeout http-request 10s等待客户端请求完全被接收和处理的最长时间56timeout queue 1m设置删除连接和客户端收到503或服务不可用等提示信息前的等待时间57timeout connect 10s设置等待服务器连接成功的时间58timeout client 1m设置允许客户端处于非活动状态即客户端既不发送数据也不接收数据的时间59timeout server 1m设置服务器超时时间即服务器处于既不接收也不发送数据的非活动时间60timeout http-keep-alive 10ssession 会话保持超时时间此时间段内会转发到相同的后端服务器61timeout check 10s指定后端服务器健康检查的超时时间62maxconn 3000最大并发连接数option http-keep-alive开启与客户端的会话保持
frontend 配置分析 67 # frontend Webcluster68 # bind *:8069 # mode http70 # use_backend Webculuster-host 调用backend的名称# bind指定HAProxy的监听地址可以是IPV4或IPV6可以同时监听多个IP或端口可同时用于listen字段中
# 格式bind address:port_range , ...address:port_range, ...
# 如果需要绑定在非本机的IP需要开启内核参数net.ipv4.ip_nonlocal_bind1
# backlog backlog #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度注意不支持backend
backend 配置分析
定义一组后端服务器backend 的名称必须唯一并且必须在listen或frontend中事先定义才可以使用否则服务无法启动
# frontend Your-Name
# bind 172.25.254.100:80
# mode http
# use_backend backend-name #调用backend的名称mode http|tcp # 指定负载协议类型,必须和对应的frontend保持一致
option # 配置选项
server # 定义后端real server,必须指定IP和端口Server 配置
# server web1 192.168.0.101:80 check inter 3s fall 3 rise 5
# server web2 192.168.0.102:80 check inter 3s fall 3 rise 5参数说明check对指定RS进行健康状态检查如果不加此参数默认不开启检查默认对相应的 RS 的IP和端口利用TCP连接进行周期性健康性检查注意必须指定端口才能实现健康性检查addr IP可指定的健康状态监测IP可以是专门的数据网段port num指定的健康状态监测端口inter num健康状态检查间隔时间默认2000 msfall num后端服务器从线上转为线下的检查的连续失效次数默认为3rise num后端服务器从下线恢复上线的检查的连续有效次数默认为2weight weight权重值默认为1最大值为2560 表示不参与负载均衡但仍接受持久连接backup将后端服务器标记为备份状态只在所有非备份主机Down机时提供服务disabled将后端服务器标记为不可用状态即维护状态除了持久模式将不再接受连接状态为深黄色不再接受新用户的请求redirect prefix将请求临时重定向至其它URL只适用于http模式maxconn当前 RS 的最大并发连接数
listen 配置分析
替代 frontend 和 backend 从而简化设置通常只用于TCP协议的应用
# listen webserver_80
# bind 172.25.254.100:80
# mode http
# option forwardfor
# server webserver1 192.168.0.101:80 check inter 3s fall 3 rise 5
# server webserver2 192.168.0.102:80 check inter 3s fall 3 rise 52.4 Socat 工具
2.4.1 Socat 介绍
对 服务器权重 或 其它状态 进行动态调整 可以利用 socat 工具进行调整
Socat 是 Linux 下的一个多功能的网络工具名字来由是Socket CAT相当于NetCAT的增强版
Socat 的主要特点就是在两个数据流之间建立双向通道且支持众多协议和链接方式
2.4.2 Socat 使用
# 首先修改 Haproxy 的配置文件才能正常使用
vim /etc/haproxy/haproxy.cfg35 # turn on stats unix socket36 stats socket /var/lib/haproxy/stats # 默认情况下只能进行查看不能进行更改-- stats socket /var/lib/haproxy/stats mode 600 level admin# 安装Socat
dnf install socat -y# 查看帮助
echo help | socat stdio /var/lib/haproxy/stats
......
enable server : enable a disabled server (use set server instead) # 启用服务器
set maxconn server : change a servers maxconn setting
set server : change a servers state, weight or address # 设置服务器
get weight : report a servers current weight # 查看权重
set weight : change a servers weight (deprecated) # 设置权重
......# 查看haproxy 状态
echo show info | socat stdio /var/lib/haproxy/stats
# 查看集群状态
echo show servers state | socat stdio /var/lib/haproxy/stats
# 查看集群权重
echo get weight webcluster/web1 | socat stdio
echo get weight webcluster/web2 | socat stdio
# 设置权重
echo set weight webcluster/web1 | socat stdio
# 下线后端服务器
echo disable server webcluster/web1 | socat stdio
# 上线后端服务器
echo enable server webcluster/web1 | socat stdio2.4.3 Socat的多线程管理
如果Haproxy 开启多进程那么对进程的 Sock 文件进行操作时会导致操作是随机不够准确
指定操作进程需要用多 Sock 文件方式解决 35 # turn on stats unix socket36 stats socket /var/lib/haproxy/stats1 mode 600 level admin process 137 stats socket /var/lib/haproxy/stats2 mode 600 level admin process 238 nbproc 239 cpu-map 1 040 cpu-map 2 1则每个进程都有对应的 Sock 文件进行操作
[rootHaproxy ~]# ll /var/lib/haproxy/
srw------- 1 root root 0 8月 11 22:43 stats
srw------- 1 root root 0 8月 11 22:46 stats1
srw------- 1 root root 0 8月 11 22:46 stats23. Haproxy 算法
HAProxy 通过固定参数 balance 指明对后端服务器的调度算法固定参数 balance 可以配置在 listen 或 backend 选项中
3.1 静态算法
静态算法按照事先定义好的规则轮询公平调度不关心后端服务器的当前负载、连接数和响应速度等且无法实时修改权重只能设置成 0 或 1只能靠重启HAProxy生效
3.1.1 Rr基于权重的轮询调度
不支持权重动态调整不支持服务器慢启动后端服务器没有数量限制相当于LVS中的Wrr算法
3.1.2 First 不支持权重动态调整 根据后端服务器在列表中的位置自上而下进行调度 当前面的服务器的连接数达到上限时才会把新的请求分配给下一个服务器 忽略服务器权重
3.2 动态算法
基于后端服务器状态可以进行适当调整最新请求将优先分配给当前负载较低的服务器权重可以在Haproxy运行时进行动态调整无需重启
3.2.1 Roundrobin
基于权重的轮询动态调度算法支持权重动态调整支持服务器慢启动每个后端 Backend 存在上限最多支持 4095 个 RSHaproxy的默认调度算法
3.2.2 Leastconn 根据当前连接数最少的后端服务器分配请求而不是权重 当服务器连接数相同以权重为主 支持权重动态调整 支持服务器慢启动 适合长连接的场景MySQL等
3.3 其他算法
此类算法可以根据参数在静态或动态算法中进行转换
3.3.1 Source
基于用户源地址Hash将请求转发到后端服务器后续同一个源地址请求将被转发至同一个后端服务器但当后端服务器数量发生变化时会导致很多用户的请求转发至新的后端服务器。
默认是静态算法可以通过Hash-Type选项更改运行模式
Source对后端服务器的选择有两种方法
取模法Map-Base一致性Hash
3.3.2 Map-Base 取模法
先对Source地址进行Hash计算再基于服务器总权重的取模取相除后的余数最终结果会决定客户端请求被分配到哪个后端服务器上
静态方法不支持动态调整权重不支持慢启动可以实现后端服务器均衡调度是Source Hash-Type选项 默认使用的算法
缺点当服务器总权重发生变化时导致调度结果整体变化
3.3.3 一致性Hash
一致性哈希当服务器的总权重发生变化时对调度结果影响是局部的不会引起大的变动
动态算法支持利用 socat 等工具进行动态权重调整支持服务器慢启动
1、后端服务器哈希环点keyAhash(后端服务器虚拟ip)%(2^32)
2、客户机哈希环点key1hash(client_ip)%(2^32) 得到的值在[0—4294967295]之间
3、将keyA和key1都放在hash环上将用户请求调度到离key1最近的keyA对应的后端服务器
Hash环偏斜
当多个服务器IP经过Hash运算后彼此的值相差不大在环上呈现紧靠的现象
此时最小Hash值对应的服务器需要处理大部分的服务请求这种现象称为 一致性Hash环倾斜
解决方案
增加虚拟服务器IP数量
比如一个后端服务器根据权重为1则生成1000个虚拟IP再Hash
另一个后端服务器权重为2则生成2000的虚拟IP再Hash
最终在Hash环上生成3000个节点从而解决Hash环偏斜问题
3.3.4 URL
基于对用户请求的URI的左半部分或整个URL做Hash再将Hash结果对总权重进行取模后根据结果将请求转发到后端指定服务器上
适用于后端是缓存服务器场景静态算法也可以通过Hash-Type指定Map-Based和一致性Hash
URL算法基于应用层因此只支持 mode HTTP 不支持 mode TCP
3.3.5 URL_Param
对用户请求的 URL 中的 Params 部分中的一个参数 Key 对应的 Value 值作 Hash 计算并由 服务器总权重 相除根据结果将客户端请求转发到后端指定服务器上
适用于电商网络
用于追踪用户以确保来自同一个用户的请求始终发往同一个后端服务器
如果没有key则会使用默认轮询调度算法Roundrobin
3.3.6 HDR
针对用户每个HTTP头部Header请求中的指定信息做Hash
由 Name 指定的HTTP首部将会被取出并做Hash计算然后由服务器总权重取模后根据结果将客户端请求转发到后端指定服务器上
如果没有有效值则会使用默认轮询调度算法Roundrobin
4. Haproxy 实战
4.1 Haproxy 基于Cookie的会话保持
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg67 listen Webcluster68 bind *:8069 mode http70 balance roundrobin71 cookie WEBCOOKIE insert nocache indirect72 server Web1 172.25.254.10:80 cookie est1 check inter 2 fall 3 rise 5 weight 173 server Web2 172.25.254.20:80 cookie est2 check inter 2 fall 3 rise 5 weight 1
systemctl restart haproxy.service测试 [C:\~]$ curl -b WEBCOOKIEest1 172.25.254.100
Web-Server - 172.25.254.10[C:\~]$ curl -b WEBCOOKIEest2 172.25.254.100
Web-Server - 172.25.254.204.2 Haproxy 状态页
Haproxy 自带一个状态方便我们观察服务器的健康状态
4.2.1 状态页配置
参数名称stats enable基于默认的参数启用stats pagestats hide-version将状态页中haproxy版本隐藏stats refresh delay设定自动刷新时间间隔默认不自动刷新过快耗费性能stats uri prefix自定义stats page uri默认值/haproxy/statusstats auth : user:passwd认证时的账号和密码可定义多个用户,每行指定一个用户默认no authenticationstats admin { if | unless } cond启用stats page中的管理功能
4.2.2 启用状态页
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg75 listen status76 mode http77 bind *:131478 stats enable79 stats uri /status80 stats auth haproxy:1314
[rootHaproxy ~]# systemctl restart haproxy.service可以根据需求将不需要的信息过滤掉
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg82 #frontend main............
105 # server app4 127.0.0.1:5004 check
# 将 82-105 行注释掉
[rootHaproxy ~]# systemctl restart haproxy.service 4.2.3 Haproxy 状态页信息
参数左上角说明pid 1200 (process #1, nbproc 1, nbthread 4)当前PID号当前进程号一共多少进程和每个进程多少个线程uptime 0d 0h00m09s启动了多长时间system limits: memmax unlimited; ulimit-n 8038系统资源限制内存最大打开文件数maxsock 8038; maxconn 4000; maxpipes 0最大socket连接数单进程最大连接数最大管道数current conns 1; current pipes 0/0; conn rate 1/sec; bit rate 0.000 kbps当前连接数当前管道数当前连接速率Running tasks: 0/18; idle 94 %运行的任务/当前空闲率
参数正上方active UP在线服务器backup UP标记为backup的服务器active UP, going down监测未通过正在进入down过程backup UP, going down备份服务器正在进入down过程active DOWN, going updown的服务器正在进入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 maintenanceactive或者backup被人为软下线(人为将weight改成0)
Server 参数Session rate每秒的连接会话信息Cur每秒的当前会话数量Max每秒新的最大会话数量Limit每秒新的会话限制量Sessions会话信息Cur当前会话量Max最大会话量Limit限制会话量Total总共会话量LbTot选中一台服务器所用的总时间Last和服务器的持续连接时间BytesIn网络的字节输入总量Out网络的字节输出总量Denied拒绝统计信息Req拒绝请求量Resp拒绝回复量Errors错误统计信息Req错误请求量Conn错误链接量Resp错误响应量Warnings警告统计信息Retr重新尝试次数Redis再次发送次数ServerRS 信息Status后端机的状态包括UP和DOWNLastChk持续检查后端服务器的时间Wght权重Act活动链接数量Bck备份的服务器数量Chk心跳检测时间Dwn后端服务器连接后都是DOWN的数量Dwntme总的downtime时间ThrtleServer 状态
4.3 Haproxy IP透传
Web服务器中需要记录客户端的真实IP地址用于做访问统计、安全防护、行为分析、区域排行等场景
4.3.1 七层透传
不做透传
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg
46 defaults
......
52 #option forwardfor except 127.0.0.0/8
[rootHaproxy ~]# systemctl restart haproxy.service[C:\~]$ curl 172.25.254.100
Web-Server - 172.25.254.20# 不能显示客户端的IP
[rootServer2 ~]# cat /var/log/nginx/access.log
172.25.254.100 - - [12/Aug/2024:02:12:08 0800] GET / HTTP/1.1 200 27 - curl/8.0.1 -做透传
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg
46 defaults
......
52 option forwardfor except 127.0.0.0/8 # 当客户端IP为回环时不做透传
[rootHaproxy ~]# systemctl restart haproxy.service[C:\~]$ curl 172.25.254.100
Web-Server - 172.25.254.20# 显示客户端的IP
[rootServer2 ~]# cat /var/log/nginx/access.log
172.25.254.100 - - [12/Aug/2024:14:13:24 0800] GET / HTTP/1.1 200 27 - curl/8.0.1 172.25.254.1Nginx 默认配置好透传而Apache则没有
HTTP七层透传
[rootServer1 ~]# yum install httpd -y
[rootServer1 ~]# systemctl disable nginx.service
[rootServer1 ~]# systemctl start httpd[C:\~]$ curl 172.25.254.100
Web-Server - 172.25.254.10# 不显示客户端的IP
[rootServer1 ~]# cat /etc/httpd/logs/access_log
172.25.254.100 - - [12/Aug/2024:14:18:30 0800] GET / HTTP/1.1 200 26 - curl/8.0.1[rootServer1 ~]# vim /etc/httpd/conf/httpd.conf
201 LogFormat %{X-Forwarded-For}i %h %l %u %t \%r\ %s %b \%{Referer}i\ \%{User-Agent}i\ combined
[rootServer1 ~]# systemctl restart httpd[C:\~]$ curl 172.25.254.100
Web-Server - 172.25.254.10[rootServer1 ~]# cat /etc/httpd/logs/access_log
172.25.254.1 172.25.254.100 - - [12/Aug/2024:14:34:31 0800] GET / HTTP/1.1 200 26 - curl/8.0.14.3.2 四层透传
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg66 listen web-server67 bind *:8068 mode tcp # TCP 四层透传69 balance roundrobin70 server web1 172.25.254.10:80 check inter 2 fall 2 rise 571 server web2 172.25.254.20:80 check inter 2 fall 2 rise 5# 两个服务均不能显示客户端IP
[rootServer1 ~]# cat /etc/httpd/logs/access_log
- 172.25.254.100 - - [12/Aug/2024:02:37:17 0800] GET / HTTP/1.1 200 26 - curl/8.0.1
[rootServer2 ~]# cat /var/log/nginx/access.log
172.25.254.100 - - [12/Aug/2024:02:37:18 0800] GET / HTTP/1.1 200 27 - curl/8.0.1 -[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg66 listen web-server67 bind *:8068 mode tcp69 balance roundrobin70 server web1 172.25.254.10:80 check inter 2 fall 2 rise 571 server web2 172.25.254.20:80 send-proxy check inter 2 fall 2 rise 5
[rootHaproxy ~]# systemctl restart haproxy.service[rootServer2 ~]# vim /etc/nginx/nginx.conf18 log_format main $remote_addr - $remote_user [$time_local] $request 19 $status $body_bytes_sent $http_referer 20 $proxy_protocol_addr # 新增行21 $http_user_agent $http_x_forwarded_for;39 listen 80 proxy_protocol; # 启用此项将无法直接访问网站只能通过四层代理访问,如果做七层透传 proxy_protocol 不能有
[rootServer2 ~]# systemctl restart nginx.service# Nginx,而Apache已不支持四层透传
[rootServer2 ~]# cat /var/log/nginx/access.log
172.25.254.100 - - [12/Aug/2024:02:48:43 0800] GET / HTTP/1.1 200 27 - 172.25.254.1curl/8.0.1 -4.4 Haproxy ACL
4.4.1 ACL 介绍
访问控制列表ACL(Access Control Lists
一种基于包过滤的访问控制技术 根据设定的条件对经过服务器传输的数据包进行过滤基于请求报文头部中的源目地址、源目端口、请求方法、文件后缀等信息内容进行匹配并执行进一步操作
4.4.2 ACL 参数
定义ACL
ACLaclnamecriterionflagsoperatorvalueACL名称匹配规范匹配模式具体操作符操作对象类型
名称可以使用大小写字母、数字、冒号点 . 、中横线 - 、下划线 _ 并且区分大小写
ACL-criterion 匹配规范
即ACL的判断条件
格式模式说明hdr string提取一个HTTP请求报文的首部hdr[name [occc]]完全匹配字符串header的指定信息 表示在多值中使用的值的出 现次数hdr_beg[name [occc]]前缀匹配header中指定匹配内容的beginhdr_end[name [occc]]后缀匹配header中指定匹配内容endhdr_dom[name [occc]]域匹配header中的domhosthdr_dir[name [occc]]路径匹配header的uri路径hdr_len[name [occc]]长度匹配header的长度匹配hdr_reg[name [occc]]正则表达式匹配自定义表达式(regex)模糊匹配hdr_sub[name [occc]]子串匹配header中的uri模糊匹配 模糊匹配c 报文中a/b/c也会匹 配
ACL-flags 匹配模式
参数说明-i不区分大小写-m使用指定的正则表达式匹配方法-n不做DNS解析-u禁止ACL重名
ACL-operator 具体操作符
整数比较 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进行匹配
ACL-value 操作对象
参数说明Boolean布尔值integer or integer range整数或整数范围比如用于匹配端口范围IP address / networkIP地址或IP范围stringexact精确比较substring子串suffix后缀比较prefix前缀比较subdir路径domain域名regular expression正则表达式hex block16进制
多个ACL的组合调用方式 多个ACL的逻辑处理 与默认使用或使用 or 或 || 表示否定使用 表示 多个ACL调用方式
if A B # 与关系ACL中A和B都要满足为true默认为与
if A || B # 或ACL中A或者B满足一个为true
if ! A # 非取反不满足ACL才为true4.4.3 基于 ACL 匹配 访问路径 实现动静分离
Haproxy
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg66 frontend webcluster67 bind *:8068 mode http69 acl static path_sub -m sub static70 acl php path_sub -m sub php71 ##################################72 use_backend webcluster-host if php73 default_backend default-host74 75 backend webcluster-host76 mode http77 server web1 172.25.254.10:80 check inter 2 fall 2 rise 578 79 backend default-host80 mode http81 server web2 172.25.254.20:80 check inter 2 fall 2 rise 5
[rootHaproxy ~]# systemctl restart haproxy.serviceServer-HTTP
yum install php -ymkdir -p /var/www/html/php
vim /var/www/html/php/index.html
?phpphpinfo();
?systemctl restart httpdServer-Nginx
mkdir /usr/share/nginx/html/static -p
echo static - 172.25.254.20 Nginx /usr/share/nginx/html/static/index.html# 如果没有做四层透传则忽略此步骤
[rootServer2 ~]# vim /etc/nginx/nginx.conf18 log_format main $remote_addr - $remote_user [$time_local] $request 19 $status $body_bytes_sent $http_referer 20 $proxy_protocol_addr # 将此行删去21 $http_user_agent $http_x_forwarded_for;39 listen 80; # 将四层透传参数 proxy_protocol 去掉
systemctl restart nginx.service测试 4.5 Haproxy 错误页面
对指定的页面错误代码进行重定向优雅地显示错误页面
使用 errorfile 指令可以自定义错误页面
4.5.1 自定义错误页面
# Haproxy 默认使用的错误错误页面
[rootHaproxy ~]# rpm -ql haproxy | grep -E http$
/usr/share/haproxy/400.http
/usr/share/haproxy/403.http
/usr/share/haproxy/408.http
/usr/share/haproxy/500.http
/usr/share/haproxy/502.http
/usr/share/haproxy/503.http
/usr/share/haproxy/504.http格式
errorfile code file
# code:支持200, 400, 403, 405, 408, 425, 429, 500, 502503,504
# file:包含完整HTTP响应头的错误页文件的绝对路径.建议后缀 .http 方便与一般的HTML文件相区分配置
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg63 errorfile 503 /haproxy/errorpages/code-503.http[rootHaproxy ~]# mkdir /haproxy/errorpages/ -p
[rootHaproxy ~]# cp /usr/share/haproxy/503.http /haproxy/errorpages/code-503.http
[rootHaproxy ~]# vim /haproxy/errorpages/code-503.http
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html;charsetUTF-8htmlbodyh1!!! 503 !!!/h1
/body/html[rootHaproxy ~]# systemctl restart haproxy.serviceServer
systemctl stop nginx.service测试 4.5.2 重定向错误页面
使用 errorloc 指令遇到错误代码时重定向错误页面
配置
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg63 errorloc 503 https://www.baidu.com测试 4.6 Haproxy 四层负载
主要应用于HTTP以外的TCP协议应用服务访问的场景
MySQL、RedisMemcache、RabbitMQ
注意如果使用frontend和backend一定在 frontend 和 backend 段中都指定mode tcp
4.6.1 Haproxy
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg82 listen mysql83 bind *:330684 mode tcp85 balance static-rr86 server mysql1 172.25.254.10:3306 check inter 2 fall 2 rise 587 server mysql2 172.25.254.20:3306 check inter 2 fall 2 rise 5[rootHaproxy ~]# systemctl restart haproxy.service
[rootHaproxy ~]# yum install mariadb -y4.6.2 Server1
[rootServer1 ~]# yum install mariadb-server -y[rootServer1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf16 [mysqld]17 server-id1[rootServer1 ~]# mysql
MariaDB [(none)] CREATE USER est% identified by est;
MariaDB [(none)] GRANT ALL ON *.* TO est%;
[rootServer1 ~]# systemctl start mariadb4.6.2 Server2
[rootServer2 ~]# yum install mariadb-server -y[rootServer2 ~]# vim /etc/my.cnf.d/mariadb-server.cnf16 [mysqld]17 server-id2[rootServer2 ~]# mysql
MariaDB [(none)] CREATE USER est% identified by est;
MariaDB [(none)] GRANT ALL ON *.* TO est%;
[rootServer1 ~]# systemctl start mariadb4.6.3 测试
[rootHaproxy ~]# mysql -uest -pest -h 172.25.254.100
MariaDB [(none)] SELECT server_id;
-------------
| server_id |
-------------
| 2 |
-------------
MariaDB [(none)] show variables like hostname;
----------------------------
| Variable_name | Value |
----------------------------
| hostname | Server2.org |
----------------------------MariaDB [(none)] SELECT server_id;
-------------
| server_id |
-------------
| 1 |
-------------
MariaDB [(none)] show variables like hostname;
----------------------------
| Variable_name | Value |
----------------------------
| hostname | Server1.org |
----------------------------4.7 Haproxy https实现
4.7.1 Haproxy
mkdir /etc/haproxy/certs/openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/haproxy.org.key -x509 -days 365 -out /etc/haproxy/certs/haproxy.org.crt
# Country Name (2 letter code) [XX]:CN
# State or Province Name (full name) []:Shanghai
# Locality Name (eg, city) [Default City]:SHANGHAI
# Organization Name (eg, company) [Default Company Ltd]:Haproxy
# Organizational Unit Name (eg, section) []:Webserver
# Common Name (eg, your name or your servers hostname) []:www.est.org
# Email Address []:adminest.org[rootHaproxy ~]# cat /etc/haproxy/certs/haproxy.org.key /etc/haproxy/certs/haproxy.org.crt /etc/haproxy/certs/haproxy.pem[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg
listen web-httpsbind *:443 ssl crt /etc/haproxy/certs/haproxy.pemmode httpbalance roundrobinserver web1 172.25.254.10:80 check inter 2 fall 2 rise 5server web2 172.25.254.20:80 check inter 2 fall 2 rise 5[rootHaproxy ~]# systemctl restart haproxy.service4.7.2 Server1
systemctl restart nginx.service4.7.2 Server2
systemctl restart nginx.service4.7.3 测试 4.7.4 全站加密
[rootHaproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend Webclusterbind *:80mode httpredirect scheme https if !{ ssl_fc }listen web-httpsbind *:443 ssl crt /etc/haproxy/certs/haproxy.pemmode httpbalance roundrobinserver web1 172.25.254.10:80 check inter 2 fall 2 rise 5server web2 172.25.254.20:80 check inter 2 fall 2 rise 5
[rootHaproxy ~]# systemctl restart haproxy.service测试