HAproxy
套接字文件:将研发地址与端口整合在一起形成的文件,为提高研发效率而出现的IP地址的连接文件
生产中不推荐为haproxy添加日志:负载均衡 应为压力本来就大
1.mysql为啥用主从,不用级联复制:领导的方案,我们是执行,
2.遇到数据读写分离时,serverid要划分
3.
keepalived防止大批量检测发生堵塞做偏移
.pem 是http 服务,pem=key+crp,用的而key是内部通讯用的
ln -sf /usr/share/zoneinfo/posix/Asia/Shanghai /etc/localtime
如果我们想要把硬件时间设置成系统时间我们可以运行以下命令
# hwclock --hctosys
反之,我们也可以把系统时间设置成硬件时间
# hwclock --systohc
那么如果想设置硬件时间我们可以开机的时候在BIOS里设定.也可以用hwclock命令
# hwclock --set --date="mm/dd/yy hh:mm:ss"
如果想要修改系统时间那么用date命令就最简单了
# date -s "dd/mm/yyyy hh:mm:ss"
————————————————
版权声明:本文为CSDN博主「小强签名设计」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37739193/article/details/77850469
单机房架构
多机房架构 - 多入口访问
公有云架构
1、负载均类型
后端业务不可以支撑很多流量,所以用负载均衡。
HA:主节点不可以漂移
1.1基础分类
1.1.1四层
-
LVS:Linux Virtual Server
基于内核的数据包转发
-
Nginx:1.9版之后
工作在用户空间的伪四层机制因为涉及到了数据包拆包的动作,拆到哪里算哪里,然后封装后再转发
nginx的listen + upstream机制
-
HAProxy:High Availability Proxy
工作在用户空间的伪四层机制
因为涉及到了数据包拆包的动作,拆到哪里算哪里,然后封装后再转发
listen + bind + backend机制
1.1.2七层
-
HAProxy
专业级别的七层负载均衡软件
尤其是应用于大流量场景下
-
Nginx
nginx 的server_name + location机制
相较于haproxy的话,流量不是太大,因为nginx的主职是web功能。
1.1.3硬件
F5 https://f5.com/zh Netscaler https://www.citrix.com.cn/products/citrix-adc/ Array https://www.arraynetworks.com.cn/ 深信服 http://www.sangfor.com.cn/ 北京灵州 http://www.lingzhou.com.cn/cpzx/llfzjh/
1.1.4常见应用场景
四层:TCP/IP层的数据转发 Redis、Mysql、RabbitMQ、Memcached等 七层:http应用层、会话层等数据的转发 Nginx、Tomcat、Apache、PHP、图片、动静分离、API等
1.2 HAProxy基础
1.2.1安装
1.2.1.1首先安装lua
编译安装
root@HA:~# apt install -y gcc make libssl-dev libpcre3 libpcre3-dev zlib1g-dev #安装编译安装软件
root@HA:~#mkdir /data/server
root@HA:~#mkdir /data/softs #准备环境
root@HA:/data/softs# cd /data/softs
root@HA:/data/softs# curl -R -O http://www.lua.org/ftp/lua-5.4.3.tar.gz #下载
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 349k 100 349k 0 0 60063 0 0:00:05 0:00:05 --:--:-- 69785
root@HA:/data/softs# tar zxf lua-5.4.3.tar.gz -C /data/server/
root@HA:/data/softs# cd /data/server/lua-5.4.3
root@HA:/data/server/lua-5.4.3# make all test
1.2.2安装haproxy
root@HA:/data/softs# ls
haproxy-2.5.0.tar.gz lua-5.4.3.tar.gz
root@HA:/data/softs# tar xf haproxy-2.5.0.tar.gz
root@HA:/data/softs# cd haproxy-2.5.0/
root@HA:/data/softs/haproxy-2.5.0# ls
addons CONTRIBUTING include Makefile scripts VERDATE
admin dev INSTALL README src VERSION
BRANCHES doc LICENSE reg-tests SUBVERS
root@HA:/data/softs/haproxy-2.5.0#make -j $(nproc) ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/data/server/lua5.4.3/src/ LUA_LIB=/data/server/lua-5.4.3/src/ PREFIX=/usr/local/haproxy #由于lua安装包问题后来去了LUA编译软件后
root@HA:/data/softs/haproxy-2.5.0# make install PREFIX=/usr/local/haproxy
install: creating directory '/usr/local/haproxy'
install: creating directory '/usr/local/haproxy/sbin'
root@HA:/data/softs/haproxy-2.5.0# ln -s /usr/local/haproxy/sbin/haproxy /usr/local/bin/
root@HA:/data/softs/haproxy-2.5.0# haproxy -v
HAProxy version 2.5.0-f2e0833 2021/11/23 - https://haproxy.org/
Status: stable branch - will stop receiving fix around Q1 2023.
Known bugs: http://www.haproxy.org/bugs/bugs-2.5.0.html
Running on: Linux 5.4.0-91-generic #102-Ubuntu SMP Fri Nov 5 16:31:28 UTC 2021 x86_64
root@HA:~# mkdir -p /etc/haproxy/ /var/lib/haproxy #创建相关的配置文件目录
root@HA:~# cp -r /data/softs/haproxy-2.5.0/examples/errorfiles /usr/local/haproxy/
root@HA:~# ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
root@HA:~# ls /data/haproxy/conf/ #之前准备好配置文件
01-haproxy-conf-test.cfg 19-haproxy-conf-mapbase.cfg
02-haproxy-conf-nbthread.cfg 20-haproxy-conf-consistent.cfg
root@HA:~# cp /data/haproxy/conf/01-haproxy-conf-test.cfg /etc/haproxy/haproxy.cfg #配置文件
root@HA:~# groupadd haproxy
root@HA:~# useradd -g haproxy haproxy
root@HA:~# chown -R haproxy:haproxy /var/lib/haproxy
root@HA:~# /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
注意
root@HA:/data/softs/haproxy-2.5.0# cat /etc/haproxy/haproxy.cfg
listen web_port
bind 10.0.0.15:80 #改为主机id或者sysctl -p |grep nol
mode http
root@ububtu:/etc/haproxy# /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg #查看配置文件是不是有用
root@ububtu:/etc/haproxy# ps aux | grep haproxy #下方出现两个进程
root@ububtu:/etc/haproxy# netstat -tnulp #查看有没有配置文件的端口
root@ububtu:/etc/haproxy# kill -9 61443 #杀死进程
root@ububtu:/etc/haproxy# ps aux | grep haproxy
root 61800 0.0 0.0 6432 668 pts/3 S+ 08:29 0:00 grep --color=auto haproxy
root@ububtu:~# ls
haproxy.service reset_v5.sh snap #服务文件
root@ububtu:~# mv haproxy.service /usr/lib/systemd/system/ #启动服务文件
root@ububtu:~# systemctl daemon-reload
root@ububtu:~# systemctl start haproxy.service
root@ububtu:~# systemctl ststus haproxy
Unknown operation ststus.
root@ububtu:~# systemctl status haproxy.service
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/lib/systemd/system/haproxy.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2021-12-30 08:37:12 UTC; 41s ago
1.2.3haproxy的其他配置
1.2.3.1绑定本地主机不存在的ip地址/配置端口转发功能
对于haproxy来说,默认情况下,只允许绑定本地节点出现的ip地址,否则无法启动haproxy
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
# grep net.ipv4.ip_forward=1 /etc/sysctl.conf
net.ipv4.ip_forward=1
启动参数
sysctl -p
1.2.3.2检查配置文件是不是管用
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
ps aux | grep haproxy #看是不是有进程
netstat -tnulp | grep haproxy #看端口
kill -9 15015
ps aux | grep haproxy
1.2.3.3.日志分离
apt-get install -y rsyslog
vim /etc/rsyslog.conf修改日志系统配置
module(load="imudp")
input(type="imudp" port="514")
注意:haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
在/etc/rsyslog.d/目录下创建 haproxy的日志配置文件haproxy.conf
vim /etc/rsyslog.d/haproxy.conf
local7.* /var/log/haproxy.log
&~ #&~表示haproxy日志仅仅写入/var/log/haproxy.log中,不写入/var/log/syslog件。
systemctl restart rsyslog.service #重启rsyslog服务
systemctl restart haproxy.service #重启haproxy服务,生成新日志
ls /var/log/haproxy.log #查看日志文件
tail -f /var/log/haproxy.log #查看日志
1.2.3.4多线程实例
查看默认的socket文件效果
root@python-auto:/data/haproxy/conf# ll /var/lib/haproxy/haproxy.sock
srw------- 1 root root 0 12月 15 10:19 /var/lib/haproxy/haproxy.sock=
结果显示:
该文件的权限是 600,文件属性是root
修改配置文件 /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
nbthread 6
systemctl restart haproxy
root@ububtu:~# pstree -p |grep haproxy
|-haproxy(1350)---haproxy(1352)-+-{haproxy}(1353)
| |-{haproxy}(1354)
| |-{haproxy}(1355)
| |-{haproxy}(1356)
| `-{haproxy}(1357)
{} 表示线程的方式 ()进程标识方式
属性解析:
在2.5版本之前,多线程需要 nbproc + daemon + n个stats来配套使用。
在2.5版本之后,nbproc 已经被nbthread替代,只需要指定nbthread数量即可
1.2.3.5cpu线程绑定(鸡肋)
1.2.3.6健康检查实践
修改配置文件 /etc/haproxy/haproxy.cfg
global
spread-checks 3
# spread-checks 20%
...
# 属性解析:
#这个代表错峰进行后端应用的检查机制,该值可以是整数(2-5),也可以是(+/- 50%)
重启服务
systemctl restart haproxy
所有的检查机制,会均匀的分散到时间检测区间范围中,避免大量主机突然进行状态的检测。
1.2.4配置解析
1.2.4.1global配置
HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分。
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置,配置简单,生产推荐使用
全局配置
1.2.4.1.2globai配置参数说明
chroot # 指定锁定运行目录
deamon # 以守护进程运行
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin process 1 # socket文件,并可以通过此文件管理
user, group, uid, gid # 运行haproxy的用户身份
nbthread 1 # 指定每个haproxy进程开启的线程数,默认为每个进程一个线程
cpu-map auto:1/1-8 0-7 # 进行线程和CPU的绑定
# auto: 让HAProxy通过递增自动将进程或线程绑定到 CPU进程/线程和
CPU 集。
# 前后的两个值必须一致,每个进程中1-8个线程分别绑定0-7号CPU
# 每个进程中1-2个线程分别绑定0-1号CPU
maxconn n # 每个haproxy进程的最大并发连接数
maxsslconn n # 每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxconnrate n # 每个进程每秒创建的最大连接数量
spread-checks n # 后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
pidfile # 指定pid文件路径
log 127.0.0.1 local2 info #定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个
1.2.4.2Proxies基础
核心配置
defaults [<name>]
默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontend <name>
前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。
backend <name>
后端服务器组,等于nginx的upstream和LVS中的RS服务器
listen <name>
将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用
1.2.4.2..2
defaults 配置参数:
option redispatch # 当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose # 当服务器负载很高时,自动结束掉当前队列处理比较久的连接,针对业务情况选择开启
option http-keep-alive # 开启与客户端的会话保持
option forwardfor # 透传客户端真实IP至后端web服务器,类似于nginx的x-real-ip
mode http|tcp # 设置默认工作类型,使用TCP服务器性能更好,减少压力
timeout http-keep-alive 120s # session 会话保持超时时间,此时间段内会转发到相同的后端服务器
timeout connect 120s # 请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单
位ms
timeout server 600s # 请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms
# 如果超时,会出现502错误,此值建议设置较大些,防止出现502错误
timeout client 600s # 设置haproxy与客户端的最长非活动时间,默认单位ms
# 建议和timeout server相同
timeout check 5s # 对后端服务器的默认检测超时时间
default-server inter 1000 weight 3 # 指定后端服务器的默认设置
frontend配置
bind:
指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
bind [<address>]:<port_range> [, ...] [param*]
注意:
如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1
backlog <backlog>
针对所有server配置,当前端服务器的连接数达到上限后
为了防止用户访问的异常,我们提供一个后援的队列长度,方便我们的应用能够提供更充裕的性能。
注意:不支持backend
backend配置
基本配置:
mode http|tcp # 指定负载协议类型,和对应的frontend必须一致
option # 配置选项,定制多种检测机制
# httpchk,smtpchk,mysql-check,pgsql-check,ssl-hello-chk
server # 定义后端real server,必须指定IP和端口
# 在server内部有大量的检测机制,check、weight、backup、disable等
redirect # 功能与server里面的redir相似,是独立存放在listen,frontend,backend语句
块
# 格式:redirect prefix http://www.baidu.com/
# 只适用于http模式
作用:
定义一组后端服务器,backend服务器将被frontend进行调用。
注意:
backend 的名称必须唯一,并且必须在listen或frontend中事先定义才可以使用,否则服务无法启动
server检测机制 - check
对指定后端主机进行健康状态检查,如果不加此设置,默认不开启检查
默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查
addr <IP> 可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port <num> 指定的健康状态监测端口
inter <num> 健康状态检查间隔时间,默认2000 ms
fall <num> 后端服务器从线上转为线下的检查的连续失效次数,默认为3
rise <num> 后端服务器从下线恢复上线的检查的连续有效次数,默认为2
server其他检测
weight <weight>
默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接
backup
将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry Server
disabled
将后端服务器标记为不可用状态,即维护状态,除了持久模式,将不再接受连接,状态为深黄色,优雅下
线,不再接受新用户的请求
maxconn <maxconn>
当前后端server的最大并发连接数,放在,放在server 指令后面
redir http://www.baidu.com
将请求临时(302)重定向至其它URL,只适用于http模式,放在server 指令后面
1.3实践
2-12-nat-10.0.0.15
3-15-host-10.0.0.25-192.168.8.25
4-14-host-10.0.0.35-192.168.8.35
5-15-host-10.0.0.45-192.168.8.45
6-16-都用
名称 | IP | 主机 | |
---|---|---|---|
client | 10.0.0.15 | 10.0.0.15 | |
HA | 10.0.0.65,182.168.8.12 | 10.0.0.65 | HA |
backend | 192.168.8.25 | 10.0.0.25 | nginx |
backend | 192.168.8.35 | 10.0.0.35 | apache |
backend | 192.168.8.45 | 10.0.0.45 | sorry/nginx |
定制后端环境
nginx
root@ba-nginx-25:~#apt install nginx -y
root@ba-nginx-25:~#echo backend-nginx-13 > /var/www/html/index.nginx-debian.html
root@ba-nginx-25:~# curl localhost
backend-nginx-13
apache
root@ba-apache-35:~#apt install apache2 -y
root@ba-apache-35:~#echo backend-apache2-14 > /var/www/html/index.html
root@ba-apache-35:~# curl localhost
backend-apache2-14
sorryserver
root@ba-sorry-45:~#apt install nginx -y
root@ba-sorry-45:~#echo backend-sorry > /var/www/html/index.html
root@ba-sorry-45:~# curl localhost
sorry_server
haproxy-配置
root@ububtu:/etc/haproxy# vim /etc/haproxy/haproxy.cfg
listen backend_web_port_80
bind 10.0.0.65:80
mode http
log global
server web1 192.168.8.25:80
server web2 192.168.8.35:80
测试:
root@ububtu:/etc/haproxy# for i in {1..8}; do curl 10.0.0.65; done
backend-nginx-13
backend-apache2-14
backend-nginx-13
backend-apache2-14
backend-nginx-13
backend-apache2-14
backend-nginx-13
backend-apache2-14
haproxy-配置
listen backend_web_port_80
bind 10.0.0.65:80
mode http
log global
server web1 192.168.8.25:80 weight 1 check inter 3000 fall 3 rise 5
server web2 192.168.8.35:80 weight 1 check inter 3000 fall 3 rise 5
server error_web 192.168.8.45:80 backup check inter 3000 fall 3 rise 5
测试
root@client:~# for i in {1..8}; do curl 10.0.0.65; done
sorry_server
sorry_server
sorry_server
sorry_server
sorry_server
1.3.2跳转实践:
对于我们自定义的error服务器来说,如果我们不想让用户看到不好的提示信息,可以跳转到首页的网站地址
语法格式
server error_web 192.168.8.45:80 ... redir http://www.baidu.com
1.3.3服务禁止实践:
在server中,我们可以根据 disable的属性来将后端服务器标记为不可用状态,即维护状态。
配置格式:
server error_web 192.168.8.25:80 disabled
1.3.4访问限制
在server中,我们可以根据 maxconn 的属性来临时设定后端的连接数量限制。
listen backend_web_port_80
bind 10.0.0.15:80
mode http
log global
server web1 192.168.8.25:80 maxconn 5000 weight 1 check inter 3000 fall 3 rise 5
server web2 192.168.8.35:80 maxconn 8000 weight 3 check inter 3000 fall 3 rise 5
server error_web 192.168.8.45:80 backup check inter 3000 fall 3 rise 5
1.3.5前后端实践:
当我们的场景中存在大量的后端主机和前端主机的场景下,我们需要综合运用这些前后端主机来实现更灵活的场景,就可以在一个配置文件中,定制大量的前端主机和后端主机的配置。 关于前端主机我们可以基于 frontend 来实现,关于后端主机我们可以基于 backend 来实现。
frontend haproxy-frontend
bind 10.0.0.65:80
log global
mode tcp
use_backend web-backend1
listen web-backend1
server web1 192.168.8.25:80 maxconn 5000 weight 1 check inter 3000 fall 3 rise 5
server web2 192.168.8.35:80 maxconn 8000 weight 3 check inter 3000 fall 3 rise 5
server error_web 192.168.8.45:80 backup check inter 3000 fall 3 rise 5
1.4子配置文件
以参考nginx中的include,将不同场景的配置文件通过单独的文件来承载,最终以文件导入的方式来实现整体效果。这样实现的目录文件结构更容易控制我们的配置体系。
注意: 子配置文件的文件后缀必须为.cfg
1.4.1实践:
1.准备专属子文件
root@ububtu:/etc/haproxy# mkdir /etc/haproxy/conf.d
root@ububtu:/etc/haproxy# mkdir /etc/haproxy/conf.d/myweb.cfg
root@ububtu:/etc/haproxy# sed -nr '29,$p' /etc/haproxy/haproxy.cfg > /etc/haproxy/conf.d/myweb.cfg #将29行以后的放入子目录
root@ububtu:/etc/haproxy# sed -i 's#y.cfg#y.cfg -f /etc/haproxy/conf.d/#g' /usr/lib/systemd/system/haproxy.service #在服务启动文件中加入配置文件的子目录
root@ububtu:/etc/haproxy# cat /usr/lib/systemd/system/haproxy.service
...
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -p /var/lib/haproxy/haproxy.pid#在此处
root@ububtu:/etc/haproxy# systemctl daemon-reload
root@client:~# for i in {1..8}; do curl 10.0.0.65; done
backend-apache2-14
backend-apache2-14
backend-apache2-14
backend-nginx-13
配置文件
root@ububtu:/data/haproxy/conf# cat -n /etc/haproxy/haproxy.cfg
1 global
2 maxconn 100000
3 chroot /usr/local/haproxy
4 stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
5 user haproxy
6 nbthread 8
7 group haproxy
8 daemon
9 pidfile /var/lib/haproxy/haproxy.pid
10 log 10.0.0.12 local2 info
11
12 defaults
13 option http-keep-alive
14 option forwardfor
15 maxconn 100000
16 mode http
17 timeout connect 300000ms
18 timeout client 300000ms
19 timeout server 300000ms
20
21 listen stats
22 mode http
23 bind 0.0.0.0:9999
24 stats enable
25 log global
26 stats uri /haproxy-status
27 stats auth haadmin:123456
28
29 frontend haproxy-frontend
30 bind 10.0.0.75:80
服务启动文件
root@ububtu:/data/haproxy/conf# cat /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
1.5调度算法
算法一般定制后不会改变
1.5.1静态算法
按照事先定义好的规则轮询进行调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时动态修改权重(只能为0和1,不支持其它值)或者修改后不生效,如果需要修改只能靠重启反向代理软件生效。
静态实践:
修改haproxy的反向代理 /etc/haproxy/haproxy.cfg
frontend haproxy-frontend
bind 10.0.0.65:80
log global
mode tcp
use_backend web-backend1
listen web-backend1
server web1 192.168.8.25:80 weight 1 check inter 3000 fall 3 rise 5
server web2 192.168.8.35:80 weight 3 check inter 3000 fall 3 rise 5
server error_web 192.168.8.45:80 backup check inter 3000 fall 3 rise 5
修改haproxy的反向代理 /etc/haproxy/haproxy.cfg
1.5.1.2权重修改
socat基础:
对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版。 Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如 IP、TCP、UDP、IPv6、Socket文件等
环境准备:
root@ububtu:/etc/haproxy# apt -y install socat
root@ububtu:echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock #查看配置相关的内容
root@ububtu:echo "show servers state" | socat stdio /var/lib/haproxy/haproxy.sock #获取后端服务器的权重信息
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight sr srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port sr
4 web-backend1 1 web1 192.168.8.25 2 0 1 1 2116 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
4 web-backend1 2 web2 192.168.8.35 2 0 3 3 2116 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
4 web-backend1 3 error_web 192.168.8.45 2 0 1 1 2116 6 3 7 6 0 0 0 - 80 - 0 0 - -
root@ububtu:echo "get weight backend_web_port_80/web1" | socat stdio
/var/lib/haproxy/haproxy.sock #获取指定服务器的权重信息
socat 修改weight,仅限于单进程场景,否则的话无法正常的查看效果
root@ububtu:echo "set weight backend_web_port_80/web2 1" | socat stdio
/var/lib/haproxy/haproxy.sock#将web2的weight的比重修改为1
root@ububtu:echo "disable server backend_web_port_80/web2" | socat stdio
/var/lib/haproxy/haproxy.sock#禁用web2后端主机
root@ububtu:echo "show servers state" | socat stdio /var/lib/haproxy/haproxy.sock
1.5.2动态算法
基于后端服务器状态进行调度适当调整,新请求将优先调度至当前负载较低的服务器,且权重可以在负载均衡软件运行时动态调整无需重启。
2进阶
2.1cookie会话http层
cookie是一种客户端和服务端保持认证信息的一种方式,往往在客户端的浏览器保留一份缓存数据,便于下次通信的基本认证。
在haproxy中,我们可以基于浏览器保存的一些信息,实现定向的流量转发功能。相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加重了haproxy负载,目前此模式使用较少, 已经被session共享服务器代替
配置解析:
cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [ preserve ][ httponly ] [ secure ][ domain ]* [ maxidle <idle> ][ maxlife ]
name: # cookie 的 key名称,用于实现持久连接
insert: # 插入新的cookie,默认不插入cookie
indirect: # 如果客户端已经有cookie,则不会再发送cookie信息
nocache: # 当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器
注意
该功能不支持 tcp mode,需要使用 http mode
cookie实践:
修改haproxy的反向代理 /etc/haproxy/haproxy.cfg
listen backend_web_port_80
bind 10.0.0.15:80
mode http
log global
cookie WEBSRV insert nocache indirect
server web1 192.168.8.35:80 check inter 3000 fall 3 rise 5 cookie web1
server web2 192.168.8.25:80 check inter 3000 fall 3 rise 5 cookie web2
重启haproxy服务
systemctl restart haproxy
浏览器查看效果
测试:
for i in {1..3};do curl -b "WEBSRV=web1" http://10.0.0.15;
# for i in {1..3};do curl -b "WEBSRV=web2" http://10.0.0.15;
done#可以查看带有相同的cook流量在同一后端主机
通过curl的 vb 参数,查看请求时候携带的信息
curl -vb "WEBSRV=web1" http://10.0.0.15
2.2状态页
haproxy提供了一个非常简单的web页面,便于我们能够快速的获取相关的haproxy状态信息 官方资料: https://cbonte.github.io/haproxy-dconv/2.5/configuration.html#4-stats%20admin
参考代码
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456 明文不安全
状态配置项
stats enable # 基于默认的参数启用stats page
stats hide-version # 将状态页中haproxy版本隐藏
stats refresh <delay> # 设定自动刷新时间间隔,默认不自动刷新,以秒为单位
stats uri <prefix> # 自定义stats page uri,默认值:/haproxy?stats
stats realm <realm> # 账户认证时的提示信息,示例:stats realm HAProxy\ Statistics
stats auth <user>:<passwd> # 认证时的账号和密码,可定义多个用户,每行stats auth指定一个用户
# 默认:no authentication
stats admin { if | unless } <cond> # 启用stats page中的管理功能,基于安全原因,不建议开启
页码解析
登录状态页说明 - 全局部分
pid = 125648 (process #1, nbproc = 1, nbthread = 2)
pid为当前pid号,process为当前进程号,nbproc和nbthread为一共多少进程和每个进程多少个线程
uptime = 0d 0h16m33s
当期haproxy服务启动了多长时间
system limits: memmax = unlimited; ulimit-n = 200032
系统资源限制:内存/最大打开文件数/
maxsock = 200032; maxconn = 100000; maxpipes = 0
最大socket连接数/单进程最大连接数/最大管道数maxpipes
current conns = 2; current pipes = 0/0; conn rate = 2/sec; bit rate = 0.000 kbps
当前连接数/当前管道数/当前连接速率
Running tasks: 1/14; 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)
2.3数据报文
2.3.1IP透传
根据我们之前对于nginx的了解,一般情况的情况下,用户端真实的ip地址是无法被反向代理后端的主机识别出来的,但是我们可以对反向代理服务进行配置,让他能够携带用户真实的ip地址,传递给后端的真实服务器。
3.https的实验
http跳转到https需要做两步,
1.证书制作
2.ssl属性的定制
nginx
nginx禁止访问:name后边加_
server
listen 80 default
server_name_
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下