HAProxy-服务搭建

简介

HAProxy (High Available Proxy), 用于四层和七层的负载均衡.

相关概念

空连接

空连接即, 上游的负载均衡器或者监控系统为了探测该服务是否存活可用时, 需要定期的连接或者获取某一固定组件或页面, 或者探测扫描端口是否开放等动作.

安装

1
dnf install -y haproxy

配置

配置文件为: /etc/haproxy/haproxy.cfg

cfg 格式文件

cfg 为 “configuration” 的缩写, 一种配置文件格式.

具体的语法取决于应用程序或系统.

但一般以 # 作为注释.

HAProxy 配置示例

HAProxy 的配置分为多个 section, 分别为:

  • global, 定义全局参数
  • default, 配置默认参数, 这些参数可在 frontend, backend, listen 中使用
  • frontend, 定义前端服务即 HAProxy 接收外部请求的方式和监听的端口, 以及 ACL 规则, 其可以将请求重定向到 backend
  • backend, 定义后端服务器的配置, 包括服务器列表以及算法
  • listen, 用于状态页面监控, 以及后端 server 检查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
global
log 127.0.0.1 local2 # 全局日志配置, 语法: log <address_1> [max_level_1]
chroot /var/lib/haproxy # 改变工作目录
pidfile /var/run/haproxy.pid # 当前进程 id 文件
maxconn 4000 # 定义最大连接数, 但 default, frontend 中的设置优先级更高
user haproxy # 所属用户
group haproxy # 所属组
daemon # 以守护进程方式运行
stats socket /var/lib/haproxy/stat # 指定用于获取HAProxy统计信息的套接字路径

default
mode http # mode有tcp,http,health, tcp是4层, http是7层, health只会返回OK
log global # 应用全局的日志配置
option httplog # 启用日志记录HTTP请求
option dontlognull # 启用后, 日志不会记录空连接
option http-server-close # 每次请求完毕后主动关闭http通道
option forwardfor # 用于在转发 HTTP 请求时将原始客户端的 IP 地址添加到 HTTP 头部中的 X-Forwarded-For 字段
except 127.0.0.0/8 # 排除来自127.0.0.0/8的请求
option redispatch # 当一个后端服务器宕机时,会将客户的请求强制定向到另外一个后端server上
retries 3 # 定义连接后端服务器的失败重联次数, 超过这个值则将对应服务器标记为不可用
timeout http-request 10s # http 请求超时时间
timeout queue 1m # 在一个队列中的超时时间
timeout connect 10s # 连接超时
timeout client 1m # 客户端超时
timeout server 1m # 服务端超时
timeout http-keep-alive 10s # 设置http-keep-alive的超时时间
timeout check 10s # 检测超时
maxconn 3000 # 每个进程的最大连接数

frontend main *:80 # 表示监听所有可用IP的80端口
acl url_static path_end -i .jpg .gif .png .css .js # 定义ACL规则
use_backend static if url_static # 匹配了 url_static 规则的请求转发给名称为static的后端
default_backend my_webserver # 默认请求转发给名称为my_webserver的后端

backend static # 定义一个名为static的backend
balance roundrobin # 负载均衡算法
server static 127.0.0.1:80 check # 定义一个名为static的服务器, 即静态文件部署的位置, check 表明对服务器做健康检查

backend my_webserver
balance roundrobin
server web01 172.31.2.33:80 check inter 2000 fall 3 weight 30 # inter 2000表明健康检查的间隔, fall 3 表明多少次连续失败后标记为不可用, weight 30 表示负载均衡的权重
server web01 172.31.2.34:80 check inter 2000 fall 3 weight 30
server web01 172.31.2.35:80 check inter 2000 fall 3 weight 30

log 配置

log 中指定的 local0, local1 为 “日志设置”, 用于分类和过滤日志消息.

HAProxy ACL 规则

ACL (Access Control List), 即访问控制列表.

语法如:

1
acl  <acl_name> <condition> [flags] [values]
  • <acl_name>, 设置的 ACL 规则名称, 可以在配置中引用
  • <condition>, 是 ACL 规则的匹配条件表达式, 可以是 Source IP, Destination IP, 请求头, 请求方法
  • [flags], 调整 ACL 规则的行为, 如 排除, 否定等

常用的 <condition> 有:

  • hdr(host), 匹配域名全称
  • hdr_reg(host), 正则匹配域名
  • hdr_dom(host), 匹配域名全名
  • hdr_end(host), 匹配域名后缀
  • hdr_len(host), 匹配域名长度
  • hdr_sub(host), 匹配域名子串
  • hdr_dir, 匹配请求的路径
  • url_sub, 匹配请求的 url 中是否包含指定的子字符串
  • path_beg, 匹配请求路径是否以指定字符串开头
  • path_end, 匹配请求路径是否以指定字符串结尾
  • base_beg, 匹配 base 前缀, 指 <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>, 中的 <host>:<port>/<path>;<params> 部分
  • src, 匹配 source ip
  • src_port, 匹配 source port
  • dst, 匹配 destination ip
  • dst_port, 匹配 destination port
  • method, 匹配 http 请求方式
    (hdr 指 “header”)

常用的 [flags] 有:

  • -i, 不区分大小写
  • -m, 使用指定的 pattern
  • -n, 不做 DNS 解析
  • -u, 禁止 acl 重名

ACL 编写示例

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 根据请求的 URI 进行匹配
acl is_static_path path_beg -i /static
acl is_api_path path_beg -i /api

# 根据请求的源 IP 进行匹配
acl is_internal_ip src 192.168.0.0/24
acl is_allowed_ip src 10.0.0.1

# 根据请求的请求头进行匹配
acl is_mobile hdr_sub(User-Agent) -i mobile

# 根据请求的请求方法进行匹配
acl is_post_method method POST

# 使用逻辑运算符组合多个条件
acl is_secure_request is_ssl is_post_method

# 使用标志进行进一步的调整
acl is_not_static_path path_beg -i /static # 排除 /static 路径
acl is_not_internal_ip src 192.168.0.0/24 ! # 否定 192.168.0.0/24 的 IP

ACL 调用

表示是否使用一个 backend, 用 use_backend:

1
use_backend <backend> [{if | unless} <condition>]

是否拒绝请求, 用 block:

1
block {if | unless} <condition>

处理 http 请求:

1
http-request {allow | auth [realm <realm>] | redirect <rule> | deny [deny_status <status]} [{if | unless} <condition>]

处理 tcp 请求:

1
tcp-request connection {accept | reject} [{if | unless} <condition>]

处理 tcp 响应报文:

1
tcp-response connection <accept | reject | close> [{if | unless} <condition>]

检查配置文件语法:

1
haproxy -c -f /path/to/haproxy.cfg
  • -c 为 “check”
  • -f 指定 “file”

监控页面配置

1
2
3
4
5
6
7
8
listen admin_stat
bind 0.0.0.0:8443
mode http
stats refresh 30s
stats uri /haproxy_stats
stats realm Haproxy\ Statistics
stats auth openEuler:Huawei@123
stats hide-version

HAProxy-服务搭建
http://example.com/2024/03/06/HAProxy-服务搭建/
作者
Jie
发布于
2024年3月6日
许可协议