Haproxy 简介

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段

  1. 全局配置段
    global:主要包含进程及安全相关的参数,性能调整相关参数,Debug参数
  2. 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