## HAProxy
 HAProxy是一款开源、高性能的、基于TCP和HTTP应用的负载均衡软件。

 ### 特点
 >- 可靠性和稳定性非常好,可与硬件级的F5负载均衡设备相媲美。
 - 最高可以同时维护40000~50000个并发连接,单位时间内处理的最大请求数为20000个,最大数据处理能力可达10Gbit/s。
 - 支持多于8种负载均衡算法,同时也支持会话保持。
 - 支持虚拟主机功能。
 - 从HAProxy1.3后开始支持连接拒绝、全透明代理等功能。
 - 支持功能强大的服务器状态监控页面,可实时了解系统的运行状况。
 - 拥有功能强大的ACL(访问控制列表)支持,能给使用带来很大方便。

 ### 安装与配置
 #### 1.安装
 下载地址:https://fossies.org/linux/misc/haproxy-1.8.13.tar.gz/  
    # 解压  
     `tar -zxvf haproxy-1.8.13.tar.gz`  
     `cd haproxy-1.8.13`  
    # 安装  
     `make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy`  
     `make install PREFIX=/usr/local/haproxy`  
 安装完成后安装目录下生成三个目录`doc` `sbin` `share`

 ####2.配置
 安装完成后,默认安装目录中没有配置文件,需要在安装目录中创建配置文件目录和配置文件:  
 `mkdir /usr/local/haproxy/conf`  
 `touch haproxy.cfg`
 #####2.1配置文件概述
 HAProxy配置文件由5个部分组成:  

 >- global部分  
 用来设置全局配置参数,属于进程级的配置,通常和操作系统配置有关。
 - defaults部分  
 默认参数配置部分。在此部分设置的参数值,默认会自动被引用到下面的frontend、backend和listen部分中。
 - frontend部分  
 用于设置接受用户请求的前端虚拟节点。frontend可根据ACL规则直接指定要使用的后端(backend)。
 - backend部分  
 用于设置集群后端服务集群的配置,用来添加一组真实服务器。
 - listen部分  
 frontend部分和backend部分的结合体。HAProxy 1.3版本之前,HAProxy的所有配置选项都在这个部分中设置。  

 #####2.2配置文件详解

 ```
 #########全局配置##########
 global
   log 127.0.0.1 local0 info #日志输出配置,所有日志都记录在本机,通过local0输出,info定义haproxy日志级别[error warring info debug]
   daemon #以后台形式运行harpoxy
   nbproc 1 #设置进程数量
   maxconn 4096 #默认最大连接数
   #user haproxy #运行haproxy的用户
   #group haproxy #运行haproxy的用户所在的组
   #pidfile /var/run/haproxy.pid #haproxy进程PID文件

 ########默认配置############
 defaults
    log global #使用全局的日志配置,global表示引用在HAProxy配置文件global部分中定义的log选项配置格式
   mode http #默认的模式mode { tcp|http|health },tcp是默认模式,客户端和服务器间建立全双工的连接,不对7层报文做任何类型的检查,http模式下客户端请求被转发前会被深度分析,所有与RFC格式不兼容的请求将被拒绝,health只会返回OK,基本已废弃
   retries 2 #设置连接后端服务器的失败重试次数,连接失败的次数如果超过设定值,HAProxy将对应的后端服务器标记为不可用
   maxconn 4096 #默认的最大连接数
   timeout connect 5000ms #成功连接到一台服务器的最长等待时间
   timeout client 30000ms #连接客户端发送数据时最长的等待时间
   timeout server 30000ms #服务器端返回客户端数据发送的最长等待时间
   timeout check 2000 #对后端服务器的检测超时时间
   #timeout http-keep-alive10s #默认持久连接超时时间
   #timeout http-request 10s #默认http请求超时时间
   #timeout queue 1m #默认队列超时时间
   balance roundrobin #设置默认负载均衡方式,轮询方式
   #balance source #设置默认负载均衡方式,类似于nginx的ip_hash
   #balnace leastconn #设置默认负载均衡方式,最小连接数

 ########统计页面配置########
 listen admin_stats   #定义了一个名为“admin_stats”的实例
   bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
   mode http 
   option httplog #采用http日志格式
   #log 127.0.0.1 local0 err #错误日志记录
   maxconn 10 #默认的最大连接数
   stats refresh 30s #统计页面自动刷新时间
   stats uri /stats #统计页面url
   stats realm welcome login\ Haproxy #登录统计页面时密码框上提示文本
   stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
   stats hide-version #隐藏统计页面上HAProxy的版本信息
   stats admin if TRUE #设置手工启动/禁用后端服务器,后端服务器(haproxy-1.4.9以后版本)

 ########设置haproxy 错误页面#####
 #errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
 #errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
 #errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
 #errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
 #errorfile 504 /home/haproxy/haproxy/errorfiles/504.http

 ########frontend前端配置##############
 frontend main  #定义了一个名为“main”的前端虚拟节点
   bind *:80 #定义一个或几个监听的套接字
   acl web hdr(host) -i www.abc.com  #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则
   acl img hdr(host) -i img.abc.com  #如果访问img.abc.com这个域名,就触发img规则
   use_backend webserver if web   #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域
   use_backend imgserver if img   #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域
   default_backend dynamic #指定默认的后端服务池,dynamic在backend部分定义,不满足则响应backend的默认页面

 ########backend后端配置##############
 backend webserver #webserver作用域
   mode http
   balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
   option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
    option redispatch #用于cookie保持的环境中,HAProxy将serverID插入cookie中,以保证会话的持久性,如果后端服务器故障,客户端的请求会被强制定向到另一个健康的服务器上
   server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3
   server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3
    #定义多个后端真实服务器
   #cookie 1表示serverid为1,check inter 1500 是检测心跳频率 
   #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

 backend imgserver  #定义后端服务池
   mode http
   option httpchk /index.php
   balance roundrobin 
   server img01 192.168.137.101:80 check inter 2000 fall 3
   server img02 192.168.137.102:80 check inter 2000 fall 3

 backend dynamic   #定义后端服务池
   balance roundrobin 
   server test1 192.168.1.23:80 check maxconn 2000 
   server test2 192.168.1.24:80 check maxconn 2000


 ```

 ####3.通过ACL规则实现智能负载均衡
 HAProxy通过ACL完成以下两种主要功能:
 >1) 通过设置的ACL规则检查客户端请求是否合法,如果符合ACL规则要求就放行。  
 2) 符合ACL规则要求的请求将被提交到后端的服务器集群,进而实现基于ACL规则的负载均衡。

 HAProxy中的ACL规则经常使用在frontend部分中,使用方法如下:  
 `acl 自定义的acl名称 acl方法 -i [匹配的路径或文件]`  

 - acl:一个关键字,表示定义ACL规则的开始。  
 - acl方法:HAProxy定义了很多ACL方法,常用的方法有 `hdr_reg(host)`、 `hdr_dom(host)`、 `hdr_beg(host)`、 `url_sub`、 `url_dir`、 `path_beg`、 `path_end`等。  
 - `-i`表示忽略大小写。

 ####4.管理与维护HAProxy  
 HAProxy安装目录的sbin目录下有一个可执行的二进制文件`haproxy`,对HAProxy的启动、关闭、重启等操作都是通过这个二进制文件来实现的。   

 以下即此文件的用法:  
 `haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ]`   
 其中:  
 `cfgfile`:配置文件  
 `maxconn`:最大并发连接总数  
 `maxpconn`:默认的连接数  

 参数|说明  
 :-:|:-  
  -v |显示当前版本信息;“-vv”显示已知的创建选项
  -d |表示让程序运行在debug模式:“-db”表示禁用后台模式,让程序在前台运行  
  -D |让程序以daemon模式启动,此选项也可以在HAProxy配置文件中设置  
  -q |表示无限提示模式,程序运行部输出任何信息  
  -c |对HAProxy配置文件进行语法检查。若配置文件错误,会输出对应的错误位置和错误消息  
  -n |设置最大并发连接总数
  -m |限制可用的内存大小,以MB为单位
  -N |设置默认的连接数
  -p |设置HAProxy的PID文件路径
  -de |不使用epoll模型
  -ds |不使用speculative epoll
  -dp |不使用poll模型
  -sf |程序启动后想PID文件里的进程发送FINISH信号,这个参数需要放在命令行的最后
  -st |程序启动后向PID里的进程发送TERMINATE信号,这个参数放在命令行的最后,经常用于重启HAProxy进程

 - 启动HAProxy  
 `/usr/local/haproxy/sbin/haproxy -f \ > /usr/local/haproxy/conf/haproxy.cfg`  
 - 关闭HAProxy  
 `killalll -9 haproxy`  
 - 平滑重启HAProxy  
 `/usr/local/haproxy/sbin/haproxy -f \ > /usr/local/haproxy/conf/haproxy.cfg -st 'cat /usr/local/haproxy/logs/haproxy.pid'`
## HAProxy
 HAProxy是一款开源、高性能的、基于TCP和HTTP应用的负载均衡软件。

 ### 特点
 >- 可靠性和稳定性非常好,可与硬件级的F5负载均衡设备相媲美。
 - 最高可以同时维护40000~50000个并发连接,单位时间内处理的最大请求数为20000个,最大数据处理能力可达10Gbit/s。
 - 支持多于8种负载均衡算法,同时也支持会话保持。
 - 支持虚拟主机功能。
 - 从HAProxy1.3后开始支持连接拒绝、全透明代理等功能。
 - 支持功能强大的服务器状态监控页面,可实时了解系统的运行状况。
 - 拥有功能强大的ACL(访问控制列表)支持,能给使用带来很大方便。

 ### 安装与配置
 #### 1.安装
 下载地址:https://fossies.org/linux/misc/haproxy-1.8.13.tar.gz/  
    # 解压  
     `tar -zxvf haproxy-1.8.13.tar.gz`  
     `cd haproxy-1.8.13`  
    # 安装  
     `make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy`  
     `make install PREFIX=/usr/local/haproxy`  
 安装完成后安装目录下生成三个目录`doc` `sbin` `share`

 ####2.配置
 安装完成后,默认安装目录中没有配置文件,需要在安装目录中创建配置文件目录和配置文件:  
 `mkdir /usr/local/haproxy/conf`  
 `touch haproxy.cfg`
 #####2.1配置文件概述
 HAProxy配置文件由5个部分组成:  

 >- global部分  
 用来设置全局配置参数,属于进程级的配置,通常和操作系统配置有关。
 - defaults部分  
 默认参数配置部分。在此部分设置的参数值,默认会自动被引用到下面的frontend、backend和listen部分中。
 - frontend部分  
 用于设置接受用户请求的前端虚拟节点。frontend可根据ACL规则直接指定要使用的后端(backend)。
 - backend部分  
 用于设置集群后端服务集群的配置,用来添加一组真实服务器。
 - listen部分  
 frontend部分和backend部分的结合体。HAProxy 1.3版本之前,HAProxy的所有配置选项都在这个部分中设置。  

 #####2.2配置文件详解

 ```
 #########全局配置##########
 global
   log 127.0.0.1 local0 info #日志输出配置,所有日志都记录在本机,通过local0输出,info定义haproxy日志级别[error warring info debug]
   daemon #以后台形式运行harpoxy
   nbproc 1 #设置进程数量
   maxconn 4096 #默认最大连接数
   #user haproxy #运行haproxy的用户
   #group haproxy #运行haproxy的用户所在的组
   #pidfile /var/run/haproxy.pid #haproxy进程PID文件

 ########默认配置############
 defaults
    log global #使用全局的日志配置,global表示引用在HAProxy配置文件global部分中定义的log选项配置格式
   mode http #默认的模式mode { tcp|http|health },tcp是默认模式,客户端和服务器间建立全双工的连接,不对7层报文做任何类型的检查,http模式下客户端请求被转发前会被深度分析,所有与RFC格式不兼容的请求将被拒绝,health只会返回OK,基本已废弃
   retries 2 #设置连接后端服务器的失败重试次数,连接失败的次数如果超过设定值,HAProxy将对应的后端服务器标记为不可用
   maxconn 4096 #默认的最大连接数
   timeout connect 5000ms #成功连接到一台服务器的最长等待时间
   timeout client 30000ms #连接客户端发送数据时最长的等待时间
   timeout server 30000ms #服务器端返回客户端数据发送的最长等待时间
   timeout check 2000 #对后端服务器的检测超时时间
   #timeout http-keep-alive10s #默认持久连接超时时间
   #timeout http-request 10s #默认http请求超时时间
   #timeout queue 1m #默认队列超时时间
   balance roundrobin #设置默认负载均衡方式,轮询方式
   #balance source #设置默认负载均衡方式,类似于nginx的ip_hash
   #balnace leastconn #设置默认负载均衡方式,最小连接数

 ########统计页面配置########
 listen admin_stats   #定义了一个名为“admin_stats”的实例
   bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
   mode http 
   option httplog #采用http日志格式
   #log 127.0.0.1 local0 err #错误日志记录
   maxconn 10 #默认的最大连接数
   stats refresh 30s #统计页面自动刷新时间
   stats uri /stats #统计页面url
   stats realm welcome login\ Haproxy #登录统计页面时密码框上提示文本
   stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
   stats hide-version #隐藏统计页面上HAProxy的版本信息
   stats admin if TRUE #设置手工启动/禁用后端服务器,后端服务器(haproxy-1.4.9以后版本)

 ########设置haproxy 错误页面#####
 #errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
 #errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
 #errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
 #errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
 #errorfile 504 /home/haproxy/haproxy/errorfiles/504.http

 ########frontend前端配置##############
 frontend main  #定义了一个名为“main”的前端虚拟节点
   bind *:80 #定义一个或几个监听的套接字
   acl web hdr(host) -i www.abc.com  #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则
   acl img hdr(host) -i img.abc.com  #如果访问img.abc.com这个域名,就触发img规则
   use_backend webserver if web   #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域
   use_backend imgserver if img   #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域
   default_backend dynamic #指定默认的后端服务池,dynamic在backend部分定义,不满足则响应backend的默认页面

 ########backend后端配置##############
 backend webserver #webserver作用域
   mode http
   balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
   option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
    option redispatch #用于cookie保持的环境中,HAProxy将serverID插入cookie中,以保证会话的持久性,如果后端服务器故障,客户端的请求会被强制定向到另一个健康的服务器上
   server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3
   server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3
    #定义多个后端真实服务器
   #cookie 1表示serverid为1,check inter 1500 是检测心跳频率 
   #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

 backend imgserver  #定义后端服务池
   mode http
   option httpchk /index.php
   balance roundrobin 
   server img01 192.168.137.101:80 check inter 2000 fall 3
   server img02 192.168.137.102:80 check inter 2000 fall 3

 backend dynamic   #定义后端服务池
   balance roundrobin 
   server test1 192.168.1.23:80 check maxconn 2000 
   server test2 192.168.1.24:80 check maxconn 2000


 ```

 ####3.通过ACL规则实现智能负载均衡
 HAProxy通过ACL完成以下两种主要功能:
 >1) 通过设置的ACL规则检查客户端请求是否合法,如果符合ACL规则要求就放行。  
 2) 符合ACL规则要求的请求将被提交到后端的服务器集群,进而实现基于ACL规则的负载均衡。

 HAProxy中的ACL规则经常使用在frontend部分中,使用方法如下:  
 `acl 自定义的acl名称 acl方法 -i [匹配的路径或文件]`  

 - acl:一个关键字,表示定义ACL规则的开始。  
 - acl方法:HAProxy定义了很多ACL方法,常用的方法有 `hdr_reg(host)`、 `hdr_dom(host)`、 `hdr_beg(host)`、 `url_sub`、 `url_dir`、 `path_beg`、 `path_end`等。  
 - `-i`表示忽略大小写。

 ####4.管理与维护HAProxy  
 HAProxy安装目录的sbin目录下有一个可执行的二进制文件`haproxy`,对HAProxy的启动、关闭、重启等操作都是通过这个二进制文件来实现的。   

 以下即此文件的用法:  
 `haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ]`   
 其中:  
 `cfgfile`:配置文件  
 `maxconn`:最大并发连接总数  
 `maxpconn`:默认的连接数  

 参数|说明  
 :-:|:-  
  -v |显示当前版本信息;“-vv”显示已知的创建选项
  -d |表示让程序运行在debug模式:“-db”表示禁用后台模式,让程序在前台运行  
  -D |让程序以daemon模式启动,此选项也可以在HAProxy配置文件中设置  
  -q |表示无限提示模式,程序运行部输出任何信息  
  -c |对HAProxy配置文件进行语法检查。若配置文件错误,会输出对应的错误位置和错误消息  
  -n |设置最大并发连接总数
  -m |限制可用的内存大小,以MB为单位
  -N |设置默认的连接数
  -p |设置HAProxy的PID文件路径
  -de |不使用epoll模型
  -ds |不使用speculative epoll
  -dp |不使用poll模型
  -sf |程序启动后想PID文件里的进程发送FINISH信号,这个参数需要放在命令行的最后
  -st |程序启动后向PID里的进程发送TERMINATE信号,这个参数放在命令行的最后,经常用于重启HAProxy进程

 - 启动HAProxy  
 `/usr/local/haproxy/sbin/haproxy -f \ > /usr/local/haproxy/conf/haproxy.cfg`  
 - 关闭HAProxy  
 `killalll -9 haproxy`  
 - 平滑重启HAProxy  
 `/usr/local/haproxy/sbin/haproxy -f \ > /usr/local/haproxy/conf/haproxy.cfg -st 'cat /usr/local/haproxy/logs/haproxy.pid'`