当前位置:首页 > 资讯 > 正文

Haproxy(二)环境搭建和参数记录

Haproxy(二)环境搭建和参数记录

一晃做运维好多年了,这些年来一说负载均衡,反向代理最常提到的就是lvs,nginx,haproxy,虽然haproxy现在听到的越来越少,不过确实也是一款不错的软件。前面已经对nginx反向代理进行了记录,虽然已经好几年不用haproxy了,但是还是想做下记录,可能写的不够深刻。

1.1 简介      

      HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。
      HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。 
      HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

官网地址:http://www.haproxy.com/

下载地址:http://www.haproxy.org/download

文档教程:http://www.haproxy.com/support/faq/

1.2 haproxy的安装

yum安装:

#  yum install haproxy -y   #现在yum源的rpm包才到1.5版本

源码安装:

#yum install pisc openssl openssl-devel install libnl* libnfnetlink-devel pcre pcre-devel -y

# wget www.haproxy.org/download/1.7/src/haproxy-1.7.8.tar.gz
# tar zxf haproxy-1.7.8.tar.gz 
# cd haproxy-1.7.8

# make TARGET=linux26 ARCH=x86_64  ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 USE_PCRE_JIT=1    

#必须要指定的linux26就是执行的内核版本号是2.6,x86_64指定架构为x86架构,注:如果是Centos7.2的版本就要:# make TARGET=linux31 ARCH=x86_64

# make install PREFIX=/usr/local/haproxy-1.7.8  #将程序安装到指定的位置,其实指定也没用,只是多放一个位置而已里面也没多少东西。

# ln -s /usr/local/haproxy-1.7.8  /usr/local/haproxy

# cp examples/haproxy.init  /etc/init.d/haproxy

# chmod +x /etc/init.d/haproxy

# ln -s /usr/local/haproxy/in/haproxy  /usr/in/

# haproxy -v

# haproxy -vv  #可以查看详细信息,看看有什么问题没有

1.3 man帮助

# man haproxy

概要:
描述:

HAProxy是一种特别适合高可用性环境的TCP/HTTP反向代理。的确,它可以:

选项:
信号(SIGNALS):

更详细的,在安装包的下面:doc/configuration.txt   #这个文件详细了记录了haproxy的配置

2.1 配置haproxy并启动

# useradd haproxy -u 500 -s /in/nologin -M

# mkdir /etc/haproxy

# vim /etc/haproxy/haproxy.cfg

# mkdir /usr/local/haproxy/data/haproxy -p

# chown haproxy:haproxy /usr/local/haproxy/data/haproxy

# /etc/init.d/haproxy start    #如果启动有问题,# tail -f /var/log/messages 看看日志提示你什么。是配置那个地方写的有问题

#当然也能用这种启动方式:/usr/local/haproxy/in/haproxy -f /etc/haproxy/haproxy.cfg  -c

2.2 简单测试

访问status状态页:

访问url:  http://192.168.1.36:1080/haproxy?stats

#输入账号admin,密码admin

#从上图就是status状态页

测试反向代理效果:

访问url:http://192.168.1.36/1.txt

#在后端两个nginx服务器上面都写了一个1.txt,里面的内容是各自的IP,用来标识。

#用CTRL+F5强制刷新几次,看是否能实现页面的内容改变。

2.3 配置Haproxy的日志

安装完haproxy后,默认情况下,HAProxy为了节省读写IO所消耗的性能,默认情况下没有日志输出,如果在搭建之初想记录下日志的话,可以像下面这样搞。

配置/etc/rsyslog.conf:
配置/etc/sysconfig/rsyslog修改rsyslog的启动参数:

# vim  /etc/sysconfig/rsyslog   #配置rsyslog的主配置文件,开启远程日志

重启rsyslog并测试:

# service rsyslog restart

# tail -f /var/log/haproxy.log   #日志产生了

#用 logrotate 进行日志切分就不记录了,因为一般也不会记录haproxy的日志信息,如果要记录记得做好日志切分。

3.1 快速提醒有关HTTP

当haproxy以HTTP模式运行时,请求和响应都是完全分析和索引,从而可以建立匹配标准几乎在内容中找到的东西。

HTTP事务模型

        HTTP协议是事务驱动的。 这意味着每个请求都会导致只有一个回应。 传统上,建立了TCP连接从客户端到服务器,请求由客户端发送连接,服务器响应并且连接被关闭。一个新的请求将涉及一个新的连接,在这种模式下,称为“HTTP close”模式,连接数量一样多因为有HTTP事务。 由于连接关闭由服务器响应后,客户端不需要知道内容长度。

       由于协议的交易性质,有可能改进以避免关闭两个后续事务之间的连接。 在这种模式下但是,服务器必须指出每个内容的长度响应,以便客户端不会无限期地等待。 为此,一个特别的头使用:“Content-length”。 此模式称为“keep-alive”模式,它的优点是减少了事务间的延迟,减少了处理服务器端所需的电源。 一般比关闭模式好,但并不总是因为客户端经常限制其并发连接一个较小的值

       通信的最后一个改进是流水线模式。 它仍然使用保持keep-alive,但客户端不等待第一个响应发送第二个请求 这对于获取大量的构图图像非常有用。这显然对网络性能有很大的好处在后续请求之间消除延迟。 许多HTTP代理没有
正确支持流水线,因为无法将响应关联HTTP中的相应请求。 因此,这是强制性的服务器以与接收到的请求完全相同的顺序进行回复。

       默认情况下,HAProxy关于持久性在keep-alive模式下运行连接:对于每个连接,它处理每个请求和响应,以及使连接在响应结束的两端之间空闲开始一个新的请求。

       HAProxy支持5种连接方式:

HTTP请求

请求例子:GET /serv/login.php?lang=en&profile=2 HTTP/1.1

URI本身可以有几种形式:

HTTP响应

HTTP响应看起来非常像HTTP请求。 两者都称为HTTP消息。

第1行是“响应行”。 它总是由3个字段组成:

状态码始终为3位数。 第一位数字表示一般状态:

Haproxy本身可能会发出以下状态代码:

#响应标头与请求标头完全一样,因此HAProxy使用两者的解析功能相同。

3.2 配置HAProxy

配置文件格式

HAProxy的配置过程涉及3个主要参数来源:

引用和转义

HAProxy的配置引入了类似的引用和转义系统许多编程语言。 配置文件支持3种类型:转义反斜杠,双引号弱引号,强引用单引号。

通过反斜杠('')前面的特殊字符来实现转义:

弱引号通过使用双引号("")来实现。弱引用阻止解释:

环境变量

HAProxy的配置支持环境变量。 这些变量仅在双引号内解释。 在配置解析期间扩展变量。 变量名称前面必须有$和可选地用括号{}括起来,与Bourne shell中所做的一样。 变量名称可以包含字母数字字符或字符下划线(“_”),但不能以数字开头。

例:

时间格式

一些参数涉及表示时间的值,例如超时。 这些值通常以毫秒表示(除非明确说明否则可以用任何其他单位来表示数值。 重要的是要考虑这一点,因为它不会重复为每个关键字 支持的单位有:

3.3 全局参数

“global”部分支持以下关键字:

流程管理和安全:
性能调优:
调试:
用户列表:

可以控制对前端/后端/监听部分的访问http统计信息只允许经过身份验证和授权的用户。 为此,需要创建至少一个用户列表并定义用户。

Peers:

可以以多主机方式通过TCP连接在几个haproxy实例之间的条形表中传播任何数据类型的条目。 

Mailers:

当服务器状态发生变化时,可以发送电子邮件警报。如果配置的电子邮件警报发送到配置的每个邮件程序在邮件部分。 使用SMTP将电子邮件发送给邮件服务器。

3.4 代理设置

代理配置可以位于一组部分中:

现在,支持两种主要的代理模式:“tcp”,也称为第4层,“http”也称为第7层。在第4层模式下,HAProxy简单地在双方之间转发双向流量。 在第7层模式下,HAProxy分析协议,并可以通过允许,阻止,切换,添加,修改或删除请求或响应中的任意内容,基于任意条件与之进行交互。

Proxy keywords matrix:

按字母排序的关键字:

负载均衡的算法: 

roundrobin  #动态加权轮询算法,支持权重的运行时调整及慢启动机制;最大支持4095个后端主机;

static-rr       #静态轮询算法,不支持权重的运行时调整和慢启动机制,但后端主机数量无限制;

leastconn    #连接数量最少的服务器接收连接。推荐在较长时间会话的场景中使用,例如:LDAP/MYSQL等协议;

first  #根据服务器在列表中的位置,自上而下进行调度;前面服务器连接数达到上限,新请求将调度至下一个服务器;适用于会话较长的tcp连接;

source  #源地址hash,默认情况下,该算法是静态的,这意味着即时更改服务器的权重将不起作用,但可以使用“hash-type”进行更改。

uri   #对uri的左半部分或整个uri做hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;作用是能够将对同一个uri的请求始终发往一个后端主机;适用于后端为缓存服务器的场景;

url_param   #对用户请求的uri中的<params>中的参数的值做hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;此算法常用来追踪请求中的用户标识,以确保来自同一个用户的请求始终发往同一个后端主机;

hdr(<name>)  #对于每个http请求,此处由<name>指定的http首部会被取出;如果此首部没有有效值,则轮询调度;否则,对其值进行hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;

rdp-cookie(<name>)   #将是查找和散列每个传入的TCP请求。 就像与等效的ACL'req_rdp_cookie()'函数,名称不区分大小写。 这种机制是有用的降解持久化模式,因为它可以始终发送相同的用户(或相同的会话ID)到相同的服务器。

3.5 绑定和服务器选项

The "bind", "server" and "default-server" 关键字支持多个设置取决于一些构建选项,而在系统上构建了HAProxy。 这些设置通常每个都包含一个字,后面是一个值,写在与“绑定”或“服务器”行相同的行上。

绑定选项:
服务器和默认服务器选项:
使用DNS的服务器IP地址解析:

resolvers <resolvers id>   #创建一个新的名称服务器列表,标签为<resolvers id>,解析器部分接受以下参数:

3.6 HTTP头操作

在HTTP模式下,可以重写,添加或删除一些请求基于正则表达式的响应头。 也可以阻止a如果特定头部匹配正则表达式,请求或响应,这足以阻止大多数基本协议攻击,并保护防止来自内部网络的信息泄漏。

#使用所有这些关键字,使用相同的约定。 <search>参数是支持分组的POSIX扩展正则表达式(正则表达式)括号(没有反斜杠)。 空格和其他分隔符必须是前缀为反斜杠(''),以避免与字段分隔符混淆。其他字符可能带有反斜杠以改变其含义:

#<replace>参数包含用于替换匹配正则表达式的文本的最大部分的字符串。 它可以使用上面的特殊字符,并且可以通过直接写入反斜杠('')后跟一个数字从0到9来引用正则表达式中由括号分隔的子字符串,指示组位置(0指定 全线)。 这种做法对于“sed”程序的用户非常普遍。

#<string>参数表示将被系统添加的字符串在最后一个标题行之后。 它也可以使用上面的特殊字符序列。

3.7 使用ACL

ACL基础知识:

使用“acl”关键字。语法是:  acl <aclname> <criteria> [flags] [operator] [<value>] ...

 ACL名称区分大小写,这意味着“my_acl”和“My_Acl”是两种不同的ACL。

目前支持以下ACL标志:

但是有一些限制。并不是所有的方法都可以用于所有方法取样方法。另外,如果将“-m”与“-f”结合使用,则必须放在第一位模式匹配方法必须是以下之一:

匹配布尔:

为了匹配布尔值,不需要任何值,所有值都将被忽略。对于类型“boolean”的所有提取方法,默认使用布尔匹配。当使用布尔匹配时,获取的值将按原样返回,这意味着布尔值“true”将始终匹配,布尔值“false”将永远不匹配。
布尔匹配也可以在fetch方法中使用“-m bool”强制执行返回一个整数值。 然后,将整数值0转换为布尔值“false”和所有其他值将转换为“true”。

匹配整数:

整数匹配默认适用于整数提取方法。也可以使用“-m int”强制执行布尔获取。在这种情况下,“false”被转换到整数0,“true”转换为整数1。整数匹配还支持整数范围和运算符。注意整数匹配仅适用于正值。

整数匹配的可用运算符是:eq、ge、gt、le、lt

匹配字符串:

字符串匹配适用于字符串或二进制获取方法,并存在于6种不同形式:

匹配正则表达式(正则表达式):

就像使用字符串匹配一样,正则表达式匹配适用于逐字字符串,因为它们被传递,除了反斜杠(“”)之外,可以转义一些字符,如空格。 如果“-i”标志在第一个正则表达式之前通过,则将忽略该情况进行匹配。 为了匹配字符串“-i”,请将其设置为第二个,或者在第一个字符串之前传递“ -- ”标志。 当然,匹配字符串“ ---”也是一样的。

匹配任意数据块:

可以将某些提取的样本与可能的二进制块进行匹配不能安全地表示为字符串。 为此,模式必须传递为当匹配方法设置时,一系列十六进制数字以偶数编号到二进制。 两位数字的每个序列都将代表一个字节。 十六进制
数字可以用大写或小写。如:

匹配IPv4和IPv6地址:

使用ACL形成条件:

一些操作仅在有效条件下执行。 条件是ACL与运算符的组合。 支持3个条件:AND、OR、!,这种条件通常在“if”或“unless”语句之后使用,指示条件何时触发动作。

要在“www”站点上以及“img”,“视频”,“下载”和“ftp”主机上的每个请求中选择不同的后端请求静态内容:

转换:

目前可用的转换关键字列表包括:

#还可以从内部状态获取样品这里就不记录了。

在第4层获取样品:

在第5层取样:不记录了

从缓冲区内容中获取样本(第6层):不记录了

获取HTTP样本(第7层)

预定义ACL:

一些预定义的ACL是硬编码的,因此它们不需要在需要它们的每个前端中声明。 他们都有大写的名字,以避免混淆。 他们的等同性在下面提供。

3.8 Logging

Log levels:

可以记录TCP和HTTP连接,其中包括日期,时间,源IP地址,目的地址,连接持续时间,响应时间,HTTP请求,HTTP返回码,发送的字节数,会话结束的条件,甚至交换cookie值。 例如跟踪特定用户的问题。

Log formats:

HAProxy支持5种日志格式。 这些格式之间的几个字段是常见的,下面将详细介绍。 由于特定选项特定的指标,其中一些可能会因配置而略有不同。 支持的格式如下: