简介 HAProxy (High Available Proxy), 用于四层和七层的负载均衡.
相关概念 空连接 空连接即, 上游的负载均衡器或者监控系统为了探测该服务是否存活可用时, 需要定期的连接或者获取某一固定组件或页面, 或者探测扫描端口是否开放等动作.
安装
配置 配置文件为: /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 acl is_static_path path_beg -i /staticacl is_api_path path_beg -i /apiacl 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 mobileacl is_post_method method POSTacl is_secure_request is_ssl is_post_methodacl 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 30 s stats uri /haproxy_stats stats realm Haproxy\ Statistics stats auth openEuler:Huawei@123 stats hide-version