Haproxy一些常用的参数汇总

Haproxy简介

HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。
在版本1.5之前Haproxy只支持单进程,1.5之后支持多进程,但是多进程工作往往会受到系统内存和调度器限制。

工作特点

Haproxy的工作特点如下:

  • 根据静态分配的cookie路由HTTP请求
  • 在确保服务器持久性的同时,在多个服务器之间传播负载通过使用HTTP cookie
  • 在主服务器发生故障时切换到备份服务器
  • 接受专用于服务监控的特殊端口的连接
  • 停止接受连接而不破坏现有连接
  • 在两个方向上添加,修改和删除HTTP标头
  • 阻止匹配特定模式的请求
  • 从被截获的URI向已通过身份验证的用户报告详细状态

Haproxy程序

安装haproxy

yum install haproxy -y

相关程序

  • 主程序:/usr/sbin/haproxy
  • 主配置文件:/etc/haproxy/haproxy.cfg
  • Unit file:/usr/lib/systemd/system/haproxy.service

主配置文件结构

官方配置文档:http://cbonte.github.io/haproxy-dconv/

global段常用参数

global配置段,用于设定全局配置参数;

进程及安全管理:chroot, daemon,user, group, uid, gid

  • log:定义全局的syslog服务器;最多可以定义两个;
  • nbproc :要启动的haproxy的进程数量;
  • ulimit-n :每个haproxy进程可打开的最大文件数;

性能调整

  • maxconn :设定每个haproxy进程所能接受的最大并发连接数;总体的并发连接数:nbproc * maxconn

  • maxconnrate : 每个进程每秒种所能创建的最大连接数量;

  • maxsessrate :设置进程每秒最大并发连接数,超过设定的值,代理将停止接受连接,比较重要的参数,用于保护措施

  • maxsslconn : 设定每个haproxy进程所能接受的ssl的最大并发连接数;

  • spread-checks <0..50, in percent> 避免对于后端检测同时并发造成的问题,设置错开时间比,范围0到50,一般设置2-5较好

代理配置段

代理配置段如defaults、listen、frontend和backend;

  • defaults:为frontend, listen, backend提供默认配置;

  • fronted:前端,定义请求连接类型,指定什么不同的请求转向不同后端backend,相当于nginx, server {}

  • backend:后端,定义后端代理的主机,相当于nginx, upstream {}
  • listen:部分定义了一个完整的代理,其前端和后端部分组合在一个部分中

注意:所有代理名称必须由大写和小写字母,数字,’ – ‘(短划线),’_’(下划线),’。’组成。 (点)和’:’(冒号)。区分字符大小写;

frontend 指令

ACL规则

访问控制列表(ACL)的使用提供了一种灵活的解决方案来执行内容切换,并且通常基于从请求,响应或任何环境状态中提取的内容来做出决策

例:

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             app

AcL使用很灵活,针对上面常用示例做一些常用指令的记录

acl < acl_name > < path > | < url > < flags > < 匹配规则 >

path : string

提取请求的URL路径,该路径从第一条斜杠开始并在问号之前结束

  • path_beg :路径前缀匹配

  • path_end :路径结尾匹配

  • path_dir : 路径目录匹配

  • path_dom : 域匹配

  • path_len : 长度匹配

  • path_reg :路径正则表达式匹配

  • path_sub : 路径子目录匹配

示例:

path_beg /images/
path_end .jpg .jpeg .png .gif
path_reg ^/images.*\.jpeg$
path_sub image 
path_dir jpegs
path_dom ilinux

url :string URL路径匹配

-url :链接精确字符串匹配

  • url_beg:链接前缀匹配

  • url_end : 链接后缀

  • url_dir : 链接子路径匹配

  • url_dom : 链接域匹配

  • url_len :链接长度匹配

  • url_reg : 链接正则表达式匹配

  • url_sub : 链接子字符串匹配

flags

  • I:在匹配所有后续模式时忽略实例。

  • m: 使用特定的模式匹配方法

  • n:禁止DNS解析

  • u : 强制ACL的唯一ID

  • — :迫使旗帜结束。当字符串看起来像一个标志时是有用的。

acl作为条件时的逻辑关系

  • if invalid_src invalid_port

  • if invalid_src || invalid_port

  • if ! invalid_src invalid_port

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             app
  • use_backend static : 如果满足url_static的规则,就调用名为static的后端服务

  • default_backend : 默认情况下调用app后端

其他指令

  • bind : 在前端定义一个或多个侦听地址和/或端口,可以用于以下部分:frontend和listen (还可以在frontend指令指定前端名称后直接指定端口,就不用再使用bind单独指定)

backend 指令

backend定义后端主机代理规则,其中包括调度算法balance,
主机定义指令server,其他选项option等指令

balance 定义调度算法

动态算法:支持权重的运行时调整,支持慢启动;每个后端中最多支持4095个server;

静态算法:不支持权重的运行时调整及慢启动;后端主机数量无上限;

  • roundrobin : (static-rr) 基于权重进行轮询

  • leastconn : 推荐使用在具有较长会话的场景中,例如MySQL、LDAP等;

  • first :根据服务器在列表中的位置,自上而下进行调度;前面服务器的连接数达到上限,新请求才会分配给下一台服务;

  • source :源地址hash;除权取余法:一致性哈希:
    source包含类型 hash-type:哈希算法:
    hash-type
    map-based:除权取余法,哈希数据结构是静态的数组;
    consistent:一致性哈希,哈希数据结构是一个树;

  • hdr() : 对于每个http请求,此处由指定的http首部将会被取出做hash计算; 并由服务器总权重相除以后派发至某挑出的服务器;没有有效值的会被轮询调度;

  • uri (hash-type) :对URI的左半部分做hash计算,并由服务器总权重相除以后派发至某挑出的服务器;

  • url_param : 对用户请求的uri的部分中的参数的值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server;

server 指令

为后端声明一个server,因此不能用于defaults和frontend段。

  • server < name > < address > [:port] [param*]

  • name:为此服务器指定的内部名称,其将出现在日志及警告信息中

  • address:此服务器的的IPv4地址,也支持使用可解析的主机名,只不过在启动时需要解析主机名至相应的IPv4地址

  • port:指定将连接请求所发往的此服务器时的目标端口,其为可选项;未设定时,将使用客户端请求时的同一相端口,在使用check时,此处端口必须定义,否则出错

  • param* : 为此服务器设定的一系参数;其可用的参数非常多,具体请参考官方文档中的说明,下面仅说明几个常用的参数;

server指令中可以使用的参数

  • maxconn :当前server的最大并发连接数

  • backlog : 超过最大并发连接数后的排队长度

  • active ;定义主机状态为活动状态

  • backup;备用状态,正常情况下不工作

  • check : 对当前server做监控状态监测

  • addr : 监测时使用的ip地址

  • port : 针对端口检测

  • inter : 连续两次检测之间的时间间隔 。默认2000毫秒(2秒)

  • rise: 连续多少次检测结果为成功才标记服务器为可用 ;默认为2

  • fall : 连续多少次检测结果为失败才标记服务器为不可用 ;默认为3

  • disabled : 标记服务器为不可用

  • redir : 将发送此server的请求重定向至指定的RUL

  • cookie :在浏览器请求头部添加cookie如: cookie server1

  • weight :权重,默认为1,最大值为256,0表示不参与负载均衡;

option部分指令

后端服务记录客户端真实ip

  • option httplog : 启用记录HTTP请求、会话状态和计时器的功能。

  • option forwardfor : 在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For”首部,其值是前端客户端的地址;用于向后端主发送真实的客户端IP; except ::请求报请来自此处指定的网络时不予添加此首部;

需要注意的是,HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部。如果想为每一个请求都附加此首部,请确保同时使用了“option httpclose”、“option forceclose”和“option http-server-close”几个option。

对后端服务器做http协议的健康状态检测

httpchk,smtpchk,mysql-check,等等为应用层检测 7 层
定义基于http协议的7层健康状态检测机制:

  • option httpchk :首页检测

  • option httpchk < uri > :指定URL检测

  • option httpchk < method > :指定请求方法与路径检测

  • option httpchk < method > < uri > < version > :指定请求方法与路径检测和http协议版本

method是使用的HTTP请求方法。 未设置时,使用“OPTIONS”方法

连接超时时长相关设置

在defaults段中可以定义,然后前端或后端中引用defaults中的定义生效

  • timeout client :客户端无响应超时时间. 默认单位是毫秒,1000毫秒=1秒;

  • timeout server : 服务端超时时间,最好与timeout client 超时保持相等

  • timeout http-keep-alive : 持久连接的持久时长;

  • timeout http-request :http请求超时时间

  • timeout connect :后端服务器最大连接超时时间,如果不设置会造成大量失败的会话连接占用资源

  • timeout client-fin : 为客户端设置半关闭连接的不活动超时。客户端接收确认信息的超时时间

  • timeout server-fin : 在服务器端设置非活动超时,默认情况没有设置。当服务器需要确认请求时,客户端已经关闭了连接,设置等待客户端却认响应的超时时长,这对于避免保持连接是特别有用的

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注