HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性、自动故障切换、支持正则表达式及web状态统计。

    HAProxy在编译安装时需要用到lua,并且lua的最低版本要求为5.3。目前CentOS8系列通过yum安装lua是符合版本要求的,而CentOS7及之前版本的Linux系统则无法达到该要求,因此要使用CentOS7或之前版本的Linux系统进行编译安装HAProxy,必须先编译安装较新版本的lua环境。

编译安装HAProxy2.4.17_编译安装

编译安装HAProxy2.4.17_配置文件_02


  1. 编译安装lua5.4.4

1.1 安装依赖包

    lua在编译安装时需要用到gcc和readline-devel这两个依赖包。

编译安装HAProxy2.4.17_haproxy_03

1.2 编译安装lua

    lua源码包可通过官网下载(下载选择界面:http://www.lua.org/download.html,目前已更新到5.4.4版本,并且最新版已经上线超过4个月,笔者就直接使用最新版进行编译安装。lua的编译安装相对比较简单,在下载界面的右侧也说明了如何下载及编译安装等,直接按照对应版本的步骤操作即可。

编译安装HAProxy2.4.17_lua_04

编译安装HAProxy2.4.17_编译安装_05

    编译安装完毕,可以看到lua程序文件在已解压的目录下的src子目录中,需记好该目录位置,后面编译安装HAProxy时要用到。

编译安装HAProxy2.4.17_lua_06


  1. 编译安装HAProxy2.4.17

2.1 安装依赖包

    HAProxy编译安装所需依赖包包括gcc、openssl-devel、pcre-devel和systemd-devel。

编译安装HAProxy2.4.17_lua_07

2.2 获取源码包

    HAProxy源码包通过HAProxy官网获取(官网首页下载界面:https://www.haproxy.org/,目前已更新到2.6主版本。HAProxy在下载时推荐选择主版本为偶数的,考虑到稳定性,笔者下载的是2.4.17版本。

编译安装HAProxy2.4.17_配置文件_08

2.3 编译安装HAProxy2.4.17

    将HAProxy解压至指定文件后,进入该解压目录,可以看到目录下已经有Makefile文件,因此不要执行传统的configure脚本来生成该文件,直接利用make加参数来进行编译,编译时需要填写已编译安装的lua存放目录。

编译安装HAProxy2.4.17_lua_09

    编译完成后,我们可以看到目录下已经生成了HAProxy的二进制程序,接下来就是执行make install+指定程序安装位置命令来进行安装(注意PREFIX要使用大写)。

编译安装HAProxy2.4.17_编译安装_10

    同Nginx服务的编译安装相同,为了使用方便,建议针对HAProxy的路径创建软链接,此时直接执行haproxy -v命令已经能查看到版本信息等。

编译安装HAProxy2.4.17_haproxy_11

2.4 创建启动脚本文件和配置文件

    HAProxy启动脚本文件可以参考通过yum安装的该服务来写,Unit部分是通用说明,ExecStartPre部分是检查看语法是否有误,ExecStart部分是支持systemd方式,默认的LimitNOFILE值是1024,可以调大点。启动脚本文件创建完毕后,即可加载服务。

编译安装HAProxy2.4.17_haproxy_12

    由于启动脚本文件中设置的配置文件和PID文件存放路径并不存在,所以还需手动创建,同时可参考yum安装的HAProxy配置文件来写一个简化版的配置文件。与Nginx和Apache等服务相同,建议创建一个同名账号来管理服务。

编译安装HAProxy2.4.17_lua_13

编译安装HAProxy2.4.17_lua_14

    配置文件内容说明:

    ①global为全局配置项,其中:maxconn表示每个haproxy进程的最大并发连接数;chroot是锁定运行目录/apps/haproxy;stats socket设置套接字文件的权限和对应进程等;user、group或uid、gid可以设置运行haproxy的用户身份;deamon表示以守护进程运行在后台;nbproc可以设置开启的haproxy worker进程数,默认进程数是一个;cpu-map可以绑定haproxy worker进程至指定CPU,进程从1开始算,CPU核心从0开始算;pidfile可以指定pid文件路径;log 127.0.0.1 local2 info部分定义全局的syslog服务器,日志服务器需要开启UDP协议,最多可以定义两个。

    ②defaults为默认配置项,针对frontend、backend和listen生效,可以有多个name也可以没有name,其中:option http-keep-alive开启与客户端的会话保持;option forwardfor可以透传客户端真实IP至后端web服务器;maxconn部分也是表示每个haproxy进程的最大并发连接数;mode可以设置默认工作类型,2.4主版本包括http和tcp两项选择,使用TCP服务器性能更好,可以减少压力;timeout connect部分可以设置客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单位ms;timeout client部分可以设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同;timeout server部分可以设置客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如果超时会出现502错误,此值建议设置较大些,访止502错误。

    ③使用listen替换frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用。listen后面通常跟的就是业务名称,因为笔者是在单台虚拟机上做实验,就只做一个状态页,以及将服务监听在本机的80端口,如果后端有真实服务器,可以将127.0.0.1:8080改为真实服务器的ip和对应端口号;check部分表示做健康性检查,后面可以跟上更详细的设置来做真实服务器的上线和下线检查。

2.5 启动并验证

    以上步骤完成后,使用systemctl命令开启服务后,查看状态已显示running。同时我们也可在浏览器中查看,配置文件设置的状态页是ip+端口+URI方式,并且需要使用账号和密*码,输入完毕后即可登录查看(因笔者未在本机安装http服务并将端口改为8080,故浏览器中查看时,web_port部分显示的是DOWN)

编译安装HAProxy2.4.17_lua_15

编译安装HAProxy2.4.17_配置文件_16

编译安装HAProxy2.4.17_haproxy_17

2.6 使用子配置文件保存设置

    当业务众多时,将所有配置都放在一个配置文件中会造成维护困难,可以考虑按业务分类将配置信息拆分,放在不同的子配置文件中,从而达到方便维护的目的。

    例如我们可以在/etc/haproxy目录下创建一个conf.d目录来专门存放各种HAProxy服务的子配置文件,将之前在主配置文件中的“listen web_port”部分填写到子配置文件test.cfg中(必须是.cfg后缀),并删除原主配置文件中相应内容。

编译安装HAProxy2.4.17_haproxy_18

    同时在service文件中添加该子配置文件的路径信息,加载服务后重启HAProxy即可。

编译安装HAProxy2.4.17_配置文件_19

编译安装HAProxy2.4.17_配置文件_20