Haproxy

Haproxy

介绍:
haproxy是一个开源的反向代理负载均衡的软件,haproxy的实现基于事件驱动,默认使用单一进程,也最好使用单一进程,多进程可能会发生不稳的尴尬场面。
反向代理实现的时,使用了请求的重构,即以自身向后端申请资源,所以在请求时需要进行资源请求与客户端对应关系进行记录,该记录使用了特定的格式.该数据结构成为弹性二叉树.
代理作用:web缓存(加速)、反向代理、内容路由(根据流量及内容类型等将请求转发至特定服务器)、转码器;某些代理服务器会添加Via首部,声明此报文经过自己转发;
haproxy可以基于tcp与http的实现的负载均衡软件即工作在7层或伪四层。所以haproxy支持两种模式,http层次的代理与tcp层次的代理
工作与tcp模式下 ,如何处理报文。如同lvs仅做转发么 ?
工作于http模式下,将重构报文,即当haproxy接受到用户请求后,以自身为客户端重新向后端请求资源(在以自身为客户端想后端请求资源时,修改请求报文的过程称为重构),在接受到请求的资源时重新对报文封装(或者说改变报文首部信息)。
haproxy的http模式在通信流程上类似于lvs的nat模式,返回的数据同样要经过haproxy服务器但是lvs的nat模式是修改数据包.而haproxy是代理用户向后端服务器发送请求
haproxy具有对后端服务器状态检测功能,如果后端服务器发生故障,haproxy服务器会自动下线故障主机.haproxy故障检查功能优于nginx

haproxy的会话保持通过修改cookie进行保持会话,对于保持连接,只需要在客户端与代理服务器进行保持连接,而无需与后端进行保持连接.
对于https 协议 ,haproxy可以作为卸载器使用
haproxy作为反向代理服务器,理论上最大支持65535/2个并发数量并且haproxy 以管理员运行时,自身可以设置最大打开文件数量

haproxy的安装:
yum安装:
haproxy由epel源提供,所以在使用yum安装时需要配置epel源。
配置网络epel源
yum install epel-release
yum clean all
yum repolist
查看haproxy rpm包信息
yum info haproxy
安装
yum install haproxy -y
注:配置文件地址
配置文件:/etc/haproxy/haproxy.cfg

编译安装:
下载地址:
http://www.haproxy.org/download/1.4/src/haproxy-1.4.27.tar.gz
解压,进入文件夹. 进行编译
make TARGET=LINUX2628 ARCH=x86_64
查看是否编译成功
echo ?makePREFIX=/app/haproxyinstallecho ?
开启转发功能
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
创建必要目录在安装目录下
mkdir -p bin conf logs var/run var/chroot

配置:
配置文件路径:
yum安装:/etc/haproxy/haproxy.cfg
编译安装:安装路径下/examples/haproxy.cfg

配置文件结构
haproxy的配置文件分为多个段,每个段定义不同的内容。

全局段 global
主要控制程序的启动运行时的参数
默认的配置段 defaults
所有的除global外的段的默认参数值可以在此段中定义 或着说为 frontend backend listen 提供默认的参数
前端端口配置段 frontend
接受用户请求端口的配置 ,以及前端的过滤配置等 如设置监听的端口 ip地址,以及匹配用户请求中的域名,uri等
后端端口配置段 backend
定义后端的集群,以及集群的调度,以及发送给后端主机的包修改等
单一结构段:listen
在单一结构下(即只有一个前端与只有一个后端),前端与后端进行统一定义 ,此配置多用在status页面情况下

global段
daemon
以守护进程的方式运行
group 组名称
启动进程的组
user 用户名称
启动进程的用户名称

log <日志服务器的地址> <日志服务器的调用接口> <日志级别>
设置日志的保存地址
如: log 127.0.0.1:514 local0 info
注:日志功能需要配合linux的日志服务进行,
5系列修改配置文件/etc/syslog.conf
增加定义的日志接口 与保存的日志文件
6,7系列修改配置文件 /etc/rsyslog.conf
增加定义的日志接口与保存的日志文件
并打开网络监听端口(udp 514),haproxy使用的是网络接口
日志可以定义两个独立的日志,如一份定义至本机,一份定义至网络。但是每个配置段最多只能配置两个日志,即使是全局。

pidfile <文件路径>
设置存放保存启动进程号的文件

maxconn 最大的并发连接数值
设置每个进程的最大并发的连接数,在global中定义为全局设置.也可在frontend,Listen 中定义,定义为每前端的最大连接数

nbproc 设置启动的进程数
设置 启动的进程数 .尽量与cpu核数一致,

chroot 运行haproxy程序的路径
切换根目录

stats socket 套接字路径
当本地访问服务时,在本地使用的套接字路径

ulimit-n 最大打开的文件描述符数量
设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项

spread-checks <0..50, in percent>:
设定健康加测时间的补偿值
在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题,即某一时刻的网络负载过大;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长;最大数值为检测时间的前后相加之和应小于检测时间

tune.bufsize 每个连接的缓冲区大小
设定buffer的大小,同样的内存条件下,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的cookie信息;默认为16384,其可以在编译时修改,不过强烈建议使用默认值;

defaults段
mode {http|tcp|health}
设置使用的模式
http 为7层模式
tcp 为4层模式
health 为健康检测模式

listen段
listen 名称 [监听的套接字]
监听的套接字也可以使用 bind 进行声明,该关键字同时也是声明listen段的开始。

mode 指定的模式
指定 listen的工作模式,在不指定时,默认使用default配置段中的配置

设置状态信息页面
开启状态页面
stats enable
设置状态页面访问的uri
stats uri 路径
默认为 stats yri /admin?stats
设置用户认证
status auth 用户名:密码

设置负载均衡
balance 负载均衡策略
负载均衡的策略有 :roundrobin

定义后端主机
server 主机名称 主机web服务的套接字

frontend段
frontend 名称 [ip:端口]
监听的套接字也可以使用 bind 进行声明,该关键字同时也是声明frontend段的开始。而且可以允许端口与bind并存。

设置默认发送至的后端主机组
default_backend 主机组的名称

设置监听的端口
bind [

]: [, …]
bind [
]: [, …] interface
此指令仅能用于frontend和listen区段,用于定义一个或几个监听的套接字。
:可选选项,其可以为主机名、IPv4地址、IPv6地址或;省略此选项、将其指定为或0.0.0.0时,将监听当前系统的所有IPv4地址;
:可以是一个特定的TCP端口,也可是一个端口范围(如5005-5010),代理服务器将通过指定的端口来接收客户端请求;需要注意的是,每组监听的套接字在同一个实例上只能使用一次,而且小于1024的端口需要有特定权限的用户才能使用,这可能需要通过uid参数来定义;
:指定物理接口的名称,仅能在Linux系统上使用;其不能使用接口别名,而仅能使用物理接口名称,而且只有管理有权限指定绑定的物理接口;

可以连续指定多个套接字
例:
frontend main *:80
bind *:8080
bind *:8081

backend段
backend 主机组的名称
该关键字声明了后端的主机组,以及主机组的名称 。

设置组内主机的轮循模式
轮循方法有:roundrobin,static-rr,leastconn,source,url,url_param ,hdr,rdp-cookie。
roundrobin
基于权重进行轮循,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;

static-rr
基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;

leastconn
新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重

source
将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性

hash-type 的类型,或者说设置基于hash分配时的算法
map-based : 除模取余法,静态
hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。
consistent:一致性哈希,动态
hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。

url
对uri进行hash计算,并在haproxy内部维护一张对应关系表,以hash值为键,以后端主机为值
通过为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性
hash-type的类型,或者说设置基于hash分配时的算法
map-based : 除模取余法,静态
hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。
consistent:一致性哈希,动态
hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。

url_param
根据url中的param的值进行hash计算
通过为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性
hash-type的类型,设置基于hash分配时的算法
map-based : 除模取余法,静态
hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。
consistent:一致性哈希,动态
hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。

hdr
根据请求报文中的某个报文首部进行调度
对于每个HTTP请求,通过指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.magedu.com来说,仅计算magedu字符串的hash值)以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性
hash-typede 种类;设置基于hash分配时的算法
map-based : 除模取余法,静态
hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。
consistent:一致性哈希,动态
hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。

远程桌面协议
rdp-cookie
rdp-cookie(name):
这个是什么我不知道,回忆过去,

注:轮循方法分为两类,动态:权重可以动态调整,但是是服务器自行调整;静态:调整权重只有重启服务后才会生效
roundrobin :轮循,但是是加权轮循

设置组内的主机健康检测模式
关键字 option
option httpchk
option httpchk
option httpchk
option httpchk :不能用于frontend段,
例如:
backend https_relay
mode tcp
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www.magedu.com
server apache1 192.168.1.1:443 check port 80(检测时使用80端口)

设置组内的主机,及主机属性
格式:server 主机名称 套接字 相关属性
:为此服务器指定的内部名称,其将出现在日志及警告信息中;如果设定了”http-send-server-name”,它还将被添加至发往此服务器的请求首部中;

:此服务器的的IPv4地址,也支持使用可解析的主机名,只不过在启动时需要解析主机名至相应的IPv4地址;
[:port]:指定将连接请求所发往的此服务器时的目标端口,其为可选项;未设定时,将使用客户端请求时的同一相端口;

相关属性说明:
check (进行健康检测):
启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,
inter :设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;
rise :设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;
fall :确认server从正常状态转换为不可用状态需要检查的次数

backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;

cookic
进行cookie后端主机进行绑定,妈的这是个沉重的话题,我他娘的没学会
在backend中声明cookie的使用属性
如 :cookie SERVERID insert nocache indirect
并在server 中进行声明cookie值
如 : cookie web2

maxconn
后端服务器能接收的最大并发连接数

maxqueue
设定请求队列中的最大连接数

observe
通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;

weight
设置后端服务主机的权重
weight
权重,默认为1,最大值为256,0表示不参与负载均衡;

redir
启用url重定向
redir :启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;
例如:
server srv1 172.16.100.6:80 redir http://imageserver.magedu.com check

其他相关配置:

日志
定义关键字 log
格式
log global 调用全局配置中的日志设置
log

[ []] 定义转发至的日志服务器
为每个实例启用事件和流量日志,因此可用于所有区段。每个实例最多可以指定两个log参数,即每个配置段只能定义两个日志.如Listen ,backend等.但是如果全局定义段中定义了两个日志,而在其他段中引用了全局日志,“log global”因为”global”段已经定了两个log参数时,在log global后再次定义的日志设为多余的log参数,将被忽略.
global:当前实例的日志系统参数同”global”段中的定义时,将使用此格式;每个实例仅能定义一次“log global”语句,且其没有任何额外参数;
:定义日志发往的位置,其格式之一可以为,其中的port为UDP协议端口,默认为514;格式之二为Unix套接字文件路径,但需要留心chroot应用及用户的读写权限;
:可以为syslog系统的标准facility之一;
:定义日志级别,即输出信息过滤器,默认为所有信息;指定级别时,所有等于或高于此级别的日志信息将会被发送

接入连接数
定义关键字 maxconn
格式
maxconn <最大的连接数>
设置最大的连接数 该配置可以定义在 global,frontend ,Listen中,在global中定义时为全局最大连接数,在frontend,listen中定义为每个前端接入点的最大连接数.
设定一个前端的最大并发连接数,因此,其不能用于backend区段。对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,从而避免无法应答用户请求。当然,此最大值不能超出“global”段中的定义。此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,再加上其它的数据,每个连接将大约占用17KB的RAM空间。这意味着经过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发连接。
如果为指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,这可能会带来意想不到的结果;因此,将其设定了一个可接受值方为明智决定。其默认为200

访问控制
http-request { allow | deny | auth [realm ] }[ { if | unless } ]
当存在两个判断条件时,需要同时满足两个条件

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

定义ACL的语法格式如下:acl [flags] [operator] …
:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;当acl名称有两个重名时只需要满足其中一个条件.

:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在之前指定一个操作符[operator];

be_sess_rate(backend)
用于测试指定的backend上会话创建的速率(即每秒创建的会话数)是否满足指定的条件;常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为。例如:

backend dynamic
    mode http
    acl being_scanned be_sess_rate gt 50
    redirect location /error_pages/denied.html if being_scanned

fe_sess_rate(frontend)
用于测试指定的frontend(或当前frontend)上的会话创建速率是否满足指定的条件;常用于为frontend指定一个合理的会话创建速率的上限以防止服务被滥用。例如下面的例子限定入站邮件速率不能大于50封/秒,所有在此指定范围之外的请求都将被延时50毫秒。

frontend mail
    bind :25
    mode tcp
    maxconn 500
    acl too_fast fe_sess_rate ge 50
    tcp-request inspect-delay 50ms
    tcp-request content accept if ! too_fast
    tcp-request content accept if WAIT_END

hdr(header)
用于测试请求报文中的所有首部或指定首部是否满足指定的条件;指定首部时,其名称不区分大小写,且在括号“()”中不能有任何多余的空白字符。测试服务器端的响应报文时可以使用shdr()。例如下面的例子用于测试首部Connection的值是否为close。
hdr(Connection) -i close

method
测试HTTP请求报文中使用的方法。

path_beg
用于测试请求的URL是否以指定的模式开头。下面的例子用于测试URL是否以/static、/images、/javascript或/stylesheets头。
acl url_static path_beg -i /static /images /javascript /stylesheets

path_end
用于测试请求的URL是否以指定的模式结尾。例如,下面的例子用户测试URL是否以jpg、gif、png、css或js结尾。
acl url_static path_end -i .jpg .gif .png .css .js

hdr_beg(header)
用于测试请求报文的指定首部的开头部分是否符合指定的模式。例如,下面的例子用记测试请求是否为提供静态内容的主机img、video、download或ftp。
acl host_static hdr_beg(host) -i img. video. download. ftp.

hdr_end
用于测试请求报文的指定首部的结尾部分是否符合指定的模式

path_reg
路径是否符合正则表达式

url_reg
url是否符合正则表达式

[flags]:目前haproxy的acl支持的标志位有3个:
-i:不区分中模式字符的大小写;
-f:从指定的文件中加载模式;
–:标志符的强制结束标记,在模式中的字符串像标记符时使用;

:acl测试条件支持的值有以下四类:
整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;
字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在其之前使用“–”标志位;
正则表达式:其机制类同字符串匹配;
IP地址及网络地址

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

acl acl名称 条件 条件的值
acl nagios src 192.168.129.3
src:源地址

设置使用的后端接入点
指明特定的接入点.
但是需要符合给出的acl即条件只是条件定义在acl中,又称为条件式后端调用
use_backend
只能在frontend中声明
指明默认的接入点
default_backend
只能在frontend/default中声明

设置状态统计页
关键字 stats
stats enable
开启统计页面
stats admin { if | unless }
开启状态页的管理功能
在指定的条件满足时启用统计报告页面的管理级别功能,它允许通过web接口启用或禁用服务器,不过,基于安全的角度考虑,统计报告页面应该尽可能为只读的。此外,如果启用了HAProxy的多进程模式,启用此管理级别将有可能导致异常行为。
目前来说,POST请求方法被限制于仅能使用缓冲区减去保留部分之外的空间,因此,服务器列表不能过长,否则,此请求将无法正常工作。因此,建议一次仅调整少数几个服务器。下面是两个案例,第一个限制了仅能在本机打开报告页面时启用管理级别功能,第二个定义了仅允许通过认证的用户使用管理级别功能。
仅本机才能开启管理功能
backend stats_localhost
stats enable
stats admin if LOCALHOST
通过验证的用户才能开启管理功能
backend stats_auth
stats enable
stats auth haproxyadmin:password
stats admin if TRUE
启用基于程序编译时默认设置的统计报告,不能用于“frontend”区段。只要没有另外的其它设定,它们就会使用如下的配置:
- stats uri : /haproxy?stats 统计状态页地址
- stats realm : “HAProxy Statistics” 统计状态页提示信息
- stats auth : no authentication 统计状态页的验证信息
- stats scope : no restriction
例:
backend public_www
server websrv1 172.16.100.11:80
stats enable
stats hide-version /隐藏版本号
stats scope . /作用域为自身,即stats
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth statsadmin:password
stats auth statsmaster:password

记录报文中的指定首部信息
记录至日志中
请求报文首部
capture request header len
捕获并记录指定的请求首部最近一次出现时的第一个值,仅能用于“frontend”和“listen”区段。捕获的首部值使用花括号{}括起来后添加进日志中。如果需要捕获多个首部值,它们将以指定的次序出现在日志文件中,并以竖线“|”作为分隔符。不存在的首部记录为空字符串,最常需要捕获的首部包括在虚拟主机环境中使用的“Host”、上传请求首部中的“Content-length”、快速区别真实用户和网络机器人的“User-agent”,以及代理环境中记录真实请求来源的“X-Forward-For”。
:要捕获的首部的名称,此名称不区分字符大小写,但建议与它们出现在首部中的格式相同,比如大写首字母。需要注意的是,记录在日志中的是首部对应的值,而非首部名称。
:指定记录首部值时所记录的精确长度,超出的部分将会被忽略。
可以捕获的请求首部的个数没有限制,但每个捕获最多只能记录64个字符。为了保证同一个frontend中日志格式的统一性,首部捕获仅能在frontend中定义。
响应报文首部
capture response header len
格式与响应报文首部捕获方法一致

启用日志记录的HTTP请求、会话状态和计时器的功能。
option httplog [ clf ]
启用记录HTTP请求、会话状态和计时器的功能。
clf:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。
默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。

启用或禁用提前将HTTP请求记入日志,
不能用于“backend”区段
option logasap
no option logasap
默认情况下,HTTP请求是在请求结束时进行记录以便能将其整体传输时长和字节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。“option logasap”参数能够在服务器发送complete首部时即时记录日志,只不过,此时将不记录整体传输时长和字节数。此情形下,捕获“Content-Length”响应首部来记录传输的字节数是一个较好选择。下面是一个例子。

允许在发往服务器的请求首部中插入“X-Forwarded-For”首部
option forwardfor [ except ] [ header ] [ if-none ]
允许在发往服务器的请求首部中插入“X-Forwarded-For”首部。
HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,“X-Forwarded-For”首部则可用于解决此问题。HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。
需要注意的是,HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部。如果想为每一个请求都附加此首部,请确保同时使用了“option httpclose”、“option forceclose”和“option http-server-close”几个option。
:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能。
:可选参数,可使用一个自定义的首部,如“X-Client”来替代“X-Forwarded-For”。有些独特的web服务器的确需要用于一个独特的首部。
if-none:仅在此首部不存在时才将其添加至请求报文问道中.
例:
frontend www
mode http
option forwardfor except 127.0.0.1

在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码
次选项返回的是文件
errorfile
在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于所有段中。
:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;
:指定用于响应的页面文件;
如:
errorfile 400 /etc/haproxy/errorpages/400badreq.http
errorfile 403 /etc/haproxy/errorpages/403forbid.http
errorfile 503 /etc/haproxy/errorpages/503sorry.http

在用户请求不存在的页面时,返回一个HTTP重定向至某URL的信息;
此选项返回的是url
errorloc
返回的状态码为 302 与 errorloc302无区别
errorloc302
errorloc303
返回的状态码为303
请求错误时,返回一个HTTP重定向至某URL的信息;可用于所有配置段中。
需要留意的是,这两个关键字都会返回302状态吗,这将使得客户端使用同样的HTTP方法获取指定的URL,对于非GET方法的场景(如POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其它方法的。如果的确有这种问题,可以使用errorloc303来返回303状态码给客户端。
:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;
:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;
如:
backend webserver
server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie srv01
server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srv02
errorfile 403 /etc/haproxy/errorpages/sorry.htm
errorfile 503 /etc/haproxy/errorpages/sorry.htm

当使用长连接时haproxy服务器主动发断开条件
option http-server-close
no option http-server-close

URL重定向
redirect location [code ] [{if |unless} ]
redirect prefix [code ] [{if |unless} ]
例:
acl clear dst_port 80
acl secure dst_port 8080
acl login_page url_beg /login
acl logout url_beg /logout
acl uid_given url_reg /login?userid=[^&]+
acl cookie_set hdr_sub(cookie) SEEN=1
redirect prefix https://magedu.com set-cookie SEEN=1 if !cookie_set
redirect prefix https://magedu.com if login_page !secure
redirect prefix http://magedu.com drop-query if login_page !uid_given
redirect location http://www.magedu.com/ if !login_page secure
redirect location / clear-cookie USERID= if logout

向经过haproxy的报文添加首部
向发送至后端主机的报文添加首部
reqadd
reqadd [{if | unless} ]
向响应客户主机的报文添加首部
rspadd

主程序
haproxy
指明配置文件
-f 配置文件路径
检查配置文件语法
-c
haproxy -f 配置文件路径 -c
以daemon 模式运行
-D
haproxy -f 配置文件路径 -D
-n 并发连接数
-m 限制内存使用数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值