haproxy最强攻略
1、负载均衡
负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。
负载均衡的主要作用如下:
高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。
伸缩性:添加或减少服务器数量,然后由负载均衡进行分发控制。这使得应用集群具备伸缩性。
高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。
安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防 DDos 攻击等。
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,权重为 2server 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的左半部分或整个uri做hash,再将hash结果对总权重进行取模后根据最终结果将请求转发到后端指定服务器 ,适用于后端是缓存服务器场景。默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性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的会话保持

命令行测试
2、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 : 只有客户端 IPlog_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中的dom(host),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开头
访问测试


[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 : 正则表达式匹配
测试
测试:
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
<?phpphpinfo();
?>
网页测试
编辑主配置文件
测试
基于访问路径实现动静分离
[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 ServerCopyright (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 } 实现全站加密
相关文章:

haproxy最强攻略
1、负载均衡 负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。 负载均衡的主要作用如下: 高并发…...
XetHub 加入 Hugging Face!
我们非常激动地正式宣布,Hugging Face 已收购 XetHub 🔥 XetHub 是一家位于西雅图的公司,由 Yucheng Low、Ajit Banerjee 和 Rajat Arya 创立,他们之前在 Apple 工作,构建和扩展了 Apple 的内部机器学习基础设施。XetH…...
在编程学习的海洋中,如何打造高效的知识宝库
目录 在编程学习的海洋中,如何打造高效的知识宝库一、笔记记录的重要性:为知识设立灯塔二、快速记录的策略:抓住知识的核心三、系统化的整理:构建个人知识体系四、实用工具推荐:为知识管理添砖加瓦五、保持条理性的秘诀…...

string详解(1)
1.C语言中的字符串 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理&…...

Linux云计算 |【第二阶段】NETWORK-DAY4
主要内容: NAT 原理与配置(私有IP地址、静态NAT转换、Easy IP)、VRRP解析(主路由器、备份路由器、虚拟路由器、优先级) 一、NAT概述 NAT 网络地址转换(Network Address Translation)是一种网络…...
amazon linux使用密码登录或者root登陆
1. 首先要把创建root密码,如果原来的密码不记得了,可以直接用 sudo passwd -d root 删除原来的密码 然后创建root密码 sudo passwd root 2. 修改 sshd_config 文件 vim /etc/ssh/sshd_config 允许使用密码登录 PasswordAuthentication yes 允许root…...

集智书童 | CNN 与 Transformer 的强强联合:AResNet-ViT在图像分析中的优势 !
本文来源公众号“集智书童”,仅用于学术分享,侵权删,干货满满。 原文链接:CNN 与 Transformer 的强强联合:AResNet-ViT在图像分析中的优势 ! 作者针对残差CNN分支的注意力引导设计进行了消融实验。同时&a…...
Ubuntu基础使用指南
Ubuntu基础使用指南 Ubuntu作为一款流行的开源操作系统,以其稳定性、安全性和易用性著称。无论是作为服务器操作系统还是桌面操作系统,Ubuntu都能满足用户的各种需求。下面,我们将从Ubuntu的基础使用开始,带你深入了解这个强大的…...

怎样才算精通 Excel?
最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 高赞回答很系统,但普通人这么学,没等精通先学废了! 4年前,我为了学数据分析&#…...

怎么学算法并找到工作
1.基础 找一本基础的内容看一遍 时间复杂度、空间复杂度计算方式数组、队列、栈、树、图结构十大排序算法 2.《hello算法》 动画图解算法 https://www.hello-algo.com/chapter_hello_algo/ 3.《剑指Offer》 一些面试的高频有年度的题解 里么的题很有特色,而…...
【实时建图】MapTR(1)------ 论文详解
作者们提出了一种有效构建高清地图的方法(MapTR),该地图为自动驾驶系统的规划提供丰富且精确的环境信息。这是一种结构化端到端变换器,用于高效在线矢量化地图构建。作者提出了一种统一的置换等价建模方法,即将地图元素建模为一个具有一组等价置换的点集,这准确地描述了地…...
通用Builder工具类
假设有一个Java实体类定义: public class Request {private String type;private String op;private PageInfo pageInfo;public static class PageInfo {private Integer pageNum;private Integer pageSize;}// 省略getter和setter... }在代码中创建这个对象&#…...

开源免费的海报设计器vue-fabric-editor
vue-fabric-editor 是一个基于 Vue.js 和 Fabric.js 的创新前端富文本编辑器,它将传统的文本输入体验与图形设计元素相结合,为用户提供了全新的内容创作方式。 以下是关于 vue-fabric-editor 的详细介绍: 一、技术特点 框架结合:…...
【学习笔记】Day 4 - Day 5
一、进度概述 1、新机环境配置 2、《地震勘探原理》第一章 3、对 “DL-FWI 研究方向展望” 组会的一些想法 二、详情 1、新机环境配置 配置新机环境着实耗了较多时间,导致理论进度推进较慢。 2、《地震勘探原理》第一章学习笔记 相关笔记在另一篇…...

MySQL数据分析进阶(十四)保护数据库
※食用指南:文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记,笔记整理比较粗糙,主要目的自存为主,记录完整的学习过程。(图片超级多,慎看!) 【中字】SQL进阶教程 | 史上最易懂S…...

排序算法之堆排序
title: 堆排序 date: 2024-7-23 15:48:25 0800 categories: 排序算法 tags:排序算法堆排序 description: 堆排序(Heap Sort)是一种基于堆的排序算法,具有较高的效率和稳定性。 math: true 堆排序 堆排序(Heap Sort)是…...
Python中的NLP宝库:探索顶级库与工具
标题:Python中的NLP宝库:探索顶级库与工具 Python,作为人工智能和机器学习任务中的关键编程语言,为自然语言处理(NLP)提供了丰富的库和工具。这些库不仅功能强大,而且大多数都是开源的…...
springboot + springcloud + Google pubsub+ firebase
1.pom依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-gcp-starter</artifactId><version>1.2.6.RELEASE</version></dependency><dependency><groupId>org.springframe…...

时序数据库TDengine和QuestDB对比
QuestDB和TDengine都是高性能的时序数据库(Time Series Database, TSDB),但它们在设计、功能、适用场景以及性能表现上各有特色。 以下是对两者的详细对比: 一、设计与架构 QuestDB 是一个开源的高性能SQL时序数据库࿰…...

Neuralink的进展与马斯克的技术愿景——从脑机接口到AI融合的未来
引言 Neuralink,这个由埃隆马斯克(Elon Musk)创立的公司,一直是科技界的焦点。自从其发布以来,Neuralink的脑机接口技术便吸引了全球的目光。最近,马斯克再次向公众展示了Neuralink的突破性进展࿰…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...