haproxy最强攻略

news2024/12/23 20:39:20

1、负载均衡

负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。
负载均衡的主要作用如下:
高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。
伸缩性:添加或减少服务器数量,然后由负载均衡进行分发控制。这使得应用集群具备伸缩性。
高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。
安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防 DDos 攻击等。

     
      所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时, 依据四层的信息或七层的信息来决 定怎么样转发流量。
      四层的负载均衡,就是通过发布三层的 IP 地址( VIP ),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT 处理,转发至后台服务器,并记录下这个 TCP 或者 UDP 的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。
      七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web 服务器的负载均衡,除了根据 VIP 80 端口辨别是否需要处理的流量,还可根据七层的 URL、浏览器类别、语言来决定是否要进行负载均衡。
1. 分层位置 : 四层负载均衡在传输层及以下,七层负载均衡在应用层及以下。
2. 性能 : 四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高 : 七层可支持解析应用层报文消息内容,识别URL Cookie HTTP header 等信息。
3. 原理 : 四层负载均衡是基于 ip+port; 七层是基于虚拟的 URL 或主机 IP 等。
4. 功能类比 : 四层负载均衡类似于路由器 ; 七层类似于代理服务器。
5. 安全性 : 四层负载均衡无法识别 DDoS 攻击 ; 七层可防御 SYN Cookie/Flood 攻击。

2、基本实验环境部署

haproxy介绍

        haproxy是一款开源、高性能的负载均衡器和代理服务器,专为TCP和HTTP应用而设计。它可以将客户端的请求分发到多台后端服务器,从而提高应用的可用性和性能。HAProxy支持多种负载均衡算法和健康检查机制,是构建高可用性系统的理想选择。

HAProxy的整体架构主要包括以下部分:

前端(Frontend):接受客户端请求,并根据配置的规则进行处理。
后端(Backend):定义一组服务器,处理前端转发的请求。
服务器(Server):实际处理请求的后端服务器。
监听器(Listener):在前端监听特定的IP和端口,等待客户端的连接请求。

haproxy的组件:

配置文件(haproxy.):HAProxy的核心配置文件,定义了前端、后端和监听器等组件。
统计报告(Statistics Report):HAProxy提供丰富的统计信息,便于监控和调试。
日志(Log):HAProxy支持详细的日志记录,帮助分析和诊断问题。

haproxy的工作流程:

客户端发送请求到HAProxy的前端。
前端根据配置的规则,选择合适的后端。
后端将请求分发到具体的服务器进行处理。
服务器处理请求并返回结果,通过后端和前端返回给客户端。

详细配置

①主机:haproxy

添加ip地址

[root@apache hh]# vmset.sh  ens160 172.25.254.100 haproxy.zf.org

②主机:webserver1

添加ip地址

[root@apache hh]# vmset.sh ens160 172.25.254.10 webserver1.zf.org

③主机:webserver2

[root@apache hh]# vmset.sh ens160 172.25.254.20 webserver2.zf.org

 在2个webserver上安装nginx

[root@webserver1 ~]# dnf install  nginx -y
[root@webserver2 ~]# dnf install  nginx -y

在2个webserver上将字符串“echo webserver1 - 172.25.254.10 ”的内容输出并重定向到“/usr/share/nginx/html/index.html”,并重启nginx服务

[root@webserver1 ~]# echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

[root@webserver2 ~]# echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

环境检测:

3、haproxy基本部署 

相关参数

Proxies-frontend:bind [<address>]:<port_range>[,.][param*] 。

指定 haproxy 的监听地址可以是 IPv4 或 IPv6,能同时监听多个 IP 或端口,可在 listen 字段中使用.同时指出,如果要绑定非本机的 IP,需要开启内核参数 net.ipv4.ip_non1ocal_bind=1 。

Proxies-backend:
mode httpltcp #指定负载协议类型,和对应的frontend必须一致 
option #配置选项 
server g.com #定义后端real server,必须指定IP和端口

定义一组后端服务器,backend 服务器将被 frontend 进行调用。 注意:backend 的名称必须唯一,并且必须在 listen 或 frontend 中事先定义才可以使用,否则服务无法启动. 

①主机:haproxy:

安装haproxy软件

[root@haproxy ~]# dnf install haproxy -y

 方法1:使用frontend和backend2个参数配置proxies

   定义了一个名为“webcluster”的前端,绑定到 *:80 端口,采用 HTTP 模式,通过轮询的方式将请求分发到后端的 web1(172.25.254.10:80)和 web2(172.25.254.20:80)服务器.

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service

本机检测

 后端检测

[root@webserver1 ~]# systemctl stop nginx.service

 方法2:使用 listen 替换 frontend 和 backend 的配置方式,可以简化设置,通常只用于 TCP 协议的应用 。

       监听所有的80 端口,采用 HTTP 模式。使用轮询的负载均衡策略,后端包含 web1(172.25.254.10:80)和 web2(172.25.254.20:80)这两个服务器,当用户发起请求访问时,haproxy 会按照轮询的方式将请求依次分配到 web1 和 web2 服务器上进行处理,以实现负载均衡和提高系统的处理能力。

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service

 本机检测

方法1和方法2测试结果一致

 4、haproxy的全局配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service

在系统进程树的显示结果中查找与“haproxy”相关的进程信息,为单进程

[root@haproxy ~]# pstree -p | grep haproxy

 设定多线进程

 再次在系统进程树的显示结果中查找与“haproxy”相关的进程信息

设定第一个进程使用第一个核心,第二个进程使用第二个核心

 

 查看33142的进程信息

[root@haproxy ~]# cat /proc/33142/status | grep -i thread

 注意:多线程和多进程的参数是互斥的

定向haproxy的日志 

配置文件定义日志 local2

修改日志文件,打开UDP端口

[root@haproxy ~]# vim /etc/rsyslog.conf

5、haproxy的代理配置

proxies-defaults默认参数设置详解

mode http:表明工作模式为 HTTP 模式。
log global:意味着日志记录采用全局设置。
option httplog:启用了与 HTTP 日志相关的特定选项。
option dontlognull:可能表示不记录某些空值相关的内容。
option http-server-close:与 HTTP 服务器关闭的相关设置。
option forwardfor except 127.0.0.0/8:在进行 Forwarded-For 处理时,排除了 127.0.0.0/8 这个网段。
retries 3:表示重试次数为 3 次。
timeout http-request 10s:HTTP 请求的超时时间为 10 秒。
timeout queue 1m:队列的超时时间为 1 分钟。
timeout connect 10s:连接的超时时间为 10 秒。
timeout client 1m:客户端的超时时间为 1 分钟。
timeout server 1m:服务器的超时时间为 1 分钟。
timeout http-keep-alive 10s:HTTP 保持活动连接的超时时间为 10 秒。
timeout check 10s:检查的超时时间为 10 秒。
maxconn 3000:最大连接数为 3000 个。

proxies-frontend

bind [<address>]:<port_range>[,...][param*]

server配置参数

①利用check、inter、fall、rise、weight进行后端健康检测

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2:服务器 web1 的地址为 172.25.254.10:80,检查间隔为 2,故障阈值为 3,恢复阈值为 5,权重为 2

server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1:服务器 web2 的地址为 172.25.254.20:80,检查间隔、故障阈值、恢复阈值与 web1 相同,但其权重为 1。

②利用 backup实现Sorry server服务

断开2台server的nginx服务,使主机down机

systemctl stop nginx.service

本机检测和浏览器访问,服务不可达

此时利用 backup参数,开启sorry-server

在haproxy主机上安装httpd软件模拟sorry server主机,并修改其端口号为8080

[root@haproxy ~]# dnf install httpd -y
[root@haproxy ~]# vim /etc/httpd/conf/httpd.conf
[root@haproxy ~]# systemctl enable --now httpd

[root@haproxy ~]# echo sorry 下班了,明天见 > /var/www/html/index.html
#向特定的网页文件写入指定的文本内容

浏览器测试sorry-server可用

 编辑haproxy配置文件

 本机测试

 重启一个server2,再次测试,server2可用

 ③利用disable参数下线指定realserver

 禁用server1

本机测试

 ④利用redirect参数重定向指定网站 :www.baidu.com

浏览器测试

⑤利用maxconn设定最大连接数

服务器的最大连接数设置为 2

 server测试

 maxconn优化

 6、haproxy的热更新方法

①利用mode调整scoket的参数设置,使其拥有管理员权限

②利用socat工具动态调整haproxy中的参数-----针对单进程

[root@haproxy ~]# dnf install socat -y
[root@haproxy ~]# echo "help" | socat stdio /var/lib/haproxy/stats #查看帮助命令

[root@haproxy ~]# echo "show info" | socat stdio /var/lib/haproxy/stats
#查看haproxy的状态

[root@haproxy ~]# echo "show servers state" | socat stdio /var/lib/haproxy/stats
#查看server状态

#查看server1的权重
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
2 (initial 2)

#修改server1的权重
[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
1 (initial 2)

 测试

#下线某台主机
[root@haproxy ~]# echo "disable server webcluster/web1"  | socat stdio /var/lib/haproxy/stats

测试

#重启某台主机
[root@haproxy ~]# echo "enable server webcluster/web1"  | socat stdio /var/lib/haproxy/stats

测试

 ③haproxy多进程如何热处理

 查看多进程文件

测试

 

7、haproxy的算法 

 静态算法

1、Static-RR(静态轮询)

  • 与轮询类似,但可以为服务器设置权重。权重高的服务器会获得更多的请求分配机会。 比如,S1 权重为 2,S2 权重为 1,S3 权重为 1,那么每 4 个请求中,S1 会分配到 2 个,S2 和 S3 各分配到 1 个。
  • 测试结果
  • 关闭多进程,并测试
  • 注意:Static-RR不支持局部修改权重

2、First

  • 总是将第一个可用的服务器用于处理请求。 例如,如果有三个服务器 S1、S2、S3,第一次请求会分配给 S1,后续的请求也一直分配给 S1,除非 S1 不可用,才会考虑 S2 和 S3 。 这种算法适用于某些特殊情况,比如已知某个服务器性能特别优越,希望优先使用它。
  • 在多台主机中执行死循环
  • 测试结果
  •  

动态算法

1、Round Robin(轮询)

  • 以循环的方式依次将请求分配到后端的服务器。例如,有服务器 S1、S2、S3,第一个请求分配给 S1,第二个给 S2,第三个给 S3,然后再从 S1 开始循环。 这种算法简单直观,适用于后端服务器性能相当且无需考虑请求特征的情况。
  •  动态修改权重

2、Least Connections(最少连接)

  • 新的请求会被分配到当前活动连接数最少的服务器。例如,有服务器 S1 有 10 个活动连接,S2 有 5 个活动连接,S3 有 8 个活动连接,那么新请求会分配给 S2。
  •  测试结果

其他算法

其他算法既可作为静态算法,又可作为动态算法。

1、Source Hash 算法

  • 根据客户端的源 IP 地址计算哈希值,然后基于该哈希值将请求始终分配到同一台后端服务器。 例如,假设有三个后端服务器 S1、S2 和 S3,客户端 A 的 IP 地址经过哈希计算后对应到 S1,那么只要客户端 A 发送请求,都会被分配到 S1 处理。 这种算法的优点在于: 对于需要保持会话一致性的应用非常有用。比如,用户登录后的一系列操作都能在同一台服务器上处理,避免了会话数据在不同服务器之间传递导致的问题。 可以减少服务器之间的状态同步开销。 但它也有一定的局限性: 如果某一客户端的流量过大,可能会导致对应服务器负载过高。 当后端服务器数量发生变化时,可能会导致哈希结果的重新分布,影响负载均衡的效果。
  • 测试结果 

2、map-base 取模法

  • 对 source 地址进行 hash 计算,再基于服务器总权重取模,决定请求转发的后端服务器。 此方法是静态的,不支持在线调整权重和慢启动,可实现后端服务器均衡调度。 缺点是服务器总权重变化(有服务器上线或下线)会导致调度结果整体改变,hash-type 指定的默认值为此算法。

3、一致性哈希

  • 当服务器总权重变化时,对调度结果的影响是局部的,不会引起大的变动。该 hash 算法是动态的,支持使用 socat 等工具进行在线权重调整,支持慢启动。
  • 修改后,支持局部修改权重
  • [root@webserver1 ~]# echo 172.25.254.10 -index.html > /usr/share/nginx/html/index1.html
    [root@webserver2 ~]# echo 172.25.254.20 -index.html > /usr/share/nginx/html/index1.html

uri一致性hash:基于对用户请求的URI的左半部分或整个urihash,再将hash结果对总权重进行取模后根据最终结果将请求转发到后端指定服务器 ,适用于后端是缓存服务器场景。默认是静态算法,也可以通过hash-type指定map-basedconsistent,来定义使用取模法还是一致性hash。

url-param:url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server 。如果无没key,将按roundrobin算法。

  •  测试结果:

hdr:针对用户每个http头部(header)请求中的指定信息做hash,此处由 name 指定的http首部将会被取出并做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。

  • 使用curl -v 查看报文
  •  测试:指定浏览器访问
  • 在微软浏览器测试:

算法总结 

static-rr--------->tcp/http 静态
first------------->tcp/http 静态
roundrobin-------->tcp/http 动态
leastconn--------->tcp/http 动态
random------------>tcp/http 动态
source------------>tcp/http
Uri--------------->http
url_param--------->http  取决于hash_type是否consistent
hdr--------------->http
rdp-cookie-------->tcp
first #使用较少
static-rr #做了session共享的web集群
roundrobin
random
leastconn #数据库
source #基于客户端公网IP的会话保持
Uri--------------->http #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯
url_param--------->http
hdr #基于客户端请求报文头部做下一步处理
rdp-cookie #很少使用

8、haproxy的状态页 

配置详情

设置监听端口为9999,每隔3秒刷新状态页,使用用户名zf,密码zf登陆该状态页。

 浏览器测试

9、haproxy的高级功能及配置

1、基于cookie的会话保持

cookie value :为当前 server 指定 cookie 值,实现基于 cookie 的会话黏性,相对于基于 source 地址 hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy 负载,目前此模式使用较少,已经被 session共享服务器代替。
cookie配置详情

命令行测试

 2、IP透传

web 服务器中需要记录客户端的真实 IP 地址,用于做访问统计、安全防护、行为分析、区域排行等场景。
2.1七 IP透传

①还原实验环境

利用option forwardfor 参数

②在server1上做apache服务器

#apache 配置:
LogFormat "%{X-Forwarded-For}i %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%
{User-Agent}i\"" combined
#nginx 日志格式:
$proxy_add_x_forwarded_for : 包括客户端 IP 和中间经过的所有代理的 IP
$http_x_forwarded_For : 只有客户端 IP
log_format main '"$proxy_add_x_forwarded_for" - $remote_user [$time_local]
"$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_For';
[root@webserver1 ~]# systemctl disable nginx
Removed "/etc/systemd/system/multi-user.target.wants/nginx.service".
[root@webserver1 ~]# systemctl stop  nginx.service
[root@webserver1 ~]# dnf install httpd -y

编辑server1-日志文件的主配置文件

[root@webserver1 ~]# vim /etc/httpd/conf/httpd.conf
[root@webserver1 ~]# systemctl restart httpd
[root@webserver1 ~]# cat /etc/httpd/logs/access_log
172.25.254.100 - - [10/Aug/2024:14:11:50 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.76.1"

 命令行测试:

 2.2 四层IP透传

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
[root@haproxy ~]# systemctl restart haproxy.service

利用send-porxy 做代理

测试后发现不通畅 

编辑server2的配置文件

[root@webserver2 ~]# vim /etc/nginx/nginx.conf
[root@webserver2 ~]# systemctl restart nginx.service

 测试:

安装帮助手册

[root@webserver1 ~]# dnf install httpd -y
[root@webserver1 ~]# systemctl restart httpd

测试:

[root@webserver1 ~]# tail /etc/httpd/logs/access_log
172.25.254.100 172.25.254.100 - - [10/Aug/2024:15:14:56 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.76.1"

10、haproxy的访问控制列表ACL

   ACL相关参数示例

#用acl来定义或声明一个acl
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 名称 匹配规范 匹配模式 具体操作符 操作对象类型

 hdr_dom[<name> [<occ>]]):域匹配,header中的domhost),hdr_dom(host) 请求的host名称

命令行测试

hdr_end[<name> [<occ>]]):后缀匹配,header中指定匹配内容end,hdr_end(host) 请求的host结尾

编辑C:\Windows\System32\drivers\etc的内容

测试结果

 hdr_beg[<name> [<occ>]]):前缀匹配,header中指定匹配内容的begin,hdr_beg(host) 请求的host开头

访问测试

base : string
# 返回第一个主机头和请求的路径部分的连接,该请求从主机名开始,并在问号之前结束 , 对虚拟主机有用
<scheme>://<user>:<password>@#<host>:<port>/<path>;<params>#?<query>#<frag
下面使用base_sub : 字符串匹配做示例
测试:

[root@webserver1 ~]# mkdir /var/www/html/zf -p
[root@webserver1 ~]# echo 172.25.254.10 zf > /var/www/html/zf/index.html
[root@webserver1 ~]# curl 172.25.254.10/zf/index.html
172.25.254.10 zf

base_reg : 正则表达式匹配

测试

path : string
# 提取请求的 URL 路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)
<scheme>://<user>:<password>@<host>:<port>#/<path>;<params>#?<query>#<frag>
path_sub : substring match

 测试:

ACL-value 操作对象 

- Boolean #布尔值
- integer or integer range #整数或整数范围,比如用于匹配端口范围
- IP address / network #IP地址或IP范围, 192.168.0.1 ,192.168.0.1/24
- string--> www.timinglee.org
exact #精确比较
substring #子串
suffix #后缀比较
prefix #前缀比较
subdir #路径, /wp-includes/js/jquery/jquery.js
domain #域名,www.timinglee.org
- regular expression #正则表达式
- hex block #16进制

[root@webserver2 ~]# mkdir -p /usr/share/nginx/html/zf
[root@webserver2 ~]# echo 172.25.254.20 zf > /usr/share/nginx/html/zf/index.html

测试

 多个ACL的逻辑处理

与:隐式(默认)使用
或:使用“or" 或 “||"表示
否定:使用 "!" 表示

ACL相关应用示例

基于域名的访问

测试结果:

 基于源IP的访问

测试:

拒绝访问

测试

 

 匹配浏览器类型

 测试

基于后缀名实现动静分离 

[root@webserver1 ~]# dnf install php -y
[root@webserver1 ~]# systemctl restart httpd
[root@webserver1 ~]# vim /var/www/html/index.php
[root@webserver1 ~]# cat /var/www/html/index.php
<?php
                phpinfo();
?>

网页测试

编辑主配置文件 

 测试

基于访问路径实现动静分离

[root@webserver2 ~]# mkdir /usr/share/nginx/html/static -p
[root@webserver2 ~]# echo static - 172.25.254.20 > /usr/share/nginx/html/static/index.html
[root@webserver2 ~]# curl 172.25.254.20/static/
static - 172.25.254.20

[root@webserver1 ~]# mkdir -p /var/www/html/php
[root@webserver1 ~]# cp /var/www/html/index.php  /var/www/html/php/

测试

 测试

 11、自定义haproxy错误界面

基于自定义的错误页面

关闭server的服务,访问172.25.254.100

[root@haproxy ~]# mkdir /etc/haproxy/errorpage -p
[root@haproxy ~]# vim /etc/haproxy/errorpage/503.http

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
[root@haproxy ~]# systemctl restart haproxy.service

网页测试: 

基于http重定向错误页面

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
[root@haproxy ~]# systemctl restart haproxy.service

 网页测试:

12、haproxy的四层负载(利用MySQL实现) 

[root@haproxy ~]# dnf install mariadb -y #模拟客户端
[root@webserver1 ~]# dnf install mariadb-server -y #模拟服务端
[root@webserver2 ~]# dnf install mariadb-server -y #模拟服务端
[root@webserver1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[root@webserver1 ~]# systemctl start mariadb

[root@webserver2 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[root@webserver2 ~]# systemctl start mariadb

修改server-id利于实验效果的呈现 

 

登录MySQL,查看id

#在server1上添加可远程登录的用户
MariaDB [(none)]> CREATE USER zf@'%' identified by 'zf';
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> GRANT ALL ON *.* TO zf@'%';
Query OK, 0 rows affected (0.001 sec)

#在server2上添加可远程登录的用户
MariaDB [(none)]> CREATE USER zf@'%' identified by 'zf';
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> GRANT ALL ON *.* TO zf@'%';
Query OK, 0 rows affected (0.001 sec)

#测试
[root@haproxy ~]# mysql -uzf -p -h 172.25.254.10
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> quit
Bye

使用haproxy实现负载

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
[root@haproxy ~]# systemctl restart haproxy.service

 测试:

 

13、haproxy的https实现 

[root@haproxy ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/zf.org.key -x509 -days 365 -out /etc/haproxy/certs/zf.org.crt

#查看证书
[root@haproxy ~]# ls /etc/haproxy/certs/
zf.org.crt  zf.org.key

#重定向到/etc/haproxy/certs/zf.pem下
[root@haproxy ~]# cat /etc/haproxy/certs/zf.org.key  /etc/haproxy/certs/zf.org.crt > /etc/haproxy/certs/zf.pem
[root@haproxy ~]# cat /etc/haproxy/certs/zf.pem
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDP6x8izC/lhiLU
Rf4XJGGmVV/IT5ABPqibNsBkHmv92Nfd6Z/MUva6FFs23IjONO3ecK9+4YLeUgkw
V7SU99/1QbXvIG+uZINQbWO/XGH9CKSALlOmxV/q/eBpz4L9uVv6Fnd1AB+YHeBt
WJnmPZDD4ZdPgUgVcTSPsY7ohFTAmh/pXQEMaYgHUr2JD4+kBRTcJpY8e1lzMGsy
caGXQXk4SNg1Rl7mPzSQbvxSXPTgsgPqkiwXJe2EptUO1S5oKBWgHmFP/rhThjk2
x+jQEB0ZavnZaAIXkk4AWE06TMahbwRsfDS/r4ofkC7br5RLyg00890H6tNA8Qp6
Z08k3xMVAgMBAAECggEABe0EBk4DOSuZYs+2u8geYhQ9H57WCSeeKk0ud/5Q1MSa
Y5Kc4XfKJdYeZ2jh9wIDd0SHNRYgmbry1GHAHbCEmR9NCbgihHDoE30s8C9vJ4Uz
954jijVqwbdjgUmqWs0uo3td3s0WhyXK145pDH0AbWTIu6eA6SgcHGTk+/PRk7Q6
e2Q8zxVZOeoMYOEPtYZgRobUj+Vw9ZdkotTr4mbMo5BGL1+0oxGV7ErbsTZMYoqm
U3HV//d7BQ44KkdaAeXSpkB1eKhrIKBccrKj7mpggQ8IrG5o1eSCXU78dQvxMzF+
LHf4bWSbWQvVLSptVtnKBJNt5ccrO+dbAul2dqBZAQKBgQDRTQOcE8yQCNn+2nug
XpOSxn36SYNYNNqHrDER/b74E9TErjr9ramcW6gW/xcQzl0KqEdtDIi1xg2hOhZZ
pTdfv9ZkGVKLtXsRjd38BTdmLdM7XXQ1lx8v2WisKNgI9rCQohYrxK6l/KAhbGj+
XrPR3uHsWWQ+on9rvUzxiC6N1QKBgQD+TyWoasxE56THIW3FrsTEbsn10Q6Pe6Yd
BIp5BQEtZBQh/HUMTBMPZwIlH+/vHeEF+Pv58ZCmUF+C0v2kP7Qdnel1dDS7AwaQ
KpNgV49rov9B9Fqc0uPmFQ0bzn+m5a5ExCwTK7FRKaX0Clv+t0PjpiWmgZ8DkK1U
QubrHpDQQQKBgQCox7MefLTcfdbVdnh1JW9Z0Cks2XVKfyyudcQIXxhN0ygkBuBZ
S17YUO1mxgRisBdFjdgzbwUbmH/LQR1e4yWZWAjaJbV0Jj/9MusM3WQESPXrDHy2
7oveuTJ4imNULyLJL3wzhWLVRbgX2+V7IwFdP5/uSVPWUpHwXvIaYBgylQKBgQCS
aTjSDKKL7R1F8+4CCMuKGAq4NmL+on6RaELcx8/UtTCOHI26xbWXgYOPoiJ99SLP
UHipfrT7u3wxko2q2W42Ourkz0FohaZqq8hriB2vJ4l0DF16ukOw/F+uqaV+je9V
8ec6JkaQ5rx/ktNCA3rXfplgknHdGJdh0p6lsNRIwQKBgQDJCj9wDcW12sS5Ul/m
8c0zxDVBvmhmVB4sE2lh6OkI+ufC9xpO8MvPfv+gtXzoDn0C48zct53m8Nj7bvvQ
Yhy7PPSh1du1mQmLxodbENEpIt0UgABHuDi1SzhM6N4MGdGpd9PnSb/VvNgbox2C
8OQKm8QKHiXIVF1gndkfC2gcqQ==
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIID7TCCAtWgAwIBAgIUZ7AYtUUbXy1gNTj8y1PBy8avbKEwDQYJKoZIhvcNAQEL
BQAwgYUxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlDaG9uZ3FpbmcxDzANBgNVBAcM
Bld1c2hhbjELMAkGA1UECgwCemYxEjAQBgNVBAsMCXdlYnNlcnZlcjETMBEGA1UE
AwwKd3d3LnpmLm9yZzEbMBkGCSqGSIb3DQEJARYMYWRtaW5AemYub3JnMB4XDTI0
MDgxMTA0NTExM1oXDTI1MDgxMTA0NTExM1owgYUxCzAJBgNVBAYTAkNOMRIwEAYD
VQQIDAlDaG9uZ3FpbmcxDzANBgNVBAcMBld1c2hhbjELMAkGA1UECgwCemYxEjAQ
BgNVBAsMCXdlYnNlcnZlcjETMBEGA1UEAwwKd3d3LnpmLm9yZzEbMBkGCSqGSIb3
DQEJARYMYWRtaW5AemYub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAz+sfIswv5YYi1EX+FyRhplVfyE+QAT6omzbAZB5r/djX3emfzFL2uhRbNtyI
zjTt3nCvfuGC3lIJMFe0lPff9UG17yBvrmSDUG1jv1xh/QikgC5TpsVf6v3gac+C
/blb+hZ3dQAfmB3gbViZ5j2Qw+GXT4FIFXE0j7GO6IRUwJof6V0BDGmIB1K9iQ+P
pAUU3CaWPHtZczBrMnGhl0F5OEjYNUZe5j80kG78Ulz04LID6pIsFyXthKbVDtUu
aCgVoB5hT/64U4Y5Nsfo0BAdGWr52WgCF5JOAFhNOkzGoW8EbHw0v6+KH5Au26+U
S8oNNPPdB+rTQPEKemdPJN8TFQIDAQABo1MwUTAdBgNVHQ4EFgQUwmQsD5Tmz4EB
vglvFu31w3iyCSwwHwYDVR0jBBgwFoAUwmQsD5Tmz4EBvglvFu31w3iyCSwwDwYD
VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAH73/InMrHEl7yEjxTEAC
I7BA7ZKI5p5G1hmvhnh1xR5osW44C/hrBk29wZ2G1bWsOOHNiOenLyhym6V9EA7r
iy4+23szXc1rqz0KINc+RAa5b7El8id3tpNXjpybUlQYrxblM2ErEb1nHD1a6Xac
rDnWWiJzyEdHV7rkzh3rKUyN2g3/OBB7Rw8qDgmfFiFjhrXs1tZ3fsklWf+YxcKf
KvT/tByeVnTZWJBdjiNJXbeWVy1gukU3MgklaOeyzAdv7RZ4YOnxUfjfq+VMthql
K1v1VFdfSotKf+EDpcCARUWlx7+KXVaH0vrae2rY9714+c/J7zA8rYBABk/kCu+2
yQ==
-----END CERTIFICATE-----

测试:

使用redirect scheme https if !{ ssl_fc } 实现全站加密

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

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

相关文章

接入谷歌支付配置

1.谷歌云创建项目 网址&#xff1a;https://console.cloud.google.com/ 按照步骤创建即可 创建好后选择项目&#xff0c;转到项目设置 选择服务账户&#xff0c;选择创建新的服务账户 名称输入好后访问权限吗账号权限都可以不用填写&#xff0c;默认就好了 然后点击电子邮…

爵士编曲:Bass编写,Walking Bass,SwingBass 爵士鼓 Swing Jazz律动 Moonkits

Walking Bass Line是乐曲构造中的基垫&#xff0c;“Walking”是在BassLine中的一种重要的感觉构成&#xff0c;等同于我们对于“行走”的理解&#xff0c;意义就是“一步接着一步”&#xff0c;先从每一步&#xff08;每一小节&#xff09;建立&#xff0c;并持续构建成一个完…

Android 10.0 SystemUI下拉状态栏QSTileView去掉着色效果显示彩色图标功能实现

1.前言 在10.0的系统rom定制化开发中,在关于SystemUI的下拉状态栏中QSTileView的背景颜色设置过程中,在由于 系统原生有着色效果,导致现在某些彩色背景显示不是很清楚效果不好,所以需要去掉QSTileView的默认着色 背景显示原生的彩色背景,接下来就来实现相关功能 如图: 2.…

【微信小程序】实现中英文切换

1、组织语言资源 创建两个文件夹&#xff0c;分别用于存放中文和英文的语言资源。例如&#xff0c;可以在 utils 文件夹下创建 lang 文件夹&#xff0c;然后在其中创建 zh.js 和 en.js 文件&#xff0c;分别存放中文和英文的文本内容。 zh.js: const zh {home: {title: 这里…

【人工智能】全景解析:【机器学习】【深度学习】从基础理论到应用前景的【深度探索】

目录 1. 人工智能的基本概念 1.1 人工智能的定义与发展 1.1.1 人工智能的定义 1.1.2 人工智能的发展历史 1.2 人工智能的分类 1.2.1 弱人工智能 1.2.2 强人工智能 1.2.3 超人工智能 1.3 人工智能的关键组成部分 1.3.1 数据 1.3.2 算法 1.3.3 计算能力 2. 机器学习…

大模型系列6--神经网络(WIP)

神经网络 1. 背景2. 理论知识2.1. 单个神经元2.1.1. 基础2.1.2. 神经元激活代码 2.2. 多个神经元2.2.1. 基础2.2.2. 神经元激活代码2.2.3. 反向传播 3. 神经网络编程基础3.1. 基本概念3.2. 逻辑回归3.3. 梯度下降法(Gradient Descent)3.3.1. 基础知识3.3.2. 梯度下降的形式化说…

Selenium + Python 自动化测试09(多窗口切换)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了截图的操作方法&#xff0c;本篇文章我们讲述一下多窗口切换的操作方法。 在实际的测试项目组中我们可能会遇到多窗口的情况&#xff0c;有时候需要在不同窗口…

MyBatis 配置与测试方式

目录 一&#xff0c;什么是MyBatis 二&#xff0c;准备工作 创建项目 配置数据库连接 持久层代码 单元测试 一&#xff0c;什么是MyBatis 简单来说&#xff0c;MyBatis 是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发&#xff0c;能更简单完成程序与数据库之间…

MySQL 复制建表、操作补充、pymysql操作—/—<10>

一、复制建表 1、复制其他表的结构 只复制结构&#xff0c;不复制值 CREATE TABLE aaa LIKE student student表&#xff1a; 复制完的a表&#xff1a; 2、复制查询结果并建表: create table a (select id,sum(score) as sum_sco from score group by id) score表结构如图所…

【存储学习笔记】3:备份(Backup)技术分类

1 定义 备份&#xff1a;出于数据恢复的目的而创建一份额外的数据副本。 2 技术指标 2.1 备份窗口&#xff08;Backup Window&#xff09; 从定指标的角度&#xff1a;可以安全地实施备份的时间 从实现指标的角度&#xff1a;备份操作所需的时间 2.2 恢复时间目标&#xf…

C 408—《数据结构》算法题基础篇—数组(通俗易懂)

目录 Δ前言 一、数组的合并 0.题目&#xff1a; 1.算法设计思想&#xff1a; 2.C语言描述&#xff1a; 3.算法的时间和空间复杂度 : 二、数组元素的倒置 0.题目 : 1.算法设计思想 : 2.C语言描述 : 3.算法的时间和空间复杂度 : 三、数组中特定值元素的删除 0.题目 : …

贷齐乐案例

源码分析&#xff1a; <?php // 设置 HTTP 头部&#xff0c;指定内容类型为 text/html&#xff0c;字符集为 utf-8 header("Content-type: text/html; charsetutf-8"); // 引入数据库配置文件 require db.inc.php; // 定义函数 dhtmlspecialchars&#xff0c;用…

基于WOA鲸鱼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 分组卷积神经网络&#xff08;GroupCNN&#xff09; 4.2 WOA优化算法 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核…

获奖方案|趋动科技:资源池化释放AI算力价值

“据统计&#xff0c;GPU的平均利用率不超过30%&#xff0c;会产生巨大的算力资源浪费。我们用软件定义的方式通常可以把用户GPU的利用率提升3-8倍&#xff0c;甚至可以到10倍。” 这是算力池化软件公司趋动科技援引行业报告数据并结合自身企业最佳实践经验给出的最新数据。通…

分布式版本控制概述

目录 1. 版本控制软件的基础功能 2. 集中式版本控制 3. 分布式版本控制 git 是分布式管理控制工具&#xff0c;用来管理开发项目中的资源: 这样的软件在项目管理开发中称为 SCM&#xff08;Software Configuration Management&#xff09; 软件; 下面是版本控制到分布式版本…

java快速导出word文档

点关注不迷路&#xff0c;欢迎再访&#xff01; 精简博客内容&#xff0c;尽量已行业术语来分享。 努力做到对每一位认可自己的读者负责。 帮助别人的同时更是丰富自己的良机。 文章目录 前言一.添加 Apache POI 依赖二.填充文档内容三.导出文档效果测试 前言 在 Java 应用程序…

Apache CloudStack Official Document 翻译节选(一)

关于 Apache CloudStack 的 概念和专用术语 &#xff08;一&#xff09; 甲一 Apache CloudStack Apache CloudStack 是一个开源的IAAS平台&#xff0c;管理调度着用于构建公有云或私有云的计算、网络、存储资源池。 借助Apache CloudStack&#xff0c;你可以创建一个按需使用的…

解锁4款高效的视频转文字助手!

虽然视频已经成为我们获取和记录信息的重要方式&#xff0c;可是有时候我们仍需要将视频中的内容转换为文字&#xff0c;才能够有效地整理、分析和利用这些信息。所以就有了视频转文字工具&#xff0c;今天我就推荐&#xff14;款好用的转换工具给大家 1、福昕视频在线转换 直…

【Java数据结构】---List(Stack)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 前言栈Stack栈的模拟实现…

PyTorch 基础学习(5)- 神经网络

系列文章&#xff1a; PyTorch 基础学习&#xff08;1&#xff09; - 快速入门 PyTorch 基础学习&#xff08;2&#xff09;- 张量 Tensors PyTorch 基础学习&#xff08;3&#xff09; - 张量的数学操作 PyTorch 基础学习&#xff08;4&#xff09;- 张量的类型 PyTorch 基础学…