HAProxy代理软件基础学习笔记
基础知识
- HAProxy是使用C语言编写的,提供负载均衡,以及基于TCP和HTTP的应用程序代理。它支持Client-HAProxy,HAProxy-Server的全程SSL链接;
- HAProxy采用单线程事件驱动型非阻塞引擎,支持较大的并发数链接,具有较高的性能和稳定性;多线程或多进程受内存、系统调度、锁的限制,很少能处理数千并发链接。事件驱动型因为有更好的资源和事件管理的用户空间实现所有任务,所以可以处理较大并发数链接。 1
- HAProxy适用于负载大的Web站点,支持数以万计的并发连接,它的运行模式可以简单安全的整合到当前的架构中,使Web服务器不被暴露到网络中;
- HAProxy还提供基于Web的统计信息页面,用于展现健康状态和数据流量;
- HAProxy常见的架构形式如下:2
核心功能
- 负载均衡
- 提供2种负载均衡模式:TCP伪四层和HTTP七层
- 健康检查
- 支持TCP和HTTP两种健康检查模式
- 会话保持
- 对尉氏县会话共享的应用集群,可以通过Insert\Reweite\Prefix Cookie多种Hash方式实现会话保持
- SSL
- 可以解析HTTPS协议,并能够将请求解密为HTTP后后端传输
- 监控与统计
- 提供基于Web的统计信息页面
安装
下载HAProxy压缩包,版本号是1.8.14
将下载的压缩包上传到服务器中,解压 3
1
2
3
4
5
6tar -xzvf haproxy-1.8.14.tar.gz
cd haproxy-1.8.14
uname -r # 获取系统内核版本信息
make TARGET=linux310 ARCH=x86_64 PREFIX=/usr/local/haproxy -j 20
# TRAGET 指定操作系统内核版本 ;ARCH 指定操作系统位数; PREFIX指定安装路径;使用参数-j 可以指定用于编译的线程数目
make install完成安装
准备配置文件
1
2
3
4
5cd /usr/local/haproxy
mkdir conf
cd conf
touch haproxy.cfg # haproxy的配置文件
user add -r -s /bin/nologin haproxy准备启动脚本
1
2
3
4
5
6
7
8
9
10cd ~/haproxy-1.8.14/example
cp haproxy.init /etc/init.d/haproxy
chmod +x haproxy
vi haproxy
# 分别修改HAProxy配置文件目录和sbin目录
HAP_HOME=/usr/local/haproxy
BIN=${HAP_HOME}/sbin
CFG=${HAP_HOME}/conf/${BASENAME}.cfg
# 如果出现“第26行,期待一元表达式”的提示信息,修改NETWORK字段
[ ${NETWORKING}x = "no"x ] && exit 0
配置
- 配置文件分为2大段:全局配置(Global),代理配置(Proxies)
全局配置
- 全局配置建议不做修改,包含的字段有:
- 进程与安全配置相关的参数;
- 性能配置参数;
- Debug配置参数;
- 用户列表参数;
- peers参数;
- Mailers参数
代理配置
- 代理配置又分为3部分,分别是defaults,frontend,backend,listen。
- defaults
- 默认参数的配置,在该部分内配置的参数,会被自动引用到之后的frontend,backend,listen,某些参数属于公用的配置,既可以在defaults中配置,也可以在frontend,backend,listen中配置,两者都配置的以后者为准,defaults中的配置会被覆盖;
- frontend
- 负责配置接受用户请求的虚拟前段节点,类似于nginx配置文件中的server{}字段;
- backend
- 负责配置集群后端服务器集群的配置,用来定义一组真实服务器,用来处理用户发出的请求,类似于nginx配置中的upstream{}字段;
- listen
- 用来配置前段和haproxy后端
- defaults
配置文件5 6
配置日志文件
1
2
3
4
5
6
7
8
9cd /etc/ && cp rsyslog.conf rsyslog.conf.old
vi rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514 ------>启动udp,启动端口后将作为服务器工作
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514 ------>启动tcp监听端口
local2.* /var/log/haproxy.loghaproxy配置文件
1 | global |
- 配置文件部分参数
- ACL
- ACL用于实现基于请求报文的首部、响应保温的内容或其他的环境状态信息来做出转发决策。配置的步骤分为2步,首先定义1个ACL,而后在满足ACL的情况下执行特定的动作。
- ACL语法格式:
acl <aclname> <criterion> [flags] [operator] <value>
- aclname区分大小写
- criterion测试标准
- be_sess_rate用于测试指定的backend上会话常见的速率是否满足指定的条件,常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为
acl being_scanned be_sess_rate gt 50
# 定义一个aclredirect location /error_pages/ednied.html if being_scanned
# 指定满足acl条件,执行的操作
- fe_sess_rate用户测试指定的frontend或当前frontend的会话创建速率是否满足指定的条件
- hdr\<string> 用于测试请求报文中的所有首部或指定首部满足指定的条件。指定首部时,名称不分区大小写,且字符内不能有任何多于的空白字符
- method\<string>用于测试http请求报文中使用的方法
- path_beg \<string>用于测试请求的url是否以指定的模式开头
acl url_static path_beg -i /static /css /images /js
# 测试url中是否以这些字段开头
- path_end \<string> 用于测试请求的url是否以指定的模式结尾
acl url_static path_end -i .jpg .png .css .js
- hdr_beg \<string> 用于测试请求的报文的指定首部的开头部分是否符合指定的模式
- hdr_end\<string>
- be_sess_rate用于测试指定的backend上会话常见的速率是否满足指定的条件,常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为
- flage
- -i 不区分中模式字符的大小写
- -f 从指定的文件中加载模式
- – 标识符的强制结束标记
- value
- 整数或整数范围
- 字符串,支持使用-i忽略大小写,使用\转义字符
- 正则表达式
- ip地址及网络地址
- server参数
- 语法格式
server <name> <address>[:port] [param*]
- name: 服务器内部名称
- address: 服务器的ip地址,也可以使用主机名
- port: 连接请求发往服务器时的目标端口,未指定时,使用客户端请求时的端口
- param服务器设定的参数
- backup: 设定为备用服务器
- check: 启动对服务器的健康检查
- inter \<delay> :设定健康状态检查的时间间隔,单位为毫秒,默认为2000
- rise \<count> : 设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数
- fall \<count>: 去人server从正常状态转为不可用状态需要检查的次数
- 语法格式
- ACL
错误提示
统计页面
参考
- http://blog.51cto.com/11010461/2139872
- https://www.haproxy.org
- http://blog.51cto.com/11010461/2139872
- https://cbonte.github.io/haproxy-dconv/1.8/configuration.html
- https://www.unixmen.com/installing-haproxy-for-load-balancing-on-centos-7/
- https://www.cnblogs.com/pangguoping/p/7647091.html
- http://www.ttlsa.com/linux/haproxy-study-tutorial/