HAProxy的安装 和 配置文件


HAproxy的安装

二进制 安装
1. 安装依赖包
# yum install -y net-tools vim lrzsz tree screen lsof tcpdump nc mtr nmap gcc glib gcc-c++ make
2. 下载软件包
# cd /usr/local/
# wget https://www.haproxy.org/download/1.9/src/haproxy-1.9.6.tar.gz
3.编译安装
# tar xzf haproxy-1.9.6.tar.gz
# cd haproxy-1.9.6/
# make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.9.6
# make install
# cp /usr/local/sbin/haproxy /usr/sbin/
# haproxy -v
HA-Proxy version 1.9.6 2019/03/29 - https://haproxy.org/
4.启动脚本
# cp /usr/local/haproxy-1.9.6/examples/haproxy.init /etc/init.d/haproxy
# chmod 755 /etc/init.d/haproxy
5. 配置文件
# useradd -r haproxy     		 //创建haproxy用户
# mkdir /etc/haproxy    		//创建存放配置文件的目录
# mkdir /var/lib/haproxy    	 //创建存放socket文件的目录
# vim /etc/haproxy/haproxy.cfg   //编辑配置文件
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

listen admin
    bind 0.0.0.0:8088
    stats enable
    stats refresh 2s
    stats uri /status
    stats auth haproxy:superman
    stats realm "haproxy info"
    stats hide-version
6 .启动
systemctl start haproxy

说明:如果启动HAProxy出现 /etc/rc.d/init.d/haproxy: line 26: [: =: unary operator expected 这个错误,修改/etc/init.d/haproxy 文件的26行 [ ${NETWORKING} = "no" ] && exit 0 为 [ "${NETWORKING}" = "no" ] && exit 0

YAM安装
1. 安装HAProxy  C7 默认版本是 1.5.18
# yum install haproxy -y
2. 文件存放位置
/usr/sbin/haproxy    			//二进制文件
/usr/share/haproxy    			//共享文件
/var/lib/haproxy    			//库文件
/etc/rc.d/init.d/haproxy    	 //启动二进制文件
/etc/logrotate.d/haproxy    	 //日志切割
/etc/sysconfig/haproxy    		 //配置
/etc/haproxy      				//配置目录



详解HAProxy的配置文件 (haproxy.cfg)

HAProxy配置过程的3个主要部分
  • 命令行参数,这是最优先的
  • global(全局)段,设置进程级参数
  • 代理配置段,通常位于“default”,“listen”,“frontend”,“backend”这样的形式内

配置文件的语法是由关键字后跟可选的一个或者多个参数(参数之间有空格)组成。如果字符串中包含空格,必须使用“\”进行转义。\本身需要使用\进行转义。

一些参数值为时间,比如说 timeout。时间通常单位为毫秒(ms),但是也可以通过加后缀来使用其他的单位,支持的单位有:

- us : microseconds. 1 microsecond = 1/1000000 second
- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.
- s  : seconds. 1s = 1000ms
- m  : minutes. 1m = 60s = 60000ms
- h  : hours.   1h = 60m = 3600s = 3600000ms
- d  : days.    1d = 24h = 1440m = 86400s = 86400000ms
HAProxy配置中的五大部分

HAProxy配置文件根据功能和用途,主要有5个部分组成,但有些部分不是必须的,可以根据需要选择相应的部分进行配置。

  • global:用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
  • defaults:默认参数的配置部分,有些部分设置的参数值,默认会自动引用到下面的frontend、backend和listen部分中,因此,如果某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果在frontend、backend和listen部分中也配置了与defaults部分一样的参数,那么defaults部分参数对应的值自动被覆盖。
  • frontend:此部分用于设置用户请求的前端虚拟节点。匹配用户接收客户所请求的域名,url等,并针对不同的匹配,做不同的请求处理。
  • backend:此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以及对后端服务器的一些权重、队列、连接数等选项的设置。
  • listen:此部分可以理解为frontend和backend的结合题。

HAProxy配置文件的配置方法主要用两种:

  一种是有前端(frontend)和后端(backend)配置块组成,前端和后端都可以有多个。

  第二种是只有一个listen配置块来同时实现前端和后端。

global #全局参数的配置
global
    maxconn 100000
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid 
    uid 99  
    gid 99 
    daemon
    nbproc 1 
    log 127.0.0.1 local3 info
    stats socket /var/lib/haproxy/stats
log 127.0.0.1 local0 info
    # log语法:log [max_level_1]
    # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志
maxconn 4096
    # 定义每个haproxy进程的最大连接数,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
user haproxy
group haproxy
    # 设置运行haproxy的用户和组,也可使用uid,gid关键字替代之
daemon
    # 以守护进程的方式运行
nbproc 16
    # 设置haproxy启动时的进程数,根据官方文档的解释,我将其理解为:该值的设置应该和服务器的CPU核心数一致,即常见的2颗8核心CPU的服务器,即共有16核心,则可以将其值设置为:<=16 ,创建多个进程数,可以减少每个进程的任务队列,但是过多的进程数也可能会导致进程的崩溃。这里我设置为16
maxconn 4096
    # 定义每个haproxy进程的最大连接数,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
#ulimit -n 65536
    # 设置最大打开的文件描述符数,在1.4的官方文档中提示,该值会自动计算,所以不建议进行设置
pidfile /var/run/haproxy.pid
    # 定义haproxy的pid
代理(Proxies)相关设置

使用HAProxy进行反向代理负载均衡,最常修改的部分就是代理相关的配置了,代理相关配置位于下列配置段中,

  -defaults  

  -frontend  

  -backend  

  -listen   

"defaults"段为其后的所有其他配置段设置默认参数。 "defaults"段可以有多个,后设置的总是会覆盖之前的配置。查看下面的列表可以知道"defaults"段可以使用哪些配置参数。"defaults"关键字是可选的,但是为了更好的可读性,建议加上。

"frontend"段描述了一组监听的套接字,它们接受客户端连接。

"backend"段描述了一组服务器,代理(Haproxy)会连接这些服务器并转发客户端请求到这些服务器上。

"listen"段定义了一个完整的代理,它的前段(frontend)和后端(frontend)都在这个配置段里。这种配置通常用于仅TCP的流量.

代理名必须由大(小)写字母、数字、'-'、'_'、'.'、':'组成。ACL名字是大小写敏感的,也即www和WWW分别指不同的代理。

由于历史原因,所有的代理名字是可以重叠的,这种仅仅会导致日志有些问题。后来内容交换(Content Switching)的加入使得两个有重复功能的代理(frontend/backend)必须使用不同的名字。然而,仍然允许frontend和backend使用同一个名字,因为这种配置会经常遇到。

当前,HAProxy支持两种主要的代理模式: "tcp"也即4层,和"http",即7层。在4层模式下,HAproxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求(request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。

defaults 配置

defaults
    option http-keep-alive
    maxconn 100000
    mode http
    timeout connect 5000ms
    timeout client  50000ms
    timeout server 50000ms
defaults    # 默认部分的定义
mode http
     # mode语法:mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测,返回OK
log 127.0.0.1 local3 err
     # 使用127.0.0.1上的syslog服务的local3设备记录错误信息
retries 3
     # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
option httplog
     # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求的,只记录“时间[Jan 5 13:23:46] 日志服务器[127.0.0.1] 实例名已经pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]”,日志格式很简单。
option redispatch
     # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
option abortonclose
     # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option dontlognull
     # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
option i
     # 这个参数我是这样理解的:使用该参数,每处理完一个request时,haproxy都会去检查http头中的Connection的值,如果该值不是close,haproxy将会将其删除,如果该值为空将会添加为:Connection: close。使每个客户端和服务器端在完成一次传输后都会主动关闭TCP连接。与该参数类似的另外一个参数是“option forceclose”,该参数的作用是强制关闭对外的服务通道,因为有的服务器端收到Connection: close时,也不会自动关闭TCP连接,如果客户端也不关闭,连接就会一直处于打开,直到超时。
contimeout 5000
     # 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容
clitimeout 3000
     # 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容
srvtimeout 3000
     # 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容

Listen 配置

listen status
    mode http
    bind 10.0.0.5:1080
    stats enable
    stats uri     /status 
    stats auth    haproxy:superman
    stats hide-version
listen status    
    # 定义一个名为status的部分
bind 10.0.0.5:1080
    # 定义监听的套接字
mode http
    # 定义为HTTP模式
log global
    # 继承global中log的定义
stats refresh 30s
    # stats是haproxy的一个统计页面的套接字,该参数设置统计页面的刷新间隔为30s
stats uri /status
    # 设置统计页面的uri为/status,访问地址即为:http://192.168.1.24:1080/status
stats realm "Private lands"
    # 设置统计页面认证时弹出对话框的提示内容
stats auth admin:password
    # 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
stats hide-version
    # 隐藏统计页面上的haproxy版本信息

Frontend 配置

frontend frontend_www_example_com
    bind 0.0.0.0:80
    mode http
    option httplog
    log global
    default_backend backend_www_example_com    //应用后端自定义服务器组名backend_www_example_com
frontend http_80_in    
    # 定义一个名为http_80_in的前端部分
bind 0.0.0.0:80
    # http_80_in定义前端部分监听的套接字
mode http
    # 定义为HTTP模式
log global
    # 继承global中log的定义
option forwardfor
    # 启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP
acl static_down nbsrv(static_server) lt 1
    # 定义一个名叫static_down的acl,当backend static_sever中存活机器数小于1时会被匹配到
use_backend php_server if static_down
    # 如果满足策略static_down时,就将请求交予backend php_server

Backend 配置

backend backend_www_example_com
    option forwardfor header X-REAL-IP
    option httpchk HEAD / HTTP/1.0
    balance source
    server web-node1  192.168.1.25:8080 cookie 1 check inter 2000 rise 3 fall 3
    server web-node2  192.168.1.26:8080 cookie 2 check inter 2000 rise 3 fall 3
    server web-node3.bak  192.168.1.27:80   cookie 3 check inter 1500 rise 3 fall 3 backup
backend php_server    #定义一个名为php_server的后端部分
mode http
     # 设置为http模式
balance source
     # 设置haproxy的调度算法为源地址hash
cookie SERVERID
     # 允许向cookie插入SERVERID,每台服务器的SERVERID可在下面使用cookie关键字定义
option httpchk GET /test/index.php
     # 开启对后端服务器的健康检测,通过GET /test/index.php来判断后端服务器的健康情况
server php_server_1 10.12.25.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2
server php_server_2 10.12.25.72:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1
server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup
     # server语法:server [:port] [param*]
     # 使用server关键字来设置后端服务器;为后端服务器所设置的内部名称[php_server_1],该名称将会呈现在日志或警报中、后端服务器的IP地址,支持端口映射[10.12.25.68:80]、指定该服务器的SERVERID为1[cookie 1]、接受健康监测[check]、监测的间隔时长,单位毫秒[inter 2000]、监测正常多少次后被认为后端服务器是可用的[rise 3]、监测失败多少次后被认为后端服务器是不可用的[fall 3]、分发的权重[weight 2]、最为备份用的后端服务器,当正常的服务器全部都宕机后,才会启用备份服务器[backup]

HAproxy的健检查

##### 端口的方式 
# 这种检测方式,haproxy 知会去检查后端 server 的端口,并不能保证服务的真正可用   
listen http_proxy 0.0.0.0:80 
        mode http 
        cookie SERVERID 
        balance roundrobin 
        option httpchk 
        server web1 192.168.1.25:80 cookie server01 check 
        server web2 192.168.1.26:80 cookie server02 check inter 500 rise 1 fall 2 
     
        
##### URL获取
listen http_proxy 0.0.0.0:80 
        mode http 
        cookie SERVERID 
        balance roundrobin 
        option httpchk GET /index.html 
        server web1 192.168.1.25:80 cookie server01 check 
        server web2 192.168.1.26:80 cookie server02 check inter 500 rise 1 fall 2 
        
        
 #### 规则
 check inter 500 rise 1 fall 2
 
 check inter  		 ## 健康检查
 500   			     ## 间隔时间毫秒  
 rise 1 			 ## 成功一次为存活
 fall   			 ## 连续失败两次为down

常见配置功能总结

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global									  # // 全局配置   (级别最低)
    log         127.0.0.1 local3  info 		 # // 日志配置 等级 local2 关键字log 
    pidfile     /var/run/haproxy.pid          # //pid文件存放
    maxconn     4000              		  	 # // 最大连接数
    user        haproxy 					# // 用户 可以是 id
    group       haproxy						# // 用户组 可以是gid
    daemon								   # // 守护进程模式
    nbproc      2						    # // 进程数 和核心数有关 自行调整
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults 								# // 默认配置 针对listen 和 backend模块设置 
    mode                    http 		  # // 负载模式 7层负载 
    log                     global         # // 日志使用全局配置
    option                  httplog        # // 启用日志记录HTTP请求,丰富日志
    option                  dontlognull    # // 启用该项,日志中将不会记录空连接。无上游服务器不开
    option 				   redispatch     # // 后端服务器不可用指向新的服务器
    option 				   httpclose      # // 每次请求完,关闭http通道
    retries                 3         # // 健康检测 3次不可用 就认为服务器down
    timeout connect         10s       # // 定义haproxy将客户端请求转发到后端,超时时长   
    timeout client          1m	      # // haproxy作为客户端,和后端服务器的超时时间 fin命令
    timeout server          1m	      # // haproxy作为服务端,和客户端的超时时间 fin命令
    maxconn                 3000	  # // 最大连接数3000

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
listen stats  
    bind *:9090             # 绑定到9090端口  
    mode http  
    stats enable            # 启用统计信息,开启web页面的信息查看
    stats uri /haproxy      # 统计信息的URI,web页面的账户和密码
    stats auth admin:admin  # 认证信息,web页面的账户和密码
    stats realm "HAproxy web status" # web弹出对话框的提示内容

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  web *:80              ## 开启一个前端 监听所有的80 端口
	# 定义访问控制列表 名为url_beg一个url以/static /images 开头的请求 -i 不区分大小写
    acl url_beg   path_beg    -i /static /images /javascript /stylesheets
    # 定义访问控制列表 名为url_end 一个url以.jpg .gif .png .css .js 开头的请求 -i 不区分大小写
    acl url_end   path_end    -i .jpg .gif .png .css .js

    # 满足 url_beg 将请求转发到 web 服务器组
    use_backend web          if url_beg
    # 满足 url_end 将请求转发到 web 服务器组
    use_backend web          if url_end
    # 默认的后端服务器  web
    default_backend             web

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend web                ##  定义一个后端服务器组 名为 web   
    option forwardfor header X-REAL-IP   ##  将请求的真实IP 转递给后端服务器  记录日志很有用
    balance     roundrobin    			##  采用轮循(RR)的方式
    mod         http                     ##  7层代理
    option httpchk GET /index.html       ##  对后面服务器进行检查
    cookie SERVERID inset indirect nocache  ## 轮询的同时,根据插入的cookie SERVERID的值来做会话保持
    server  web-A 10.0.0.7:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
    server  web-B 10.0.0.8:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
    server  web-C 10.0.0.9:80 weight 1 cookie 5 check inter 2000 rise 2 fall 5 backup

    #接下来定义了三个服务器条目,每个都包含服务器的名称(如web-A)、
    # IP地址和端口(如10.0.0.7:80)、
    # 权重(如weight 1)、
    # cookie值(如cookie 3)、
    # 健康检查间隔(check inter 2000)、成功响应次数才认为是健康的(rise 2)以及连续失败次数后认为是不可用的(fall 5)。
    # backup标记在web-C上表示它是一个备份服务器,只有在其他服务器都不可用时才会接收请求