centos7 部署haproxy

第一章 :haproxy介绍

1.1 简介

  1. HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
  2. HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
  3. HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
  4. HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

1.2 性能

  1. 单进程、事件驱动模型降低了上下文切换的开销及内存占用。
  2. I/O事件检查器允许其在高并发连接中对任何连接的任何事件实现即时探测。
  3. 在任何可用的情况下,单缓冲机制能以不复制任何数据的方式完成读写操作,这会节约大量 的cpu时钟周期以及内存带宽。
  4. 借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting)
  5. 内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长。
  6. 树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列。
  7. 优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域。
  8. 精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等

第二章 部署安装

2.1 编译安装

打开IP转发 
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p
yum -y install gcc systemd-devel #安装依赖
tar xf haproxy-1.8.7.tar.gz #解压
cd haproxy-1.8.7/
make TARGET=linux2628 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
cp /usr/local/haproxy/sbin/haproxy /usr/sbin/
cp ./examples/haproxy.init /etc/init.d/haproxy
chmod 755 /etc/init.d/haproxy
useradd -r haproxy
mkdir /etc/haproxy 

2.2 编写配置文件

vim /etc/haproxy/haproxy.cfg
# Global settings
#---------------------------------------------------------------------
global #全局配置
 log 127.0.0.1 local3 info #指定服务器的日志级别
 chroot /usr/local/haproxy #改变工作目录
 user haproxy #用户组和用户
 group haproxy
 daemon #以守护进程的方式运行
 maxconn 4000 #最大连接数
defaults #默认配置
 log global
 mode http #7层http;4层tcp 如果要让haproxy支持虚拟主机,mode 必须设为http
 option httplog #http日志格式 
 timeout connect 5000 #连接超时(毫秒)
        timeout client 50000 #客户端超时(毫秒)
        timeout server 50000 #服务器超时(毫秒)
 listen stats
 mode http
 bind 10.0.0.19:1080
 stats enable              
 stats hide-version
 stats uri /stats
 stats admin if TRUE
frontend web_front #前端配置 web_front名称可自定义
 bind 10.0.0.19:80 #发起的http请求到80端口,会转发到设置的ip及端口
 mode http
 log global
 option httplog # 启用http日志
        default_backend http_back
backend http_back #后端配置,http_back名称可自定义
 option httpchk GET /index.html #设置健康检查页面
 option forwardfor header X-Forwarded-For #传递客户端真实IP
 balance roundrobin #roundrobin 轮询方式
# 需要转发的ip及端口
 server elk2 10.0.0.22:80 check inter 2000 rise 3 fall 3 weight 30
 server elk1 10.0.0.21:80 check inter 2000 rise 3 fall 3 weight 30
 server elk3 10.0.0.24:80 check inter 2000 rise 3 fall 3 weight 30

2.3 日志配置

打开rsyslog配置:
vi /etc/rsyslog.conf
去掉下面两行前面的#号
$ModLoad imudp
$UDPServerRun 514
并添加下面一行
local3.* /var/log/haproxy.log   
重启rsyslog
systemctl restart rsyslog

2.4 启动haproxy

service haproxy start

第三章 配置文件详解

  • Global段:用来定义进程安全相关配置,性能参数调整,Debug等服务相关的配置。
  • Proxy段:用来定义与调度的具体实现方式,Proxy段具体包括
  • listen段:listen可以直接确定一种调度工作方式
  • frontend段:定义与客户端通信的工作方式
  • backend段:定义与后端主机通信的工作方式
  • defaults段:定义listen,frontend,backend中某些变量的默认值

3.1 进程及安全配置相关参数

chroot /usr/local/haproxy:禁锢根,haproxy进程以此目录作为根目录,防止haproxy进程被劫持而设定的安全性配置
user haproxy: 运行haproxy进程的用户和组
group haproxy:
daemon:表示haproxy运行于后台守护进程,而非前台(调试模式)
 log 127.0.0.1 local3 info #local3是设备,对应于 /etc/rsyslog.conf中的配置,默认回收info的日志级别
pidfile /var/run/haproxy.pid #将所有守护进程的PID写入文件
maxconn 4000 #最大连接数

3.2log日志详解

log <address> [len <length> ] [format <format> ] <facility> [max level [min level] ]
添加全局系统日志服务器。可以定义几个全局服务器。他们将接收启动和退出日志以及来自代理的所有日志 

address

一个IPv4地址,可选地跟一个冒号和一个UDP端口。如果没有指定端口,默认使用514(标准系统日志港口)。
IPv6地址,后跟冒号和可选的UDP端口。如果没有指定端口,默认使用514(标准系统日志港口)。
记住一个UNIX域套接字的文件系统路径chroot的注意事项(确保路径可以在里面访问chroot)和uid / gid(确保路径适当可写)。

length可选最大行长度

日志行大于此值在被发送之前将被截断。原因是syslog服务器在日志行长度上的行为不同。所有的服务器都支持默认值为1024,但某些服务器只需放大较大的一行而其他人则会记录它们。如果服务器支持长行,它可能会在这里设置这个值是有意义的,以避免截断long线。同样,如果一台服务器丢掉长线,最好是在发送它们之前截断它们。可接受的值是80到65535包括的。默认值1024通常适用于所有标准用法。一些具体的长时间捕获或者说JSON格式的日志可能需要较大的值。你可能也需要如果您的请求URI被截断,请增“ tune.http.logurilen ”。

format生成系统日志消息时使用的日志格式

 rfc3164 RFC3164系统日志消息格式。这是默认设置。
 rfc5424 RFC5424系统日志消息格式。

facility必须是24个标准syslog工具之一

kern user mail daemon auth syslog lpr news
uucp cron auth2 ftp ntp audit alert cron2
local0 local1 local2 local3 local4 local5 local6 local7

 可以指定一个可选的级别来过滤传出的消息。默认,所有消息都被发送。如果指定了最大级别,则只有带有。的消息严重程度至少与本级别一样重要。可选的最小值级别可以指定。如果设置了,日志会以更严厉的级别发出比这个水平还要高。这用于避免发送某些默认系统日志配置中的所有终端上的“emerg”消息。

3.3 proxies代理配置段

代理配置段:

defaults <name> #为frontend, backend, listen提供默认配置
 frontend <name># 前端,相当于nginx, server {}
 backend <name>#后端,相当于nginx, upstream {}
 listen <name>同时拥有前端和后端,适用于一对一环境
 mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
 log global #应用全局的日志配置
 option httplog # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
 option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
 option http-server-close #每次请求完毕后主动关闭http通道
 option forwardfor except 127.0.0.0/8 #如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。 
 option redispatch #当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
 retries 3 # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
 timeout http-request 10s #http请求超时时间
 timeout queue 1m #一个请求在队列里的超时时间
 timeout connect 10s #连接超时时间
 timeout client 1m #客户端超时时间
 timeout server 1m #服务器端超时时间
 timeout http-keep-alive 10s #设置http-keep-alive的超时时间
 timeout check 10s #检测超时时间
 maxconn 3000 #每个进程可用的最大连接数
 frontend main *:80 #监听地址为80
 acl url_static path_beg -i /static /images /javascript /stylesheets
 acl url_static path_end -i .jpg .gif .png .css .js
 use_backend static if url_static
 default_backend my_webserver #定义一个名为my_app前端部分。此处将对应的请求转发给后端
 backend static #使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则访问此后端)
 balance roundrobin #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
 server static 127.0.0.1:80 check #静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器)
 backend my_webserver #定义一个名为my_webserver后端部分。PS:此处my_webserver只是一个自定义名字而已,但是需要与frontend里面配置项default_backend 值相一致
 balance roundrobin #负载均衡算法
 server web01 172.31.2.33:80 check inter 2000 fall 3 weight 30 #定义的多个后端
 server web02 172.31.2.34:80 check inter 2000 fall 3 weight 30 #定义的多个后端
 server web03 172.31.2.35:80 check inter 2000 fall 3 weight 30 #定义的多个后端

3.4 Balance 配置调度算法

 balance:后端服务器组内的服务器调度算法
 balance <algorithm> [ <arguments> ]
 balance url_param <param> [check_post]

haproxy中调度算法同样分为动态调度算法和静态调度算法,与nginx调度算法中区分动静态调度算法的概念不同,nginx用能不能根据后端服务器的负载状况进行调度来区分动静态调度算法的差别,而haproxy中则根据该算法支不支持运行时的即时生效来区分动静态算法

roundrobin:基于权重轮询,动态算法,支持权重的运行时调整,支持慢启动;每个后端backend中最多支持4095个
 server server options: weight #
 static-rr:基于权重轮询,静态算法,不支持权重的运行时调整及慢启动;后端主机数量无上限
 leastconn:加权最少连接,动态算法,最少连接的后端服务器优先分配接收新连接,相同连接时轮询,适用于长连接场景,例如 MySQL、LDAP等,不适合http
 first:根据服务器在列表中的位置,自上而下进行调度;前面服务器的连接数达到上限,新请求才会分配给下一台服务
 source:源地址hash,新连接先按权重分配,后续连接按source分配请求

3.5 server设置

server <name> <address>[:[port]] [param*]
 定义后端主机的各服务器及其选项 server <name> <address>[:port] [settings ...] default-server [settings ...]
 <name>:服务器在haproxy上的内部名称;出现在日志及警告信息
 <address>:服务器地址,支持使用主机名
 [:[port]]:端口映射;省略时,表示同bind中绑定的端口
 [param*]:参数
 check:对当前server做健康状态检测,只用于四层检测
 注意:httpchk,“smtpchk”, “mysql-check”, “pgsql-check” and “sslhello-chk” 用于定义应用层检测方法
 addr :检测时使用的IP地址
 port :针对此端口进行检测
 inter <delay>:连续两次检测之间的时间间隔,默认为2000ms
 rise <count>:连续多少次检测结果为“成功”才标记服务器为可用 ;默认为2
 fall <count>:连续多少次检测结果为“失败”才标记服务器为不可 用;默认为3
 cookie <value>:为当前server指定cookie值,实现基于cookie的会话黏性
 disabled:标记为不可用
 redir <prefix>:将发往此server的所有GET和HEAD类的请求重定向至指 定的URL
 weight <weight>:权重,默认为1最大值为256,0表示不参与负载均衡(不被调度)
 backlog <backlog>:当server的连接数达到上限后的后援队列长度
 backup:设定当前server为备用服务器
 default-server [param*] 为backend中的各server设定默认选项

3.6 统计接口启用相关的参数

stats enable启用统计页;基于默认的参数启用stats page
 stats uri : /haproxy?stats uri默认值
 stats realm : HAProxy Statistics启用统计信息并设置身份验证领域
 stats auth : no authentication 带有身份验证和授予访问帐户权限的统计信息
 stats uri <prefix> 自定义stats page uri
 stats auth <user>:<passwd> 认证时的账号和密码,可使用多次
 stats realm <realm> 认证时的realm
 stats hide-version 隐藏版本
 stats refresh <delay> 设定自动刷新时间间隔
 stats admin { if | unless } <cond> 启用stats page中的管理功能

3.7连接超时

 timeout client <timeout> 客户端最长空闲连接超时时长 默认单位是毫秒
 timeout server <timeout> 后端服务器最长空闲连接超时时长
 timeout http-keep-alive <timeout> 持久连接的持久时长
 timeout http-request <timeout> 一次完整的HTTP请求的最大等待时长
 timeout connect <timeout> 成功连接后端服务器的最大等待时长
 timeout client-fin <timeout> 客户端半连接的空闲时长
 timeout server-fin <timeout> 后端服务器半连接的空闲时长

第四章 ACL详解

haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其他的环境状态信息来做出转发决策,这大大增加了其配置弹性。其配置法则一般分为两部,首先定义ACL,既定义一个测试条件,而后在条件得到满足时执行某特定动作,如阻止访问或者转发至某特定的后端。

4.1 ACL语法

 acl <aclname> <criterion> [flags] [operator] [<value>] ...

4.2 语法详解

1、aclname

 ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl; 

2、criterion

  指明检查条件,测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在之前指定一个操作符[operator];
条件
dst 目标IP
 dst_port 目标PORT
 src 源IP
 src_port 源PORT
```shell
-------------------------------------------------------------------------------------------------
**3、[flags]:标识位 **
```shell
 -i:在匹配所有后续模式时忽略大小写。
 -f:从文件加载模式。
 -m:使用特定的模式匹配方法
 -n:禁止DNS解析
 -M:像地图文件一样加载-f指向的文件。
  -u:强制ACL的唯一标识
  -- :强制结束标志。

4、value类型

- boolean:真假
 - integer or integer range:整数值
 - IP address / network:IP地址、网络地址
 - string (exact, substring, suffix, prefix, subdir, domain)
  匹配指定的首部的值
  exact:精确匹配
  substring:子串匹配
  suffix:后缀匹配
  prefix:前缀匹配
  subdir:子路径匹配
  domain:域名子串匹配
 - regular expression:正则表达式匹配
 - hex block:16进制数字块

同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:“与”(默认即为与操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。

5、 [operator] 匹配整数值

eq、ge、gt、le、lt
 匹配字符串:
 -m method : 指定模式匹配方法
 其中flag中的 -m 选项可使用的模式匹配方法如下,需要说明的是有些方法已被默认指定无需声明,例如int,ip
 "found" : 只是用来探测数据流中是否存在指定数据,不进行任何比较
 "bool" : 检查结果返回布尔值。匹配没有模式,可以匹配布尔值或整数,不匹配0和false,其他值可以匹配
 "int" : 匹配整数类型数据;可以处理整数和布尔值类型样本,0代表false,1代表true
 "ip" : 匹配IPv4,IPv6地址类型数据。该模式仅被IP地址兼容,不需要特别指定
 "bin" : 匹配二进制数据
 "len" : 匹配样本的长度的整数值
 "str" : 精确匹配,根据字符串匹配文本
 "sub" : 子串匹配,匹配文本是否包含子串
 "reg" : 正则匹配,根据正则表达式列表匹配文本
 "beg" : 前缀匹配,检查文本是否以指定字符串开头
 "end" : 后缀匹配,检查文本是否以指定字符串结尾
 "dir" : 子目录匹配,检查部分文本中以" / "作为分隔符的内容是否含有指定字符串
 "dom" : 域匹配。检查部分文本中以" . "作为分隔符的内容是否含有指定字符串

第五章 配置HAProxy支持https协议

配置支持ssl会话
 bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE
 ssl:要求必须使用 ssl会话
 crt:指明证书文件路径 –> 证书和私钥都在这个文件内
 把80端口的请求重向定443
 bind *:80
  redirect scheme https if !{ ssl_fc }
 scheme:协议
 ssl_fc:如果请求的是非ssl前端的,则重定向(无需定义,因为是內建的,直接调用 ssl_fc)
 向后端传递用户请求的协议和端口
 http_request set-header X-Forwarded-Port %[dst_port]
 http_request add-header X-Forwared-Proto https if { ssl_fc }
原文地址:https://www.cnblogs.com/lijiansheng/p/11251100.html