web集群-负载均衡集群-HAproxy

本文详细介绍了HAproxy的编译安装、配置文件结构、负载均衡配置和多种调度算法,包括静态算法如static-rr、first,动态算法如roundrobin、leastconn,以及基于cookie的会话保持和高级功能如IP透传、自定义错误界面。HAproxy支持lua扩展,可用于实现更多功能,如健康检查、报文修改和自定义日志格式。此外,文章还展示了如何通过ACL实现访问控制,以及如何自定义HAProxy的错误页面。
摘要由CSDN通过智能技术生成

简介

HAProxy是使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。
官方站点

功能

支持功能

TCP 和 HTTP反向代理 
SSL/TSL服务器 
可以针对HTTP请求添加cookie,进行路由后端服务器 
可平衡负载至后端服务器,并支持持久连接 
支持所有主服务器故障切换至备用服务器  
支持专用端口实现监控服务 
支持停止接受新连接请求,而不影响现有连接 
可以在双向添加,修改或删除HTTP报文首部 
响应报文压缩 支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息
支持http反向代理 
支持动态程序的反向代理 
支持基于数据库的反向代理

不支持的功能

正向代理--squid,nginx 
缓存代理--varnish 
web服务--nginx、tengine、apache、php、tomcat 
UDP--目前不支持UDP协议 
单机性能--相比LVS性能较差

体系结构

在这里插入图片描述

编译安装

软件包 版本
HAProxy haproxy-2.2.9 社区版
LUA lua-5.4.0

HAProxy源码包下载地址http://www.haproxy.org/download/

HAproxy依赖的Lua环境

HAProxy 支持基于lua实现功能扩展,lua是一种脚本语言,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 官网www.lua.org
Lua 应用场景

游戏开发
独立应用脚本
Web 应用脚本
扩展和数据库插件,如MySQL Proxy
安全系统,如入侵检测系统

Centos 基础环境
参考链接http://www.lua.org/start.htm
CentOS7 自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy,

Lua编译安装

1、安装编译环境与lua
[root@node1 ~]# yum install gcc readline-devel -y
[root@node1 ~]# wget -c http://www.lua.org/ftp/lua-5.4.0.tar.gz

2、进行lua编译
[root@node1 ~]# tar xvf lua-5.4.0.tar.gz -C /usr/local/src/
[root@node1 ~]# cd /usr/local/src/lua-5.4.0/
[root@node1 lua-5.4.0]# make linux test

3、查看lua版本
[root@node1 lua-5.4.0]# src/lua -v
Lua 5.4.0  Copyright (C) 1994-2020 Lua.org, PUC-Rio

HAproxy编译安装

1、HAProxy 2.0以上版本编译参数:本文使用的是社区版2.2.9 
[root@node1 ~]# yum -y install gcc openssl-devel pcre-devel systemd-devel
[root@node1 ~]# wget -c https://www.haproxy.org/download/2.2/src/haproxy-2.2.9.tar.gz
[root@node1 ~]# tar xf haproxy-2.2.9.tar.gz  -C /usr/local/src/

2、安装可以参考/usr/local/src/haproxy-2.2.9/INSTALL文件,文件中要求make>=3.80版本,gcc>=3.4版本
查看make与gcc版本
[root@node1 haproxy-2.2.9]# rpm -q  make 
make-3.82-24.el7.x86_64
[root@node1 haproxy-2.2.9]# rpm -q gcc
gcc-4.8.5-44.el7.x86_64

3、参考INSTALL文件进行编译安装
[root@node1 haproxy-2.2.9]#  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.0/src/ LUA_LIB=/usr/local/src/lua-5.4.0/src/
[root@node1 haproxy-2.2.9]# make install PREFIX=/usr/local/src/haproxy

4、将命令目录连接到/usr/sbin/目录下,可以直接使用haproxy命令
[root@node1 haproxy-2.2.9]# ln -sv /usr/local/src/haproxy/sbin/haproxy /usr/sbin/
"/usr/sbin/haproxy" -> "/usr/local/src/haproxy/sbin/haproxy"

5、查看haproxy版本
[root@node1 haproxy-2.2.9]# haproxy -v
HA-Proxy version 2.2.9-a947cc2 2021/02/06 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2025.
Known bugs: http://www.haproxy.org/bugs/bugs-2.2.9.html
Running on: Linux 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64


haproxy -V 	  查看参数
haproxy -vv   可查看编译中的选项
haproxy -v	  

HAProxy启动脚本

[root@node1 ~]# vim /usr/lib/systemd/system/haproxy.service
 [Unit] 
 Description=HAProxy Load Balancer 
 After=syslog.target network.target 
 
 [Service] 
 ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q 
 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

HAProxy配置文件

global    #全局配置参数
        maxconn 100000          #最大连接数
        chroot /usr/local/src/haproxy   #haproxy连接目录
        stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin  #套接字
        #uid 99 
        #gid 99 
        user haproxy  #用户
        group haproxy #组
        daemon 		#守护进程的方式
        #nbproc 1 	
        #cpu-map 1 0 
        #cpu-map 2 1 
        #cpu-map 3 2 
        #cpu-map 4 3 
        pidfile /var/lib/haproxy/haproxy.pid #pid文件
        log 127.0.0.1 local2 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  #绑定本地所有IP地址的9999端口
        stats enable	
        log global     #全局日志记录
        stats uri /haproxy-status
        stats auth haadmin:123456  #认证:用户名:密码

[root@node1 ~]# mkdir /var/lib/haproxy
[root@node1 ~]# useradd -r -s /sbin/nologin -d /var/lib/haproxy haproxy
[root@node1 ~]# systemctl start haproxy

查看haproxy的状态页面

浏览器访问: http://192.168.16.11:9999/haproxy-status
登录用户名密码访问,用户名密码在配置文件中 listen stats字段中已设置
在这里插入图片描述
HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是globalproxies部分

global:全局配置段

进程及安全配置相关的参数 
性能调整相关参数
Debug参数

官方文档 global配置说明http://cbonte.github.io/haproxy-dconv/2.2/configuration.html#3

1、global 配置部分参数说明:

chroot 						#锁定运行目录 
deamon 						#以守护进程运行 
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin process 1 
							#socket文件 
user, group, uid, gid 		#运行haproxy的用户身份 
nbproc n 					#开启的haproxy work 进程数,默认进程数是一个 
#nbthread 1 				#指定每个haproxy进程开启的线程数,默认为每个进程一个线程,和nbproc互斥(版本有关) 

如果同时启用nbproc和nbthread 会出现以下日志的错误,无法启动服务 
#Apr 7 14:46:23 haproxy haproxy: [ALERT] 097/144623 (1454) : config : cannot enable multiple processes if multiple threads are configured. Please use either nbproc or nbthread but not both. 

cpu-map 1 0 				#绑定haproxy 进程至指定CPU,将第一个work进程绑定至0号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协议,最多可以定义两个
2、多进程和线程配置
1、编辑配置文件中的global字段
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg 
 global
        maxconn 100000
        chroot /usr/local/src/haproxy
        stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1   #守护进程1
        stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2   #守护进程2
        #uid 99 
        #gid 99 
        user haproxy
        group haproxy
        daemon
        nbproc 2   			#开启的haproxy work 进程数为 2
        #cpu-map 1 0 
        #cpu-map 2 1 
        #cpu-map 3 2 
        #cpu-map 4 3 
        pidfile /var/lib/haproxy/haproxy.pid
        log 127.0.0.1 local2 info

2、重启服务
[root@node1 ~]# systemctl restart haproxy.servic
3、HaProxy日志配置
#在global配置项定义: 
global
	log 127.0.0.1 local2 info 		#基于syslog记录日志到指定设备,级别有(err、warning、 info、debug)

listen web_port 
	bind 127.0.0.1:80 
	mode http 
	log global 						#开启当前web_port的日志功能,默认不记录日志 
	server web1 127.0.0.1:8080 check inter 3000 fall 2 rise

[root@node1 ~]# vim /etc/rsyslog.conf 
$ModLoad imudp
$UDPServerRun 514
# Save boot messages also to haproxy.log
local2.*                                                /var/log/haproxy.log

重启日志服务
[root@node1 ~]# systemctl restart rsyslog.service 

proxies:代理配置段

defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {} 
backend:后端,相当于nginx中的upstream {} 
listen:同时拥有前端和后端配置

官方文档proxies配置说明http://cbonte.github.io/haproxy-dconv/2.2/configuration.html#4

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配置更简 洁,生产常用

注意:name字段只能使用大小写字母,数字,‘-(dash),’_‘(underscore),’.(dot)和 ‘:'(colon),并且严格区分大小写
1、 Proxies配置-defaults
配置参数:
option redispatch 					#当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose 				#当服务器负载很高时,自动结束掉当前队列处理比较久的链接,针对业务情 况选择开启 
option http-keep-alive 				#开启与客户端的会话保持 
option forwardfor 					#透传客户端真实IP至后端web服务器 
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 	#指定后端服务器的默认设置
2、Proxies配置-frontend
配置参数:
bind: #指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中 

#格式: 
bind [<address>]:<port_range> [, ...] [param*] 

注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值