HAProxy基础
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HAProxy基础相关的知识,希望对你有一定的参考价值。
HAProxy基础HAProxy是法国开发者Willy Tarreau 开发的一个开源然教案,是一款具备高并发、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。
HAProxy功能
HAProxy是TCP/HTTP反向代理服务器,尤其适合于高可用性高并发环境
可以针对HTTP请求添加cookie,进行路由后端服务器。
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至别用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双线给添加,修改或删除http报文首部
支持基于partten实现连接请求的访问控制
通过特定的uri为授权用户提供详细的状态信息
HAProxy的安装
yum安装
直接使用yum进行安装
[[email protected] ~]# yum install haproxy -y
编译安装HAProxy
1.解压源码包
[[email protected] ~]# tar xf haproxy-1.8.20.tar.gz
2.编译模块
[[email protected] haproxy-1.8.20]# make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy
3.复制模块到指定目录
[[email protected] haproxy-1.8.20]# make install PREFIX=/usr/local/haproxy
4.将二进制程序复制到相二进制程序目录
[[email protected] haproxy-1.8.20]# cp haproxy /usr/sbin/
5.为编译安装的HAProxy创建启动脚本
[[email protected] haproxy-1.8.20]# vim /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxyLoad Balancer
After=syslog.targetnetwork.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
6.创建配置文件目录,生成配置文件
[[email protected] haproxy-1.8.20]# mkdir /etc/haproxy
[[email protected] haproxy-1.8.20]# vim /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
nbproc 4
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:q1w2e3r4ys
listen web_port
bind 0.0.0.0:80
mode http
log global
server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5
7.为pid文件创建一个目录
[[email protected] ~]# mkdir /usr/local/haproxy/run
8.启动服务
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl start haproxy
haproxy简单使用
使用frontend/backend配置服务器
1.修改配置文件
[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
frontend web
bind 172.20.27.20:80 #监听地址和端口
use_backend web_host
backend web_host
server web1 172.20.27.31:80 #定义后端的服务器
server web2 172.20.27.32:80
2.重启服务
[[email protected] ~]# systemctl restart haproxy
3.测试访问
[[email protected] ~]# curl 172.20.27.20
server 1
[[email protected] ~]# curl 172.20.27.20
server 2
使用listen来配置服务器
1.修改配置文件
[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
listen web
bind 172.20.27.21:80 #定义监听的地址和端口
server web1 172.20.27.31:80 #定义后端服务器
server web2 172.20.27.32:80
2.重启服务器
[[email protected] ~]# systemctl restart haproxy
3.测试
[[email protected] ~]# curl 172.20.27.21
server 1
[[email protected] ~]# curl 172.20.27.21
server 2
HAProxy组成
HAProxy有2个配置段组成,global全局配置段,proxies代理配置段
global配置参数:
1.chroot
用来锁定用户的目录,用来限制被人拿到haporxy账号时登录后跳转到其他目录,此项为安全选项。
示例:
chroot /usr/local/haproxy #将其限制在/usr/local/haproxy目录下
2.maxconn
单个进程城的最大连接数
示例:
maxconn 100000 #每个haproxy进程的最大并发连接数,有些时候设置65535
3.stats socket
示例
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #haproxy运行时的socket文件,在本机操作时使用
4.user, group, uid, gid
工作进程的uid,gid,user,group默认为99,nobody用户,也可以对其进行修改
示例:
创建haproxy用户
[[email protected] ~]# useradd -s /sbin/nologin haproxy
[[email protected] ~]# id haproxy
uid=1001(haproxy) gid=1001(haproxy) groups=1001(haproxy)
修改配置文件
[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
uid 1001
gid 1001
查看进程用户
[[email protected] ~]# ps -ef | grep haproxy
root 20178 1 0 20:41 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20182
haproxy 20309 20178 0 21:15 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20182
5.nbprox和cpu-map
nbproc为开启haproxy多线程,最好开启和cpu核心相同的进程数,1.8以上功能
cpu-map为cpu的亲缘性绑定,将进程绑定在固定的cpu核心上。
示例:
配置4个进程,并绑定cpu
daemon
nbproc 4 #启动4个进程
cpu-map 1 0 #第一个进程绑定在0号cpu核心上
cpu-map 2 1 #cpu的核心是从0开始计数
cpu-map 3 2
cpu-map 4 3
重启服务
[[email protected] ~]# systemctl reload haproxy
[[email protected] ~]# ps -ef | grep haproxy
root 20178 1 0 20:41 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309
haproxy 20417 20178 0 21:26 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309
haproxy 20418 20178 0 21:26 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309
haproxy 20419 20178 0 21:26 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309
haproxy 20420 20178 0 21:26 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309
6.ngthread
指定每个haproxy进程开启的线程数,默认一个进程只有一个线程,1.8版本支持
示例:
nbthread 1
重读配置文件
[[email protected] ~]# systemctl reload haproxy
7.log
将日志发送到某个地址来进行收集
示例:
修改日志配置文件
[[email protected] ~]# vim /etc/rsyslog.conf
$UDPServerRun 514
local3.* /var/log/haproxy.log #此处改为和配置文件相同的格式
重启服务
[[email protected] ~]# systemctl restart rsyslog
[[email protected] ~]# systemctl restart haproxy
8.spread-checks
当后台有多台服务器时,对其错开进行tcp探测,防止同一时间tcp连接过大,官方给定值2-5
spread-checks 5
9.deamon
以守护进程运行
daemon
10.pidfile
指定pid文件路径
配置文件中pid路径和启动脚本中的pid路径必须相同
[[email protected] run]# vim /etc/haproxy/haproxy.cfg
pidfile /usr/local/haproxy/run/haproxy.pid
[[email protected] run]# vim /lib/systemd/system/haproxy.service
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid
11.maxsslconn
SSL每个haproxy进程ssl最大连接数
12.maxconnrate
每个进程每秒最大连接数
proxies配置
defaults [name]
默认配置项,针对以下的frontend、backend和lsiten生效,可以多个name
option redispatch
#当serverID对应的服务器挂掉后,强制定向到其他健康的服务器(建议配置)
option abortonclose
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接(建议配置)
option forwardfor
#将客户端地址透传到后端服务器(建议配置)
option http-keep-alive
#开启会话保持机制(建议开启)
mode tcp|http
#工作在哪种模式下,默认工作在tcp模式
timeout connect 60s
#转发客户端请求到后端server的最长链接时长。
#用户的请求发送到后端服务器60s后没有相应就报错,这是在建立tcp连接之前
timeout server 600s
#转发客户端请求到后端服务端的超时时长。
#用户的请求已经被转发到后端服务器,但后端服务器600s内没有给HAProxy返回数据就告诉用户服务器挂了,此数值需要设置的长一点,要留给后端服务器足够的时间去做各种操作,这是在已经建立起tcp连接之后。
timeout client 600s
#与客户端的最长空闲时间。
#当用户访问HAProxy后,在之后的600s内再次访问就无需再次建立tcp连接
timeout http-keep-alive 120s
#session会话保持超时时间,范围内会转发到后端服务器。
#表示用户在120s内发起的请求会转发给后端同一台服务器,超过120s就重新调度
timeoutcheck 5s
#对后端服务器的检测超时时长。
#haproxy对后端服务器发起检测如果5秒内没有数据返回,表示第一次检测失败
以上为默认配置选项,当默认配置选项和frontend/backend或listen中定义的有冲突时,以frontend/backend或listen中定义的为主
示例:
defaults配置段
defaults
option redispatch
option abortonclose
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
定义前端server和后端服务器组
frontend/backend
frontend [name]:前端servername,类似于nginx的一个虚拟主机 server。
backend [name]:后端服务器组,等于nginx的upstream
示例:
配置一个负载均衡
frontend web
bind 192.168.27.21:80
use_backend web_server
backend web_server
server 192.168.27.31:80
server 192.168.27.32:80
测试
[[email protected] ~]# curl 192.168.27.21
server 1
[[email protected] ~]# curl 192.168.27.21
server 2
以上的配置方法也可以使用listen来实现更加便捷
listen
listen [name]:将frontend和backend合并在一起配置
listen web
bind 192.168.27.21:80
server web1 192.168.27.31:80
server web2 192.168.27.32:80
测试
[[email protected] ~]# curl 192.168.27.21
server 1
[[email protected] ~]# curl 192.168.27.21
server 2
后端服务器的状态监测相关配置
可以在后端的服务器定义后使用check然后更上各种选项参数
相关的选项参数
addr IP
#可以指定健康状态监测IP
port NUM
#指定健康状态检测端口
inter NUM
#指定健康状态监测间隔的时间,默认为2000ms
fall NUM
#后端服务器失效的检查次数,默认为3。当3次监测都失败时服务器将从后端列表中摘去,请求将不再调度到此服务器
rise NUM
#后端服务器从下线到恢复上线的检查次数,默认为2。当对已经下线的服务器进行2次检测都正常时,haproxy将再次将用户的请求调度到此服务器上
weight
#权重,默认为1,最大256,0表示不参与负载均衡
backup
#将后端服务器标注为备份状态,当为备份状态时,HAProxy不会请求调度到此服务器,只有当之前的所有服务器都挂了的时候才会调度过来
disabled
#将后端的服务器标记为不可用
redirect prefix http://www.mylinuxops.com
#将请求临时重定向至其他url,只适用于http模式
maxconn NUM
#设定当前后端server的最大并发连接数(一般不设置,或设置1000-2000左右)
backlog NUM
#当server的连接数达到上线后的后援队列长度(一般不设置)
示例:
配置HAProxy做健康状态检测
listen web
bind 192.168.27.21:80
server web1 192.168.27.31:80 check inter 3s fall 3 rise 5
server web2 192.168.27.32:80 check inter 3s fall 3 rise 5
测试
[[email protected] ~]# curl 192.168.27.21
server 1
[[email protected]t ~]# curl 192.168.27.21
server 2
当server1挂了之后,等待一段时间再次检测
[[email protected] ~]# curl 192.168.27.21
server 2
[[email protected] ~]# curl 192.168.27.21
server 2
当server1再次启动以后,等待一段时间再次检测
[[email protected] ~]# curl 192.168.27.21
server 1
[[email protected] ~]# curl 192.168.27.21
server 2
示例:
检测后端端口,有些时候后端服务器是nginx,而nginx上又有跑了php应用,此时就会用来检查后端的9000端口,避免php挂了,还在向后端转发请求的情况
listen web
bind 192.168.27.21:80
server web1 192.168.27.31:80 port 9000 check inter 3s fall 3 rise 5
server web2 192.168.27.32:80 port 9000 check inter 3s fall 3 rise 5
示例:
设定权重,server1为2,server2为1
listen web
bind 192.168.27.21:80
server web1 192.168.27.31:80 weight 2 check inter 3s fall 3 rise 5
server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5
测试
[[email protected] ~]# curl 192.168.27.21
server 1
[[email protected] ~]# curl 192.168.27.21
server 1
[[email protected] ~]# curl 192.168.27.21
server 2
示例:
将server1设置为备用,此时请求将不再发送给server1
listen web
mode tcp
bind 192.168.27.21:80
server web1 192.168.27.31:80 weight 2 check inter 3s fall 3 rise 5 backup
server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5
测试
请求只发给server2
[[email protected] ~]# curl 192.168.27.21
server 2
[[email protected] ~]# curl 192.168.27.21
server 2
[[email protected] ~]# curl 192.168.27.21
server 2
当server2挂了之后,backup的启用。
[[email protected] ~]# curl 192.168.27.21
server 1
[[email protected] ~]# curl 192.168.27.21
server 1
[[email protected] ~]# curl 192.168.27.21
server 1
示例:
将server2标记为disabled
listen web
mode tcp
bind 192.168.27.21:80
server web1 192.168.27.31:80 weight 2 check inter 3s fall 3 rise 5
server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5 disabled
测试
[[email protected] ~]# curl 192.168.27.21
server 1
[[email protected] ~]# curl 192.168.27.21
server 1
#请求只发给server 1
示例:
将请求临时重定向至其他URL
listen web
mode http
bind 192.168.27.21:80
redirect prefix http://www.mylinuxops.com/
# server web1 192.168.27.31:80 weight 2 check inter 3s fall 3 rise 5
# server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5 disabled
测试
[[email protected] ~]# curl -L 192.168.27.21
www.mylinuxops.com
使用haproxy做4层负载,区分80和443的配置方法
# http入口
listen web_http
mode http
bind 192.168.27.21:80
server web1 192.168.27.31:80 weight 2 check inter 3s fall 3 rise 5
server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5
# https入口
listen web_https
mode tcp
bind 192.168.27.21:443
server web1 192.168.27.31:443 weight 2 check inter 3s fall 3 rise 5
server web2 192.168.27.31:443 weight 1 check inter 3s fall 3 rise 5
重启后查看监听端口
[[email protected] ~]# systemctl restart haproxy
[[email protected] ~]# ss -tnl | grep 192.168.27.21
LISTEN 0 128 192.168.27.21:80 *:*
LISTEN 0 128 192.168.27.21:443 *:*
以上是关于HAProxy基础的主要内容,如果未能解决你的问题,请参考以下文章