haproxy配置参考
技术分享|2020-4-17|最后更新: 2023-9-4
type
status
date
slug
summary
tags
category
icon
password
order
HAProxy的配置文件为/etc/haproxy/haproxy.cfg

配置文件结构

  • global:全局配置段
    • 进程及安全配置相关的参数
    • 性能调整相关参数
    • Debug参数
  • proxies:代理配置段
    • defaults:为frontend, listen, backend提供默认配置
    • fronted:描述了一组接受客户端连接的侦听套接字
    • backend:代理将连接到的一组服务器以转发传入连接
    • listen:定义一个完整的代理,其前端和后端部分组合在一个部分中

global常用配置项

进程及安全配置相关的参数
  • chroot :将当前目录更改为并在之前执行chroot(),如果HAProxy被攻破了,也只能得到一个假的根环境,安全方面的设置
  • deamon:运行在前台或者后台
  • user:运行HAProxy进程的用户
  • group:运行HAProxy进程的组
  • uid:运行HAProxy进程的uid
  • gid:运行HAProxy进程的gid
  • nbproc :要启动的haproxy的进程数量;默认为1个,推荐为1个
  • ulimit-n :每个haproxy进程可打开的最大文件数;会自动计算一个最佳的数字,建议不修改
性能调整参数
虽然说是调整性能的参数,但是一般情况下没有特殊需求,不建议修改
  • maxconn :设定每个haproxy进程所能接受的最大并发连接数;
  • maxconnrate : 每个进程每秒种所能创建的最大连接数量;
  • maxsessrate :每个进程每秒钟所能创建的最大数量
  • maxsslconn : 设定每个进程所能接受的最大ssl并发连接数
  • spread-checks <0…50, in percent> :如果后端主机太多,为了避免同一时刻检查的主机数量太多,这里可以错峰检查。也就是提前或者延后一段时间检查,最多设置不能超过总长的百分之50,比如检测总时长是2s,如果提前或延后超过1s,则上一次的检查和这一次检查很可能会重叠,这时候就会出问题。

proxies常用的配置项

负载均衡算法
  • balance roundrobin 基于权重进行轮询,在服务器的处理时间保持均匀分布时 ,这是最平衡、最公平的算法。此算法是动态的,这表示某权重可以在运行时进行调整
  • balance static-rr 基于权重进行轮询,与roundrobin类似,但是他是静态方法,在运行时调整期后端权重不会生效,不过,其在后端服务器连接数上没有限制
  • balance leastconn 最少连接者先处理,在有这较长会话的场景中推荐使用此算法,如LDAP、SQL等。其并不太适合用于较短会话的应用层协议,如HTTP,此算法是动态的,可以在运行时调整其权重
  • balance source 将请求的源地址进行hash运算,并有后端的服务器的权重总数相处后派发至某匹配的服务器,这可以使得同一个客户端IP的请求始终被派发至某特定的服务器,不过,当服务器权重总数发生变化时,如某服务器宕机或者添加新服务器,许多的请求可能会被派发至与此前请求不同的服务器,常用于负载均衡无cooki功能的基于TCP的协议,默认为动态,不过可以使用hash-type修改此特性
  • balance uri 对URI的左半部分(“问号”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器,这可以使得对同一个URI的请求总是派发至某个匹配的服务器,除非服务器的权重总数发生了变化,此算法常用于代理缓存或反向代理以提高缓存的命中率,需要注意的是,此算法仅应用于HTTP后端服务器场景,其默认为静态算法,不过可以使用hash-type修改此特性
  • balance url_param 通过URL指定的参数在每个HTTP GET请求中将会被索引,如果过找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某个匹配的服务器,此算法可以通过追踪请求中的用户标识进而确保同一个用户的ID请求被发送同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮询算法对其响应请求进行调度,此算法默认为静态,不过可以使用hash-type修改此特性
hash-type 哈希算法
格式:hash-type <method> <function> <modifier>
method有:
  • map-based:除权取余法,哈希数据结构是静态的数组
  • consistent:一致性哈希,哈希数据结构是一个树
server后端主机选项
mode haproxy工作模式
  • tcp:实例运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查;此为默认模式,通常用于SSL、SSH、SMTP等应用
  • http:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝
  • health:工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接;

HTTP相关

cookie
用户访问服务器,haproxy转发到后端服务器。这时候由haproxy返回给用户的时候,可以操作报文首部,我们可以打个标记在cookie字段插入一个键值对。键为cookie的name,值为后端服务器设置的cookie名,从而做到session sticky。
option forwardfor
在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For”首部,其值前端客户端的地址;用于向后端主发送真实的客户端IP
errorfile
返回设置的错误码的对应文件
errorloc
errorfile返回一个本地文件,这里的errorloc类似重定向一个uri
reqadd
请求报文中添加首部
rspadd
响应报文中添加首部
reqdel
删除请求报文首部
rspdel
删除响应报文首部
压缩相关参数
对后端服务器做http协议的健康状态检测的常用配置项
连接超时时长常用配置项
http-request
第7层请求的访问控制

日志相关设置

统计接口相关参数

ACL相关

use_backend
当符合指定的条件时使用特定的backend
block
满足条件的情况下,阻止/放行第7层请求
tcp-request connection
根据第4层条件对传入连接执行操作
acl访问控制列表

示例配置

动静分离
nginx+springboot+mysql+redis
 
Spring MVC使用JWT做token验证docker运行springboot+haproxy+mysql+redis