[转帖]haproxy
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动**, **单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。
3|0负载均衡
3|1二层负载均衡(mac)
用于虚拟mac地址方式,外部对虚拟mac地址请求,负载均衡接收后分配给后端实际的mac地址响应。
3|2三层负载均衡(ip)
一般用于虚拟ip地址的方式,外部对虚拟ip地址请求,负载均衡接收后分配给后端实际的ip地址响应。
3|3四层负载均衡(tcp)
在三层负载均衡的基础上,用ip+port接收请求,在转发到对应的机器上。
产品大概有:F5,lvs,nginx,haproxy......
3|4七层负载均衡(http)
根据虚拟的url或者ip,主机名接收请求,在转发到相应的处理服务器上。
产品大概有:haproxy,nginx,apache,mysql proxy......
4|0haproxy安装
4|1Yum安装
4|2源码安装
haproxy官方帮助文档:https://cbonte.github.io/haproxy-dconv/
下载安装包
haproxy源码包下载网站地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
使用xftp传到本机

解压并安装
5|0配置各个负载的内核
6|0提供配置文件
6|1总体介绍
haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen
- global: 全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关。
- default: 配置默认参数,这些参数可以被用到frontend,backend,Listen组件。
- frontend:接收请求的前端虚拟节点,frontend可以指定具体使用后端的backend。
- backend : 后端服务集群的配置,真实服务器,一个backend对应一个或者多个实体服务器。
- listen: fronted和backend的组合体,比如haproxy实例状态监控部分配置。Haproxy1.3之前的唯一配置方式。
6|2时间格式
一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀
us: 微秒(microseconds),即1/1000000秒;ms: 毫秒(milliseconds),即1/1000秒;s: 秒(seconds);m: 分钟(minutes);h:小时(hours);d: 天(days);
6|3global配置
通常主要定义全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关。
- log:全局的日志配置,local0是日志输出设置,info表示日志级别(err,waning,info,debug);
- maxconn:设定每个HAProxy进程可接受的最大并发连接数,此选项等同于linux命令选项”ulimit -n”;
- chroot:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
- daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
- nbproc:指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
- pidfile:将haproxy的进程写入pid文件;
- ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;
6|4defaults配置
用于设置配置默认参数,这些参数可以被用到frontend,backend,listen组件。
在此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中。如果某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参数,defaults部分参数对应的值自动被覆盖。
mode http:设置haproxy的运行模式,有三种{http|tcp|health}。注意:如果haproxy中还要使用4层的应用(mode tcp)的话,不建议在此定义haproxy的运行模式。
- tcp模式:在此模式下,客户端和服务器端之前将建立一个全双工的连接,不会对七层报文做任何检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。
- http模式:在此模式下,客户端请求在转发至后端服务器之前将会被深度分板,所有不与RFC格式兼容的请求都会被拒绝。
- health:已基本不用了。
log global:设置日志继承全局配置段的设置。
option httplog:表示开始打开记录http请求的日志功能。
option dontlognull:如果产生了一个空连接,那这个空连接的日志将不会记录。
option http-server-close:打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录。
retries 3:向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用。
option abortonclose:当haproxy负载很高时,自动结束掉当前队列处理比较久的链接。
timout http-request 10s:客户端发送http请求的超时时间。
timeout queue 1m:当上游服务器在高负载响应haproxy时,会把haproxy发送来的请求放进一个队列中。timeout queue定义放入这个队列的超时时间。
timeout connect 5s:haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间。
timeout client 1m:定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间。
timeout server 1m:定义haproxy与上游服务器非活动连接的超时时间。
timeout http-keep-alive 10s:设置新的http请求连接建立的最大超时时间,时间较短时可以尽快释放出资源,节约资源。
timeout check 10s:健康检测的时间的最大超时时间。
maxconn 3000:最大并发连接数。
contimeout 5000:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容。
clitimeout 3000:设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容。
srvtimeout 3000:设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容。
6|5frontend配置
frontend是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。forntend可以根据ACL规则直接指定要使用的后端backend。
- frontend http_80_in:定义一个名为http_80_in的frontend。
- bind 0.0.0.0:80:定义haproxy前端部分监听的端口。
- mode http:定义为http模式。
- log global:继承global中log的定义。
- option forwardfor:使后端server获取到客户端的真实IP。
6|6backend配置
用来定义后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器。
6|7listen配置
常常用于状态页面监控,以及后端server检查,是Fronted和backend的组合体。
7|0启动haproxy
8|0启动日志
- HAproxy在默认情况不会记录日志
- 不仅要在haproxy.conf中配置日志输出
- 还需要修改系统日志的配置文件
修改haproxy.conf
在haproxy.conf文件中增加如下日志配置,
defaults下面增加日志相关的配置:
log global
option httplog
log 127.0.0.1 local7
日志的级别为local0~local7,
另外16~23保留为本地使用:
| 级别 | 代码 | 描述 |
|---|---|---|
| energ | 0 | 系统不可用 |
| alert | 1 | 必须马上采取行动的事件 |
| crit | 2 | 关键的事件 |
| err | 3 | 错误事件 |
| warning | 4 | 警告事件 |
| notice | 5 | 普通但重要的事件 |
| info | 6 | 有用的信息 |
| debug | 7 | 调试信息 |
修改系统日志配置
vim /etc/rsyslog.conf
指定日志文件haproxy.log保存的位置,
haproxy.log会自动生成:
$UDPServerRun 514
local7.* /root/haproxy/log/haproxy.log
由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听。
配置rsyslog的主配置文件,开启远程日志
SYSLOGD_OPTIONS="-r -m 0 -c 2"
参数说明:
#-m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能
#-c 2 使用兼容模式,默认是 -c 5
重启rsyslog服务
重启haproxy服务
kill -9 PID
haproxy -f /usr/local/haproxy/conf/haproxy.cfg
[转帖]haproxy的更多相关文章
- [转帖]HAProxy 7层 负载均衡
HAProxy 7层 负载均衡 https://www.cnblogs.com/jicki/p/5546902.html HAProxy 系统 CentOS 5.8 x64 wget http://h ...
- haproxy有关session的问题
在实验的时候遇到一个问题就是当我登录网站的时候,然后我再刷新一下,用户的状态就退出了 我现在的框架是这样的,前面有一台haproxy作为反向代理,后面有两台服务器跑的是java应用.后面两台服务器做的 ...
- [笔记]HAproxy reload config file with uninterrupt session
HAProxy is a high performance load balancer. It is very light-weight, and free, making it a great op ...
- [原]HAproxy 代理技术原理探究
HAproxy 技术分享 简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 ...
- 利用HAProxy代理SQL Server的AlwaysOn辅助副本
利用HAProxy代理SQL Server的AlwaysOn辅助副本 公司最近数据库升级到SQL Server2014 ,并部署了alwayson高可用集群 机房内有三套程序需要读取数据库 第一套:主 ...
- Mysql的Haproxy反向代理和负载均衡
HaProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.应用到Haproxy主要是因为他免费,并且基于TCP和HTTP的应用代理. ...
- HAProxy介绍
简单说明 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需 ...
- 对比Haproxy和Nginx负载均衡效果
为了对比Hproxy和Nginx负载均衡的效果,分别在测试机上(以下实验都是在单机上测试的,即负载机器和后端机器都在一台机器上)做了这两个负载均衡环境,并各自抓包分析.下面说下这两种负载均衡环境下抓包 ...
- haproxy windows环境使用
haproxy下载:http://pan.baidu.com/s/1miEvQUc 测试环境说明: ip地址 作用 开放端口 备注 nbproc 1 daemon defaults mode tcp ...
- haproxy利用ACL规则封禁自定义IP地址拒绝访问
现在有一个需求就是在发版的时候希望除公司IP外的外网访问服务的时候都是拒绝访问的 现在利用haproxy 的acl规则作出限制 errorfile 403 /etc/haproxy/err ...
随机推荐
- java集合迭代器(Iterator)
1:什么是迭代器(Iterator): 在java中有很多存储数据的容器比如:(ArrayLIst,HashSet.....)每个容器都有自己的特点 因为内部结构不一样所以为了能对容器内元素的操作更简 ...
- android ProgressBar样式
实现进度条由浅黄(#ffff33)到深黄色(#ff6600)的渐变样式. 与进度条自动从0加载到99,进度条每次加1 android:max:进度条的最大值. android:progressDraw ...
- [ACTF2020 新生赛]Exec 1
[ACTF2020 新生赛]Exec 1 审题 发现题目有ping功能,猜测是命令执行漏洞. 知识点 linux系统命令 解题 先ping127.0.0.1,观察是否正常执行. 发现正常后执行ls / ...
- 云图说 | 分布式缓存服务DCS—站在开源Redis前辈的肩膀上,扬帆起航
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:DCS基于开源Re ...
- Go语言逆向技术:常量字符串
摘要:Go语言源代码编译成二进制文件后,源代码中的字符串存放在哪里?是如何组织的? 本文分享自华为云社区<go语言逆向技术之---常量字符串解密>,作者:安全技术猿. Go语言源代码编译成 ...
- 如何构建面向海量数据、高实时要求的企业级OLAP数据引擎?
在字节跳动各产品线飞速成长的过程中,对数据分析能力也提出了更高的要求,现有的主流数据分析产品都没办法完全满足业务要求.因此,字节跳动在ClickHouse引擎基础上重构了技术架构,实现了云原生环境的部 ...
- Intelij IDEA 隐藏 .idea
如图 这两文件夹是 IDEA 自动生成的,在开发过程中用不到它.可以把它隐藏(不在 IDEA中显示),操作如下: OK后,立即生效
- JAVA SQLServerException: 通过端口 1433 连接到主机 127.0.0.1 的 TCP/IP 连接失败
[2021-01-15 13:20:14.623] ERROR [Druid-ConnectionPool-Create-497208183] DruidDataSource.java:2471 - ...
- MappedByteBuffer 写文件
MappedByteBuffer中"put"和"force"的区别是什么 put()将数据存储在缓冲区中,force()通知操作系统将缓冲区刷新到磁盘. put ...
- 多种方式实现 Future 回调返回结果
JDK 实现 public class FutureTest { public static void main(String[] args) throws Exception { Executor ...