# 28.2 haproxy 配置
haproxy 配置
![HA](/images/linux_mt/linux_slb.jpg)
本节开始我们来学习 haproxy 的配置。haproxy 有众多的配置选项,我打算将其分为两个部分,第一部分为haproxy 的全局配置,以及常用的代理段配置,第二部分为 haproxy 的访问控制。本节为的一部分,内容包括
1. global 全局配置
- 进程及安全管理
- 性能调整
2. 代理段配置
- 前端服务配置
- 后端主机配置
- haproxy 状态统计及管理页面配置
- 自定义错误页
- 首部处理
- 日志配置
## 1. global配置参数
### 1.1 进程及安全管理
````
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
````
`deamon`
- 作用: 以后端服务的方式运行 haproxy
`log
[len ] [max level [min level]]`
- 作用: 定义全局的syslog服务器;最多可以定义两个;
`nbproc `
- 作用: 要启动的haproxy的进程数量
- 默认: 启动一个进程,无需修改
`ulimit-n `
- 作用: 每个haproxy进程可打开的最大文件数
- 默认: haproxy 会自动调整,无需配置
## 1.2 性能调整:
`maxconn `
- 作用: 设定每个haproxy进程所能接受的最大并发连接数;
`maxsslconn `
- 作用: 设定每个haproxy进程所能接受的最大 sll 并发连接数;
`maxconnrate `
- 作用: 设定每个进程每秒种所能创建的最大连接数量;
`maxsessrate `
- 作用: 设定每个进程每秒种所能创建的最大会话数量;
`spread-checks <0..50, in percent>`
- 作用: 设置后端服务器状态检测的速率偏斜,以免同时对所有后端主机进行状态检测,占用太多带宽
## 2. 代理配置段
与 nginx 类似,代理配置段内的参数有受限的应用范围,下面是常用的配置参数
### 2.1 前端服务配置
#### mode
`mode { tcp|http|health }`
- 作用: 定义haproxy的工作模式;
- 参数:
- tcp: 基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议;
- http: 仅当代理的协议为http时使用;
- health: 工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接;
```
listen ssh
bind :22022
balance leastconn
mode tcp
server sshsrv1 172.16.100.6:22 check
server sshsrv2 172.16.100.7:22 check
```
#### bind
`bind []: [, ...] [param*]`
- 作用: 定义前端服务监听的地址和端口
```
listen http_proxy
bind :80,:443 # 监听多个端口
bind 10.0.0.1:10080,10.0.0.1:10443
bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy # 监听本地 sock
```
#### default_backend
`default_backend `
- 作用: 设定默认的backend,用于frontend中
#### maxconn
`maxconn `:
- 作用: 为指定的frontend定义其最大并发连接数;默认为2000;
- 说明: 如果未设置,会继承 global 中的配置
## 2.2 后端主机配置
#### balance
`balance [ ]`
`balance url_param [check_post]`
- 作用: 定义后端服务器组内的服务器调度算法
- `algorithm`: 算法
- `roundrobin`:
- 动态算法, 支持权重的运行时调整,支持慢启动
- 每个后端中最多支持4095个server;
- `static-rr`:
- 静态算法,不支持权重的运行时调整及慢启动
- 后端主机数量无上限;
- `leastconn`:
- 推荐使用在具有较长会话的场景中,例如MySQL、LDAP等;
- `first`:
- 根据服务器在列表中的位置,自上而下进行调度;
- 前面服务器的连接数达到上限,新请求才会分配给下一台服务;
- `source`:
- 源地址hash,hash 算法下面的 `hash-type` 选项指定
- `hash-type map-based`:除权取余法,这种方法不支持权重的运行时调整,也不支持慢启动,但资源耗费少
- `hash-type consistent`: 一致性哈希,支持权重运行时调整,也支持慢启动,但是资源耗费多
- `uri`:
- 目标地址 hash,对URI的左半部分做hash计算
- hash 算法可由 `hash-type` 指定,默认是 `map-based`
- 完整 url: `://:@:/;?#``
- 左半部分: `/;`
- 整个uri: `/;?#`
- `url_param`:
- 对用户请求的uri的 ``中的部分的参数的值作hash计算
- hash 算法可由 `hash-type` 指定,默认是 `map-based`
- 通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server
- `hdr()`:
- 对于每个http请求,此处由``指定的http首部将会被取出做hash计算
- hash 算法可由 `hash-type` 指定,默认是 `map-based`
- 没有有效值的会被轮询调度;
- eg: `hdr(Cookie)`
#### hash-type
`hash-type `
- 作用: 指定 hash 计算的算法
- `method`:
- `map-based`: 除权取余法,哈希数据结构是静态的数组;
- `consistent`: 一致性哈希,哈希数据结构是一个树;
- `function`: 哈希函数,eg: `sdbm, djb2, wt6`
#### default-server
`default-server [param*]`
- 作用: 为backend中的各server设定默认选项
- 选项: 同 serve
#### server
`server [:[port]] [param*]`
- 作用: 定义后端主机的各服务器及其选项;
- `name`: 服务器在haproxy上的内部名称;出现在日志及警告信息
- `address`: 服务器地址,支持使用主机名;
- `[:[port]]`: 端口映射;省略时,表示同bind中绑定的端口;
- `[param*]`: 参数
- `maxconn `: 当前server的最大并发连接数;
- `backlog `: 当前server的连接数达到上限后的后援队列长度;
- `backup`: 设定当前server为备用服务器;
- `check`: 对当前server做健康状态检测;
- `addr` : 检测时使用的IP地址;
- `port` : 针对此端口进行检测;
- `inter `: 连续两次检测之间的时间间隔,默认为2000ms;
- `rise `: 连续多少次检测结果为“成功”才标记服务器为可用;默认为2;
- `fall `: 连续多少次检测结果为“失败”才标记服务器为不可用;默认为3;
- 注意: httpchk,"smtpchk", "mysql-check", "pgsql-check" and "ssl-hello-chk" 用于定义应用层检测方法;
- `cookie `: 为当前server指定其cookie值,用于实现基于cookie的会话黏性;
- `disabled`: 标记为不可用;
- `redir `: 将发往此server的所有GET和HEAD类的请求重定向至指定的URL;
- `weight `: 权重,默认为1;
#### cookie
`cookie options`
- 作用: 启用基于 cookie 的用户绑定
- 参数: `` 待操作的 cookie 的键
- 选项:
- `rewirte`: 重写
- `insert`: 插入
- `prefix`: 前缀
- `nocache`: 只对非从缓存中响应的值进行操作
- `indirect`: 如果对应的cookie 键已经存在值,则不修改直接发送给客户端
- 说明: cookie 的值有 `server cookie` 配置
```
# 基于cookie的session sticky的实现:
backend websrvs
cookie WEBSRV insert nocache indirect
server srv1 172.16.100.6:80 weight 2 check rise 1 fall 2 maxconn 3000 cookie srv1
server srv2 172.16.100.7:80 weight 1 check rise 1 fall 2 maxconn 3000 cookie srv2
````
### 2.3 健康状态检测
#### option httpchk
`option httpchk `
- 作用: 对后端服务器做http协议的健康状态检测,基于http协议的7层健康状态检测机制;
- 参数:
- `uri`: 指定检测的链接
- `method`: 指定检测使用的请求方法
- `version`: 指定发送的 http 的协议版本
```
backend https_relay
mode tcp
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
server apache1 192.168.1.1:443 check port 80
```
#### http-check expect
`http-check expect [!] `
- 作用: 指定健康状态检测的内容
- `[!]`: 表示取反操作
- `match`:
- `status`: 完全匹配响应码
- `rstatus`: 以正则表达式匹配响应码
- `string`: 完全匹配响应内容
- `rstring`: 以正则表达式匹配响应内容
- `pattern`: 字符串或正则表达式,表示 `match` 指定的选项要匹配的内容
```
http-check expect status 200
http-check expect ! string SQL\ Error
http-check expect ! rstatus ^5
# check that we have a correct hexadecimal tag before /html
http-check expect rstring