Haproxy 简介
背景
HAProxy是high available proxy的缩写。他是什么吗?官方定义tcp proxy,http反向代理,ssl总结器/启动程序/卸载程序(与haproxy在整体网络结构的前端有关系),流量监管,缓存等作用的程序。
如何工作?
基于事件驱动,非阻塞引擎,是一种基于优先级和多线程调度器的快速IO,架构的目的是为了尽可能快的操作数据,大多数处理是在内核中进行的,通过给内核一些提示避免内核去猜测来提高处理速度。
haproxy启动做下面三件事
处理进入链接(主要功能)
周期性检查server的状态,也称健康检查
和其他的haproxy节点交换信息
程序环境
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg(主要介绍)
启动脚本:/usr/lib/systemd/system/haproxy.service
配置文件概要
主要分为2段
- 全局配置段
global:主要包含进程及安全相关的参数,性能调整相关参数,Debug参数 - proxies 代理配置段
defaults:为frontend,listen,backend提供默认配置
frontend:前端,相当于nginx,server{},提供client访问的接入
backend:后端,相当于nginx,upstream{},设置后端真正提服务的服务器配置
listen:同时拥有前端和后端,在tcp层代理
简单的配置示例
global
maxconn 100000
frontend web
bind *:80
default_backend websrvs
backend websrvs
balance roundrobin
server srv1 172.16.100.6:80 check
server srv2 172.16.100.7:80 check
重点配置
listen代理段配置
主要用于一些tcp的代理,区别于常规的80和443端口,集前端和后端一起配置
简单配置
listen ssh
bind :22022
balance leastconn
mode tcp
server sshsrv1 172.16.100.6:22 check
server sshsrv2 172.16.100.7:22 check
ACL
ACL是HAProxy中的重点内容,先直观感受一下配置,阻止172.16.200.2访问80端口
frontend web
bind *:80
acl invalid_src src 172.16.200.2
block if invalid_src
语法
acl [flags] [operator] [] ...
aclname:可以大写字母,-,.,:。但是大小写敏感。my_acl和My_Acl是一样的。
flags:
-i : 忽略大小写
-f : 从文件中加载模式,可以多次使用-f,文件内容#开头忽略
-m : 使用特别的模式
-n : 禁止DNS解析
-M : 加载-f指定的文件,但是文件内容和-f指定的不一样。
-u : 强制使用唯一的acl id
-- : 强制结束表示符,在一个字符串类似一个flag的时候
criterion
dst : ip
dst_port : integer
src : ip
src_port : integer
案例:acl invalid_src src 172.16.200.2
path:url路径匹配
path_beg : prefix match
path_dir : subdir match
path_dom : domain match
path_end : suffix match
path_len : length match
path_reg : regex match
path_sub : substring match
url : url匹配
url : exact string match
url_beg : prefix match
url_dir : subdir match
url_dom : domain match
url_end : suffix match
url_len : length match
url_reg : regex match
url_sub : substring match
req.hdr([<name>[,<occ>]]) : 请求头部匹配
hdr([<name>[,<occ>]]) : exact string match
hdr_beg([<name>[,<occ>]]) : prefix match
hdr_dir([<name>[,<occ>]]) : subdir match
hdr_dom([<name>[,<occ>]]) : domain match
hdr_end([<name>[,<occ>]]) : suffix match
hdr_len([<name>[,<occ>]]) : length match
hdr_reg([<name>[,<occ>]]) : regex match
hdr_sub([<name>[,<occ>]]) : substring match
示例:acl bad_curl hdr_sub(User-Agent) -i curl
HAProxy预定义ACL
FALSE 一直为false,
HTTP 匹配req_proto_http为有效的http协议
HTTP_1.0 req_ver匹配为http 1.0
HTTP_1.1 req_ver匹配为http 1.1
HTTP_CONTENT 等同于hdr_val(content-length) gt 0
METH_GET 匹配GET方法
METH_HEAD 匹配HEAD方法
METH_OPTIONS 匹配OPTIONS方法
METH_POST 匹配POST方法
TRUE 一直为真
实例
案例:加载指定文件
acl valid-ua hdr(user-agent) -f exact-ua.lst -i -f generic-ua.lst test
使用-m指定特殊匹配模式
-m支持的模式匹配种类(挑选常用的)
ip:ipv4和ipv6地址
len:匹配长度
sub:子串匹配,检查内容至少包含一个需要匹配的字符串
reg:使用正则匹配
beg:前缀匹配
end:后缀匹配
dir:以/为分隔符,只要包含需要匹配的path就算满足
dom:以.为分割符,只要包含需要匹配的域名就算满足
案例
acl short_form hdr_beg(host) www.
acl alternate1 hdr_beg(host) -m beg www.
acl alternate2 hdr_dom(host) -m beg www.
acl alternate3 hdr(host) -m beg www.
如果匹配的是数字
操作符可以使eq,ge,gt,lt,le
acl negative-length hdr_val(content-length) lt 0
acl sslv3 req_ssl_ver 3:3.1
主要的权限控制
禁止某个acl
http-request deby if invalid_src
允许某个acl
http-request allow if valid_src
添加头部
http-request add-header <name> <fmt> [ { if | unless } <condition> ]
删除头部
http-request del-header <name> [ -m <meth> ] [ { if | unless } <condition> ]
设置跳转
http-request redirect <rule> [ { if | unless } <condition> ]
http-request redirect prefix https://www.example.com if example_acl
backend的负载算法
以这个为例说明
backend websrvs
balance roundrobin
server srv1 172.16.100.6:80 check weight 2
server srv2 172.16.100.7:80 check weight 1
balance 算法可选值
roundrobin:更据server中定义的weight进行轮询,支持在运行中修改权重和慢启动,有4095的server限制
static-rr:和roundrobin是一样的,不支持运行中修改权重和慢启动,但是没有server限制
leastconn:选择最少数量的后端服务器接收连接,适合长连接,不适合短连接,适合sql,ldap,tse,不适合http,这个也是个动态算法,支持运行中修改权重和慢启动
first:选择第一个可用的后端处理连接,一旦一个后端服务达到最大值,则选择下一个。
source:对源ip进行hash,再除权重和得到选中的后端服务器,对于同一的ip总是选择同一的后端服务器,这个算法默认是静态的,这个算法适合不带cookie的tcp连接。如果在后端服务器出现增减的时候,选择到和上次不同服务器上。
uri:更据uri的左部分hash开选择后端服务器或者整个url。
url_param:更据url的参数来选择后端服务器
还有hrd(<name>),random,random(<draws>),rdp-cookie,rdp-cookie(<name>)这些不常用就不做多的介绍
案例:
balance roundrobin
balance url_param userid
balance url_param session_id check_post 64
balance hdr(User-Agent)
balance hdr(host)
balance hdr(Host) use_domain_only
掌握上述功能,可以解决80%~90%的要求了,其余的性能方面的优化,这个就靠经验和更深度的研究了。
haproxy命令行
检测配置文件是否有错误
#haproxy -c -f /etc/haproxy/haproxy.cfg
如果没有显示就说明没有错误
重新加载配置
第一种方式#/bin/kill -USR2 $MANPID
第二种方式#systemctl reload haproxy
最后谢谢阅读
发布于 2021-04-12 17:52