一.简介
HAProxy(High Availability Proxy)是一款开源、高性能的 TCP/HTTP 负载均衡器和反向代理软件。它的核心功能是将来自客户端的网络请求(流量)智能地分发到后端的多台服务器上,以提高应用程序的可用性、可靠性、性能和安全性。
核心功能:负载均衡
分发流量: HAProxy 接收客户端(如用户的浏览器、移动应用或其他服务)的请求。
后端服务器池: 它配置了一个或多个后端服务器组(backend),这些服务器运行着实际提供服务的应用程序(如 Web 服务器、应用服务器、数据库等)。
智能调度: 根据预设的负载均衡算法,HAProxy 决定将每个新请求转发到哪个后端服务器。常用算法包括:
轮询: 依次分发请求。
最小连接数: 将新请求发给当前连接数最少的服务器。
源 IP 哈希: 基于客户端 IP 将请求固定到特定服务器(会话保持)。
URI 哈希: 基于请求的 URI 进行分发。
加权算法: 给不同能力的服务器分配不同权重(如 weight),处理能力强的服务器接收更多请求。
TCP 模式(第4层 - 传输层):在 OSI 模型的传输层工作。基于 IP 地址和端口号进行流量转发。对上层协议(如 HTTP, MySQL, SSH, SMTP 等)完全透明,不解析应用层内容。
HTTP 模式(第7层 - 应用层):在 OSI 模型的应用层工作。能够解析和理解 HTTP 请求和响应。优点: 提供极其丰富的功能:
基于内容的路由: 根据 URL 路径、Host 头、HTTP Headers、Cookie 等将请求分发到不同的后端服务器组。
Header 操作: 添加、修改、删除 HTTP 请求头和响应头。
请求/响应重写与重定向: 修改请求 URI 或重定向客户端。
高级健康检查: 发送特定的 HTTP 请求并检查响应状态码或内容。
SSL/TLS 终止: 在 HAProxy 处解密 HTTPS 流量,将明文的 HTTP 请求转发给后端服务器(减轻后端负担)。
HTTP 日志记录: 记录详细的 HTTP 事务信息。
高性能: 以极低的延迟处理海量并发连接(通常每秒可处理数万到数十万请求),是业界性能标杆之一。
高可用性:健康检查: 主动定期检查后端服务器状态(TCP 连接检查、HTTP 请求检查等)。自动将故障服务器移出服务池,并在其恢复后重新加入。故障转移: 结合 keepalived 或 VRRP 等技术,可以实现 HAProxy 自身的 Active/Standby 或 Active/Active 集群,消除单点故障。会话保持: 通过 Cookie 插入/前缀或源 IP 哈希等方式,确保来自同一用户的后续请求被发送到同一台后端服务器,对于需要状态的应用(如购物车)至关重要。
SL/TLS 支持:终止: 在 HAProxy 处卸载 SSL 加解密工作。透传: 将加密流量直接透传给后端服务器处理。
双向 SSL: 支持客户端证书验证。SNI: 支持基于域名的虚拟主机。现代密码套件: 支持最新的安全协议和加密算法。
日志与监控: 提供详细的日志记录,方便故障排查和性能分析。支持多种监控协议和集成(如 Prometheus, Stats page)。
ACL: 强大的访问控制列表系统,允许基于几乎任何条件(IP、端口、路径、Header、时间等)做出复杂的流量路由、阻止或修改决策。
可扩展性: 轻松通过添加更多后端服务器或更强大的 HAProxy 节点来水平扩展应用容量。
开源与社区: 拥有活跃的开源社区和良好的文档支持。同时也有商业支持版本(HAProxy Enterprise)提供额外功能和支持。
主要应用场景:
Web 应用负载均衡: 将 HTTP/HTTPS 请求分发到多个 Web 服务器(如 Nginx, Apache, Tomcat)。
API 网关: 管理、路由、保护和监控微服务 API 流量(利用 HTTP 模式的丰富功能)。
数据库负载均衡: 分发只读数据库查询到多个副本(需数据库支持)。
TCP 服务负载均衡: 如邮件服务器(SMTP, IMAP)、消息队列、自定义 TCP 服务等。
高可用集群入口: 为 Active/Standby 或 Active/Active 的应用集群提供统一的访问入口和故障切换。
SSL 卸载中心: 集中处理所有入站 SSL/TLS 加解密。
DDoS 缓解层: 利用其连接速率限制、ACL 过滤等功能作为防御的第一道防线。
二.配置
1.搭建环境
准备3台主机:
主机1
主机名:haproxy
ip:172.25.254.100
主机2
主机名:hp-RS1
ip:172.25.254.10
主机3
主机名:hp-RS2
ip:172.25.254.20
两台RS安装nginx:
[haproxy-RS1]# dnf install nginx -y
[haproxy-RS2]# dnf install nginx -y
设置基本要求:
设置开机自启动
[haproxy-RS1]systemctl enable --now nginx.service
关闭火墙
[haproxy-RS1]systemctl disable --now firewalld.service
两台RS设置nginx的index.html内容
[haproxy-RS1]echo "RS1-172.25.254.10" > /usr/share/nginx/html/index.html
连通测试
[haproxy-haproxy]curl 172.25.254.10
2.安装haproxy
[haproxy-haproxy]dnf install haproxy -y
[haproxy-haproxy]systemctl enable --now haproxy.service
3.Proxies配置-frontend
进入haproxy配置文件
[haproxy-haproxy]vim /etc/haproxy/haproxy.cfg
frontend webcluster
bind *:80
mode http
balance roundrobinuse
backend webserver
backend webserver
server webl 172.25.254.10:80
server web2 172.25.254.20:80
重启服务
[haproxy-haproxy]systemctl restart haproxy.service
4.global配置
[haproxy ~]# vim /etc/haproxy/haproxy.cfg
5.多进程多线程
查看多进程信息
haproxy haproxy]# pstree -p | grep haproxy
|-haproxy(4816)-+-haproxy(4820)
| `-haproxy(4821)
启用多线程
haproxy ~]# vim /etc/haproxy/haproxy.cfg
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 100000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1 #
启用多个sock文件
stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2
#nbproc 2
#cpu-map 1 0
#cpu-map 2 1
nbthread 2 #启用多线程
多线程对比
未开启多线程
haproxy ~]# cat /proc/xxxx(haproxy子进程id)/status
Threads: 1
开启后
haproxy ~]# cat /proc/xxxx(haproxy子进程id)/status
Threads: 2
6. socat工具
修改配置文件
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/stats mode 600 level admin
查看haproxy状态
[root@haproxy ~]# echo "show info" | socat stdio /var/lib/haproxy/stats
Name: HAProxy
Version: 2.4.22-f8e3218
Release_date: 2023/02/14
Nbthread: 1
Nbproc: 1
Process_num: 1
Pid: 33542
Uptime: 0d 0h03m43s
Uptime_sec: 223
Memmax_MB: 0
PoolAlloc_MB: 0
查看集群状态
[root@haproxy ~]# echo "show servers state" | socat stdio /var/lib/haproxy/stats
1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight
srv_iweight srv_time_since_last_change srv_check_status srv_check_result
srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id
srv_fqdn srv_port srvrecord srv_use_ssl srv_check_port srv_check_addr
srv_agent_addr srv_agent_port
2 webcluster 1 web1 172.25.254.20 2 0 2 2 188 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
2 webcluster 2 web2 172.25.254.30 2 0 1 1 188 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
4 static 1 static 127.0.0.1 0 0 1 1 187 8 2 0 6 0 0 0 - 4331 - 0 0 - - 0
5 app 1 app1 127.0.0.1 0 0 1 1 187 8 2 0 6 0 0 0 - 5001 - 0 0 - - 0
5 app 2 app2 127.0.0.1 0 0 1 1 187 8 2 0 6 0 0 0 - 5002 - 0 0 - - 0
5 app 3 app3 127.0.0.1 0 0 1 1 186 8 2 0 6 0 0 0 - 5003 - 0 0 - - 0
5 app 4 app4 127.0.0.1 0 0 1 1 186 8 2 0 6 0 0 0 - 5004 - 0 0 - - 0
查看集群权重
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio
/var/lib/haproxy/stats
2 (initial 2)
[root@haproxy ~]# echo get weight webcluster/web2 | socat stdio
/var/lib/haproxy/stats
1 (initial 1)#设置权重
[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio
/var/lib/haproxy/stats
[root@haproxy ~]# echo "set weight webcluster/web1 2 " | socat stdio
/var/lib/haproxy/stats
#下线后端服务器
[root@haproxy ~]# echo "disable server webserver_80/webserver1 " | socat stdio
/var/lib/haproxy/stats
#上线后端服务器
[root@haproxy ~]# echo "enable server webserver_80/webserver1 " | socat stdio
/var/lib/haproxy/stats
7.haproxy的算法
静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度
等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。
static-rr:基于权重的轮询调度
不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
不支持端服务器慢启动
其后端主机数量没有限制,相当于LVS中的 wrr
Note
慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没
问题后在给一部分
示例:
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
bind 172.25.254.100:80
mode http
balance static-rr
server webserver1 192.168.0.101:80 weight 2 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
...上面内容省略...
first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
示例:
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
bind 172.25.254.100:80
mode http
balance first
server webserver1 192.168.0.101:80 maxconn 3 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80 check inter 3s fall 3 rise 5
...上面内容省略...
测试效果:
#在两台主机上分别执行此循环,可以观察是否102被调度到
while true;do curl 172.25.254.100 ; sleep 0.1;done
动态算法
基于后端服务器状态进行调度适当调整,
新请求将优先调度至当前负载较低的服务器
权重可以在haproxy运行时动态调整无需重启
roundrobin
1. 基于权重的轮询动态调度算法,
2. 支持权重的运行时调整,不同于lvs中的rr轮训模式,
3. HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
4. 其每个后端backend中最多支持4095个real server,
5. 支持对real server权重动态调整,
6. roundrobin为默认调度算法,此算法使用广泛
示例:
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
bind 172.25.254.100:80
mode http
balance roundrobin
server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
...上面内容省略...
动态调整权重
[root@haproxy ~]# echo "set weight webserver_80/webserver1 2" | socat stdio
/var/lib/haproxy/haproxy.sock
4.2.2 leastconn
leastconn加权的最少连接的动态
支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户
端连接)
比较适合长连接的场景使用,比如:MySQL等场景。
示例:
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
bind 172.25.254.100:80
mode http
balance leastconn
server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise5
server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise5
总结算法
一、基础调度算法
1. 轮询(Round Robin)
原理:按顺序依次将请求分发到后端服务器,循环往复。
配置示例:
backend web_servers
balance roundrobin
server web1 172.25.254.10:80 check
server web2 172.25.254.20:80 check
适用场景:后端服务器性能相近,且请求处理时间差异不大的场景(如静态资源服务器)。
特点:简单公平,但未考虑服务器实际负载(如某些服务器处理速度慢时可能过载)。
2. 加权轮询(Weighted Round Robin)
原理:根据服务器性能差异分配权重,权重高的服务器接收更多请求。
配置示例:
backend web_servers
balance roundrobin
server web1 172.25.254.10:80 check weight 3
server web2 172.25.254.20:80 check weight 2
适用场景:后端服务器硬件配置不同(如高配服务器权重设为 5,低配设为 2)。
特点:灵活调整负载分配,但仍未动态感知服务器实时负载。
二、动态调度算法
3. 最少连接(Least Connections)
原理:优先将请求分配给当前连接数最少的服务器,动态平衡负载。
配置示例:
plaintext
backend web_servers
balance leastconn
server web1 172.25.254.10:80 check
server web2 172.25.254.10:80 check
适用场景:请求处理时间差异较大的场景(如数据库查询、复杂业务逻辑)。
特点:避免长连接请求集中在某些服务器,但未考虑服务器性能差异(如低配服务器可能因连接数少而被过度分配)。
4. 加权最少连接(Weighted Least Connections)
原理:结合权重和连接数,计算 “有效连接数”(实际连接数 / 权重),优先选择有效连接数最少的服务器。
配置示例:
backend web_servers
balance leastconn
server web1 172.25.254.10:80 check weight 3 # 高配服务器权重高
server web2 172.25.254.20:80 check weight 1 # 低配服务器权重低
适用场景:服务器硬件差异明显,且请求处理时间不均的场景(如混合云环境)。
特点:综合考虑服务器性能和实时负载,平衡性最佳,是 HAProxy 的默认算法。
三、会话保持相关算法
5. 源地址哈希(Source IP Hash)
原理:基于客户端 IP 地址进行哈希计算,将同一 IP 的请求始终路由到同一服务器。
配置示例:
backend web_servers
balance source
server web1 172.25.254.10:80 check
server web2 172.25.254.20:80 check
适用场景:需要会话保持的场景(如未使用分布式会话的系统),或缓存集群(确保同一用户请求命中同一缓存服务器)。
特点:实现简单,但可能导致负载不均(如大量客户端来自同一网段)。
6. URI 哈希(URI Hash)
原理:基于请求的 URI(如 /api/users)进行哈希,相同 URI 的请求路由到同一服务器。
配置示例:
plaintext
backend static_servers
balance uri
server static1 172.25.254.10:80 check
server static2 172.25.254.20:80 check
适用场景:静态资源服务器集群(如 CDN),确保同一资源始终由同一服务器处理,提高缓存命中率。
特点:适合内容分发网络(CDN),但不适合动态业务(如用户会话)。
7. URL 参数哈希(URL Parameter Hash)
原理:基于 URL 中的特定参数(如 session_id 或 user_id)进行哈希,确保带相同参数的请求路由到同一服务器。
配置示例:
plaintext
backend app_servers
balance url_param user_id # 基于user_id参数哈希
server app1 172.25.254.10:8080 check
server app2 172.25.254.20:8080 check
适用场景:微服务架构中,需将同一用户的请求路由到同一服务实例(如用户服务)。
特点:更精确的会话保持,但需确保请求中包含稳定的参数。
四、其他高级算法
8. 随机(Random)
原理:随机选择后端服务器,可结合权重调整概率。
配置示例:
plaintext
backend web_servers
balance random
server web1 172.25.254.10:80 check weight 2
server web2 172.25.254.20:80 check weight 1
适用场景:测试环境或对负载均衡精度要求不高的场景。
特点:实现简单,但可能导致负载波动较大。
9. 最少响应时间(Least Time)
原理:结合服务器连接数和平均响应时间,选择 “响应最快且连接数最少” 的服务器。需通过 slowstart 或 httpchk 收集响应时间数据。
配置示例:
plaintext
backend web_servers
balance leasttime
server web1 172.25.254.10:80 check slowstart 30s # 冷启动期30秒
server web2 172.25.254.20:80 check slowstart 30s
适用场景:对响应时间敏感的业务(如电商支付、API 网关)。
特点:需足够的请求样本才能准确评估响应时间,冷启动期可避免新上线服务器被过载。
8.IP透传
四层IP透传
#未开启透传的四层代理
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
bind 172.25.254.100:80
mode tcp
balance roundrobin
server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
...上面内容省略...
#正常的nginx配置
[root@rs1 ~]# vim /etc/nginx/nginx.conf
。。。内容省略。。。
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
。。。内容省略。。。
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
。。。内容省略。。。
}
}
#在访问haproxy后查看nginx日志
[root@rs1 ~]# tail -n 3 /var/log/nginx/access.log
192.168.0.10 - - [10/Jul/2024:15:21:00 +0800] "GET / HTTP/1.1"200 18 "-"
"curl/7.29.0" "-"192.168.0.10 - - [10/Jul/2024:15:26:11 +0800] "GET /
HTTP/1.1"200 18 "-" "curl/7.29.0" "-"
在此日志中是无法看到真实访问源地址的
开启四层透传
#nginx 配置:在访问日志中通过变量$proxy_protocol_addr 记录透传过来的客户端IP
[root@rs1 ~]# vim /etc/nginx/nginx.conf
。。。内容省略。。。
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
' "$proxy_protocol_addr"'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
。。。内容省略。。。
server {
listen 80 proxy_protocol; #启用此项,将无法直接访问此网站,只能通过四层代理
访问
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
。。。内容省略。。。
}
}
#修改haproxy
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
bind 172.25.254.100:80
mode tcp
balance roundrobin
server webserver1 192.168.0.101:80 send-proxy weight 1 check inter 3s fall 3
rise 5
...上面内容省略...
#查看日志内容
[root@rs1 ~]# tail -n 3 /var/log/nginx/access.log
192.168.0.10 - - [10/Jul/2024:15:21:00 +0800] "GET / HTTP/1.1"200 18 "-"
"curl/7.29.0" "-"
192.168.0.10 - - [10/Jul/2024:15:26:11 +0800] "GET / HTTP/1.1"200 18 "-"
"curl/7.29.0" "-"
192.168.0.10 - - [10/Jul/2024:15:41:56 +0800] "GET / HTTP/1.1" "172.25.254.10"200
18 "-" "curl/7.29.0"
七层IP透传
#修改haproxy
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
option forwardfor
bind 172.25.254.100:80
mode http
balance roundrobin
server webserver1 192.168.0.101:80 send-proxy weight 1 check inter 3s fall 3
rise 5
server webserver1 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
...上面内容省略...
9.ACL
域名匹配
haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend testacl
bind :80
mode http
########### ACL settings #######################
acl web_host hdr_dom(host) www.timinglee.org
########### host ###########################
use_backend timinglee_host if web_host
########### default server ###################
default_backend default_webserver
backend timinglee_host
mode http
server web1 192.168.0.101:80 check weight 1 inter 3s fall 3 rise 5
server web2 192.168.0.102:80 check weight 1 inter 3s fall 3 rise 5
backend default_webserver
mode http
server web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5
#在浏览器所在主机中做地址解析
[root@node10 html]# vim /etc/hosts
172.25.254.100 www.timinglee.org
#测试结果
[root@node10 html]# curl www.timinglee.org
RS1 192.168.0.101
[root@node10 html]# curl www.timinglee.org
RS2 server - 192.168.0.102
[root@node10 html]# curl 172.25.254.100
default web server node10
基于源IP或子网调度访问
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
frontend testacl
bind :80
mode http
########### ACL settings #######################
acl ip_test src 172.25.254.1 192.168.0.0/24
########### host ###########################
use_backend ip_test-host if ip_test
########### default server ###################
default_backend default_webserver
backend ip_test-host
mode http
server web1 192.168.0.101:80 check weight 1 inter 3s fall 3 rise 5
backend default_webserver
mode http
server web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5
测试结果
[172.25.254.10 root@node10 html]# curl 172.25.254.100
default web server node10
[172.25.254.1 Administrator.WIN-20240602BIS] ➤ curl 172.25.254.100
RS1 192.168.0.101
[192.168.0.102 root@rs1 ~]# curl 192.168.0.101
RS1 192.168.0.101
10.自定义错误页面
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
defaults
mode http
...内容省略...
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 1000000
errorfile 503 /haproxy/errorpages/503page.http
[root@haproxy ~]# mkdir /haproxy/errorpages/ -p
[root@haproxy ~]# cp /usr/share/haproxy/503.http /haproxy/errorpages/503page.http
[root@haproxy ~]# vim /haproxy/errorpages/503page.http
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html;charset=UTF-8^M
<html><body><h1>什么动物生气最安静</h1>
大猩猩!!
</body></html>
11.HAProxy 四层负载
对 MySQL 服务实现四层负载
haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen mysql_port
bind :3306
mode tcp
balance leastconn
server mysql1 192.168.0.101:3306 check
server mysql2 192.168.0.102:3306 check
#或者使用frontend和backend实现
haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend mysql_port
bind :3306
mode tcp
use_backend mysql_rs
backend mysql_rs
mode tcp
balance leastconn
server mysql1 192.168.0.101:3306 check
server mysql2 192.168.0.102:3306 check
haproxy ~]# systemctl restart haproxy.service
#在后端服务器安装和配置mariadb服务
rs1 ~]# yum install mariadb-server -y
rs2 ~]# yum install mariadb-server -y
rs1 ~]# vim /etc/my.cnf
[mysqld]
server-id=1 #在另一台主机为
rs2 ~]# vim /etc/my.cnf
[mysqld]
server-id=2 #在另一台主机为
rs1 ~]# systemctl start mariadb
rs2 ~]# systemctl start mariadb
rs1 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"
rs2 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"
#测试
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs2 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs1 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
12.证书
证书制作
haproxy ~]# mkdir /etc/haproxy/certs/
haproxy ~]# openssl req -newkey rsa:2048 \
-nodes -sha256 –keyout /etc/haproxy/certs/timinglee.org.key \
-x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt
https配置示例
haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend webserver
bind *:80
redirect scheme https if !{ ssl_fc }
mode http
use_backend webcluster
frontend webserver-https
bind *:443 ssl crt /etc/haproxy/timinglee.org.pem
mode http
use_backend webcluster
backend webcluster
mode http
balance roundrobin
server web1 172.25.254.200:80 check inter 3s fall 3 rise 5
server web2 172.25.254.201:80 check inter 3s fall 3 rise 5
[root@客户端 ~]#curl -IkL http://172.25.254.100
HTTP/1.1 302 Found
content-length: 0
location: https://www.timinglee.org/
cache-control: no-cache
HTTP/1.1 200 OK
date: Sat, 04 Apr 2020 02:31:31 GMT
server: Apache/2.4.6 (CentOS) PHP/5.4.16
last-modified: Thu, 02 Apr 2020 01:44:13 GMT
etag: "a-5a244f01f8adc"
accept-ranges: bytes
content-length: 10
content-type: text/html; charset=UTF-8
[root@centos6 ~]#curl -Ik https://www.timinglee.org
HTTP/1.1 200 OK
date: Sat, 04 Apr 2020 02:31:50 GMT
server: Apache/2.4.6 (CentOS) PHP/5.4.16
last-modified: Thu, 02 Apr 2020 01:44:28 GMT
etag: "a-5a244f0fd5175"
accept-ranges: bytes
content-length: 10
content-type: text/html; charset=UTF-8