admin 管理员组文章数量: 887053
2024年1月17日发(作者:平面设计网页设计)
HAProxy用法详解 全网最详细中文文档原文一、HAProxy简介(1)HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。(2)HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。(3)HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attackbots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。(4)HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。性能HAProxy借助于OS上几种常见的技术来实现性能的最大化。1,单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。2,O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。3,在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;4,借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copyforwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);5,内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;6,树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
7,优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;8,精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。HAProxy目前主要有三个版本: 1.3 , 1.4 ,1.5,CentOS6.6 自带的RPM包为 1.5 的。二,安装配置HAProxy以下实验环境均为CentOS6.6 i686平台。1,安装haproxy[root@LB ~]# yum install -y haproxy #直接使用RPM来安装[root@LB ~]# rpm -qi haproxy #版本为1.5.4Name : haproxy Relocations: (not relocatable)Version : 1.5.4 Vendor: CentOSRelease : 6 Build Date: Thu 23 Jul 2015 04:26:35 PM PDTInstall Date: Sat 29 Aug 2015 06:49:30 PM PDT Build Host: up : System Environment/Daemons Source RPM: e : 2542578 License: GPLv2+Signature : RSA/SHA1, Fri 24 Jul 2015 01:39:18 PM PDT, Key ID 0946fca2c105b9dePackager : CentOS BuildSystem <>URL : /Summary : HAProxy is a TCP/HTTP reverse proxy for high availability environments[root@LB ~]# rpm -ql haproxy/etc/haproxy/etc/haproxy/ ---------->配置文件/etc/logrotate.d/haproxy/etc/rc.d/init.d/haproxy/etc/sysconfig/haproxy/usr/bin/halog/usr/bin/iprange/usr/sbin/haproxy
[root@LB ~]# cd /etc/haproxy/2,详解配置文件haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen。2.1 配置文件格式HAProxy的配置处理3类来主要参数来源:——最优先处理的命令行参数;——“global”配置段,用于设定全局配置参数;——proxy相关配置段,如“defaults”、“listen”、“frontend”和“backend”;2.2 时间格式一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀。us: 微秒(microseconds),即1/1000000秒;ms: 毫秒(milliseconds),即1/1000秒;s: 秒(seconds);m: 分钟(minutes);h:小时(hours);d: 天(days);2.3 全局配置* 进程管理及安全相关的参数– chroot
鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;– pidfile:– uid:以指定的UID身份运行haproxy进程;– ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;Linux默认单进程打开文件数为1024个– user:同uid,但使用的是用户名;– stats:用户访问统计数据的接口– node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;– description:当前实例的描述信息;* 性能调整相关的参数– maxconn
– ept
2.4 代理代理相关的配置可以如下配置段中。– defaults
得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;1,对原地址hash,第一次调度时使用WLCsource:IP层,位于同一个NAT服务器背后的多个请求都会定向至同一个upstream server,不利于负载均衡,一般只有不支持使用cookie插入又需要保持会话时使用cookie:应用层,有更好的负载均衡效果;2,hash/weight%ip :除以权重取模3.15 uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;3.16 url_param:通过
而且只有管理有权限指定绑定的物理接口;3.3 modemode { tcp|http|health }设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工作于同一种模式(一般说来都是HTTP模式),否则将无法启动实例。tcp:实例运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查;通常用于SSL、SSH、SMTP等应用;http:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝;此为默认模式;health:实例工作于health模式,其对入站请求仅响应“OK”信息并关闭连接,且不会记录任何日志信息;此模式将用于响应外部组件的健康状态检查请求;目前来讲,此模式已经废弃,因为tcp或http模式中的monitor关键字可完成类似功能;3.4 hash-typehash-type
log
3.8 serverserver
server srv1 172.16.100.6:80 redir checkweight
3.11 stats enable启用基于程序编译时默认设置的统计报告,不能用于“frontend”区段。只要没有另外的其它设定,它们就会使用如下的配置:- stats uri : /haproxy?stats- stats realm : "HAProxy Statistics"- stats auth : no authentication- stats scope : no restriction尽管“stats enable”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。下面是一个配置案例。backend public_wwwserver websrv1 172.16.100.11:80stats enablestats hide-versionstats scope .stats uri /haproxyadmin?statsstats realm Haproxy Statisticsstats auth statsadmin:passwordstats auth statsmaster:password3.12 stats hide-versionstats hide-version启用统计报告并隐藏HAProxy版本报告,不能用于“frontend”区段。默认情况下,统计页面会显示一些有用信息,包括HAProxy的版本号,然而,向所有人公开HAProxy的精确版本号是非常有风险的,因为它能帮助恶意用户快速定位版本的缺陷和漏洞。尽管“stats hide-version”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。具体请参照“stats enable”一节的说明。3.13 stats realmstats realm
stats scope {
报告页面时启用管理级别功能,第二个定义了仅允许通过认证的用户使用管理级别功能。backend stats_localhoststats enablestats admin if LOCALHOSTbackend stats_authstats enablestats auth haproxyadmin:passwordstats admin if TRUE3.17 option httplogoption httplog [ clf ]启用记录HTTP请求、会话状态和计时器的功能。clf:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。3.18 option logasapoption logasapno option logasap启用或禁用提前将HTTP请求记入日志,不能用于“backend”区段。默认情况下,HTTP请求是在请求结束时进行记录以便能将其整体传输时长和字节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。“option logasap”参数能够在服务器发送complete首部时即时记录日志,只不过,此时将不记录整体传输时长和字节数。此情形下,捕获“Content-Length”响应首部来记录传输的字节数是一个较好选择。下面是一个例子。listen http_proxy 0.0.0.0:80mode httpoption httplogoption logasaplog 172.16.100.9 local23.19 option forwardforoption forwardfor [ except
允许在发往服务器的请求首部中插入“X-Forwarded-For”首部。
请求错误时,返回一个HTTP重定向至某URL的信息;可用于所有配置段中。<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;<url>:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;需要留意的是,这两个关键字都会返回302状态吗,这将使得客户端使用同样的HTTP方法获取指定的URL,对于非GET法的场景(如POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其它方法的。如果的确有这种问题,可以使用errorloc303来返回303状态码给客户端。3.22 errorloc303errorloc303
[flags]:目前haproxy的acl支持的标志位有3个:-i:不区分中模式字符的大小写;-f:从指定的文件中加载模式;--:标志符的强制结束标记,在模式中的字符串像标记符时使用;
bind :25mode tcpmaxconn 500acl too_fast fe_sess_rate ge 50tcp-request inspect-delay 50mstcp-request content accept if ! too_fasttcp-request content accept if WAIT_END5.1.3 hdr
acl host_static hdr_beg(host) -i img. video. download. ftp.5.1.8 hdr_end
timeout http-request 10stimeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 3000frontend webser #webser为名称option forwardforbind *:80default_backend appbackend appbalance roundrobin #使拥roundrobin 算法server app1 192.168.1.111:80 checkserver app2 192.168.1.112:80 checkhaproxy统计页面的输出机制frontend webserlog 127.0.0.1 local3option forwardforbind *:80default_backend appbackend appcookie node insert nocachebalance roundrobinserver app1 192.168.1.111:80 check cookie node1 intval 2 rise 1 fall 2server app2 192.168.1.112:80 check cookie node2 intval 2 rise 1 fall 2server backup 127.0.0.1:8010 check backuplisten statisticsbind *:8009 # 自定义监听端口stats enable # 启用基于程序编译时默认设置的统计报告stats auth admin:admin # 统计页面用户名和密码设置stats uri /admin?stats # 自定义统计页面的URL,默认为/haproxy?statsstats hide-version # 隐藏统计页面上HAProxy的版本信息stats refresh 30s # 统计页面自动刷新时间stats admin if TRUE #如果认证通过就做管理功能,可以管理后端的服务器stats realm Hapadmin # 统计页面密码框上提示文本,默认为Haproxy Statistics动静分离示例:frontend webservsbind *:80
acl url_static path_beg -i /static /images /javascript /stylesheetsacl url_static path_end -i .jpg .gif .png .css .js .htmlacl url_php path_end -i .phpacl host_static hdr_beg(host) -i img. imgs. video. videos. ftp. image. _backend static if url_static or host_staticuse_backend dynamic if url_phpdefault_backend dynamicbackend staticbalance roundrobinserver node1 192.168.1.111:80 check maxconn 3000backend dynamicbalance roundrobinserver node2 192.168.1.112:80 check maxconn 1000http服务器配置完整示例#---------------------------------------------------------------------# Global settings#---------------------------------------------------------------------global# to have these messages end up in /var/log/ you will# need to:## 1) configure syslog to accept network log events. This is done# by adding the '-r' option to the SYSLOGD_OPTIONS in# /etc/sysconfig/syslog## 2) configure local2 events to go to the /var/log/# file. A line like the following can be added to# /etc/sysconfig/syslog## local2.* /var/log/#log 127.0.0.1 local2chroot /var/lib/haproxypidfile /var/run/conn 4000user haproxygroup haproxydaemondefaultsmode httplog globaloption httplog
option dontlognulloption http-server-closeoption forwardfor except 127.0.0.0/8option redispatchretries 3timeout http-request 10stimeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 30000listen statsmode httpbind 0.0.0.0:1080stats enablestats hide-versionstats uri /haproxyadmin?statsstats realm Haproxy Statisticsstats auth admin:adminstats admin if TRUEfrontend http-inbind *:80mode httplog globaloption httpcloseoption logasap #不等待响应结束就记录日志,表示提前记录日志,一般日志会记录响应时长,此不记录响应时长option dontlognull #不记录空信息capture request header Host len 20 #记录请求首部的前20个字符capture request header Referer len 60 #referer跳转引用,就是上一级default_backend serversfrontend healthcheckbind :1099 #定义外部检测机制mode httpoption httpcloseoption forwardfordefault_backend serversbackend serversbalance roundrobinserver websrv1 192.168.1.111:80 check maxconn 2000server websrv2 192.168.1.112:80 check maxconn 2000
负载均衡MySQL服务的配置示例#---------------------------------------------------------------------# Global settings#---------------------------------------------------------------------global# to have these messages end up in /var/log/ you will# need to:## 1) configure syslog to accept network log events. This is done# by adding the '-r' option to the SYSLOGD_OPTIONS in# /etc/sysconfig/syslog## 2) configure local2 events to go to the /var/log/# file. A line like the following can be added to# /etc/sysconfig/syslog## local2.* /var/log/#log 127.0.0.1 local2chroot /var/lib/haproxypidfile /var/run/conn 4000user haproxygroup haproxydaemondefaultsmode tcplog globaloption httplogoption dontlognullretries 3timeout http-request 10stimeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 600listen statsmode httpbind 0.0.0.0:1080stats enable
stats hide-versionstats uri /haproxyadmin?statsstats realm Haproxy Statisticsstats auth admin:adminstats admin if TRUEfrontend mysqlbind *:3306mode tcplog globaldefault_backend mysqlserversbackend mysqlserversbalance leastconnserver dbsrv1 192.168.1.111:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300server dbsrv2 192.168.1.112:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300感谢“ 田飞雨 ”投稿分享如此精彩的文章,网址:分享收藏
纠错
版权声明:本文标题:HAProxy用法详解 全网最详细中文文档 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1705469828h486062.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论