目录
[5.redirect prefix和redir](#5.redirect prefix和redir)
一.快速安装lua和haproxy
链接:https://pan.baidu.com/s/1JDMP9Wag5WkjCHLVLOh0-w
提取码:4ahw
[root@main haproxy]# yum install -y readline-devel gcc gcc-c++ make openssl-devel pcre-devel systemd-devel
[root@main haproxy]# tar -zvxf lua-5.4.4.tar.gz -C /usr/local/src/
[root@main haproxy]# cd /usr/local/src/lua-5.4.4/
[root@main lua-5.4.4]# make linux test
[root@main lua-5.4.4]# src/lua -v
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
#lua至此安装完成
[root@main haproxy]# tar -zxvf haproxy-2.8.1.tar.gz -C /usr/local/src/
[root@main haproxy-2.8.1]# make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.4.4/src/ LUA_LIB=/usr/local/src/lua-5.4.4/src/
#这里的lua版本要自己修改为实际版本
[root@main haproxy-2.8.1]# make install PREFIX=/apps/haproxy
[root@main haproxy-2.8.1]# ln -s /apps/haproxy/sbin/haproxy /usr/sbin/ #创建软链接方便启动
[root@main haproxy-2.8.1]# vim /usr/lib/systemd/system/haproxy.service
[root@main haproxy-2.8.1]# which haproxy
/usr/sbin/haproxy #这个文件用于卸载service脚本中
[root@main examples]# cat /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
[root@main haproxy-2.8.1]# mkdir /etc/haproxy/ #创建用于存放配置文件的目录
[root@main examples]# cp quick-test.cfg /etc/haproxy/haproxy.cfg #将快去启动脚本复制过来并改名启动
[root@main examples]# vim /etc/haproxy/haproxy.cfg
[root@main examples]# mkdir /var/lib/haproxy #创建用于存放pid的目录
[root@main examples]# systemctl daemon-reload
[root@main examples]# systemctl start haproxy.service
[root@main examples]# systemctl status haproxy.service
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-03-25 17:48:01 CST; 1s ago
Main PID: 9209 (haproxy)
CGroup: /system.slice/haproxy.service
├─9209 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -...
└─9211 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -...
Mar 25 17:48:01 main systemd[1]: Started HAProxy Load Balancer.
Mar 25 17:48:01 main haproxy[9209]: [NOTICE] (9209) : New worker (...d
Mar 25 17:48:01 main haproxy[9209]: [NOTICE] (9209) : Loading success.
Hint: Some lines were ellipsized, use -l to show in full.
#启动正常,服务还没配置,暂时无法使用
二.配置haproxy的配置文件
基本常用参数如下,其余的可自行查阅。在本份代码中是采用frontend+backend配置使用,是可以将其改为listen模式的,就是将bind等和server等放在listen下一级的同一级缩进上。
[root@main haproxy]# cat haproxy.cfg
global #全局模块
strict-limits
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #指定socket文件
#user xxx #指定用户和组
#group xxx
chroot /apps/haproxy
#锁定运行目录
log 127.0.0.1 local3 info
#开启log的local3,后面需要去syslog开启该等级的全局配置
daemon #以守护进程运行(后台)
defaults #默认配置模块。这个模块的配置会被后文的部分模块继承
mode http
#默认工作模式,目前常用http和tcp,一般情况下认为tcp的性能更好,更利于减少负载
balance random
retries 5 #最大尝试重连数
timeout client 60s #与客户端最长非活动连接时间
timeout server 60s #客户端请求到server的超时时常,超时后报错502
timeout connect 1s #客户端从haproxy请求到后端server的最长连接等待时间
timeout check 5s #对后端服务器的默认检测超时时间
option httplog #日志使用http格式,使用tcp-mode时,又指定tcplog
option http-server-close
#开启后,HAProxy 会在每次请求后关闭与后端服务器的连接。这样可以确保每个请求都使用新的连接,而不会重用现有连接。适用于某些需要短暂连接生命周期的场景
option forwardfor
#启用后,HAProxy 会在转发请求时添加一个 "X-Forwarded-For" 头部,其中包含了原始客户端的 IP 地址。记录客户端真实 IP 地址很有用。
option redispatch
#启用后,如果连接到后端服务器的尝试失败,HAProxy 将会重试另一个服务器。这个选项可以确保请求被重新分发,即使一些后端服务器出现故障
option abortonclose
#服务器负载高时自动结束处理时间很长的连接,择时再开启
option http-keep-alive
#与客户端的会话保持
#option httpclose 每次请求后关闭与客户端的连接,非持久连接
#option httpchk http健康检查,定期检查后端服务器健康状态
#option prefer-last-server 优先将请求发往上次处理过该请求的服务器
#option http-use-proxy-header 使用proxy头部信息来识别客户端IP地址
stats uri /status #开启监控
stats auth sulibao:317418 #这是监控的用户认证,目的是适当保护监控面板和设备信息的安全,冒号前是名称后面是密码
stats refresh 3s #监控页面刷新时间,实时获取设备状态
frontend main #前端模块
bind *:80 #监听本机所有ip地址下的80端口,监听443-https协议时还需要执行公私钥文件
#例如这样,bind :443 ssl crt /etc/haproxy/xxx
log global #全局日志开启
default_backend web #指定默认后端组
backend web #后端模块,名称和上文指定一致
balance roundrobin #指定负载均衡调度算法为轮询,即rr,这样在后端再写一次就不会继承到defaults模块中刚才配置的random算法,后文会简单介绍几个调度算法
#option 这里的option和check在后面介绍
server web1 192.168.2.131:80 check #后端server,check表示定期检查,此处详细见后面server选项
server web2 192.168.2.132:80 check
三.配置haproxy的全局日志
[root@main haproxy]# vim /etc/rsyslog.conf
在文件中找到此处按这样修改,也可以将local3写到后面和local7写在一起
[root@main haproxy]# systemctl restart rsyslog.service
四.测试负载均衡、监控和日志效果
按上面的配置文件来配置,并且web1和web2已经配置好index.html内容,效果将是如下
[root@serverc ~]# for ((i=1;i<=10;i++));do curl 192.168.2.130;donefirst
second
first
second
first
second
first
second
first
second
我的haproxy均衡器节点是192.168.2.130,以如下方式去查看监控页面http://192.168.2.130/status,由于设置了用户认证,所以需要先登录才能查看,监控页面的刷新间隔可以自己在配置文件中调整
五.server常用可选项
格式示例
server web1 192.168.2.131:80 check inter 3000 fall 2 rise 5 weight 2
1.check
参数 | 含义 |
---|---|
inter | 健康状态检查间隔时间 |
fall | 后端服务器从线上转为线下的检查的连续失效次数,默认为3 |
rise | 后端服务器从下线恢复上线的检查的连续有效次数,默认为2 |
2.weight
当调度方式设计到权重时,使用此参数设置
3.backup
将服务器标记为备份状态,只在所有非备份主机down机时提供服务
4.disabled
将后端服务器标记为不可用状态,即维护状态,除了持久模式,将不再接受新请求
5.redirect prefix和redir
两者都是将请求临时重定向到指定url,前者新开窗口保持原有页面不动,后者使用现在窗口跳转,这两个参数都只适用于http-mode
6.maxconn
server的最大并发数
六.调度算法
1.静态
(1)static-rr
基于权重的轮询,根据配置的权重值来调度
(2)first
server列表中的书写顺序来调度,从上至下,只有当第一台的负载连接上限了才往下调度,效果不是很理想
(3)source
默认归类为静态算法,但可以通过hash-type修改为动态。
源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端web服务器。此方式当后端服务器数据量发生变化时,会导致非常多的用户的请求转发至新的后端服务器,适用于需要会话保持但不支持cookie和缓存的场景
2.动态
(1)roundrobin
默认的调度算法,基于权重的轮询动态调度算法,支持权重的运行时调整,roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调整。
(2)leastconn
当前后端服务器连接最少的优先调度(新客户端连接),比较适合长连接的场景
(3)random
基于随机数作为一致性hash的key,随机负载平衡对于大型服务器场或经常添加或删除服务器非常有用,支持weight的动态调整,weight较大的主机有更大概率获取新请求。