HAProxy浅说

HAProxy浅说:
    HAProxy响应码:
        200:请求正常,响应正常,也就是正常响应码
     301:配置使用的重定向,以下都是有关于重定向的一些响应码,不做解释
     302:
     303:
     307:
     308:
     400:客户端错误,请求无效或是请求太大
     401:身份验证时的问题所向,如果通过有这个响应码
     403:请求没有权限,一般为ACL或者是系统的filter功能对请求流进行了流量匹配执行了拒绝
     408:请求超时
     500:服务端错误,当HAProxy遇到不可恢复的内部错误时,会响应此响应码,一般不会出现,因为,如果这么严重的错误就会变成404了
     502:服务端响应为空,响应无效,响应不完整或者rspdeny过滤的问题时会出现这个响应码
     503:没有服务器可用于处理请求,或者无法连接后端服务器产生的错误
     504:在服务器响应之前触发了请求超时
     HAProxy的配置
        配置文件的格式:
            配置文件分为五段
            globel:全局配置
            defaults:默认配置,这一段的配置可以用于其它几段的公有配置
            listen:用于代理监听的端口,也就是监听那一个端口,也可以加入一些其它配置
            frontend:前端配置,也就是代理配置
            backend:后端配置
        时间格式:
            通常使用毫秒来表示时间的相关配置
        配置试例:
            global
       daemon
       maxconn 256

   defaults
       mode http
       timeout connect 5000ms
       timeout client 50000ms
       timeout server 50000ms

   frontend http-in
       bind :80
       default_backend servers

   backend servers
       server server1 127.0.0.1:8000 maxconn 32
        以上的配置还可以写成如下的形式
            global
       daemon
       maxconn 256

   defaults
       mode http
       timeout connect 5000ms
       timeout client 50000ms
       timeout server 50000ms

   listen http-in
       bind *:80
       server server1 127.0.0.1:8000 maxconn 32
    全局配置指令(Global parameters)
        chroot:指定HAProxy的运行根目录,将HAProxy的权限降低,如有此目录下的权限,其它目录下HAProxy是没有权限的
            chroot /var/haproxy    //一说是变更程序的特定目录,那就与selinux有关了,修改其标签或是关闭
        deamon:运行为守护进程
        log:日志存储位置
            log 127.0.0.1 local2    //本地日志文件存放位置,这个local2可以在/etc/rsyslog.conf文件中做配置
            log <address> [len <length>] <facility> [max level [min level]]   //定义日志长度,日志级别等
        group:定义HAProxy的启用进程的组
        user:定义HAProxy的启用进程的用户
        maxconn:最大连接数
        maxconnrate:每秒最大连接数
        maxcompcpuusage:最大CPU使用率
        maxsessrate:每秒开启的最大会话数
        maxsslconn:ssl的最大连接数
        maxsslrate:每秒ssl最大连接数
        maxpipes:最大打开多少个管道文件
        spread-checks:对逻辑服务器或者物理服务器进行健康检测
    Proxies段指令
        defaults <name>:配置以下其它部分的公共配置段,也就是配置的默认配置
        frontend <name>:前端监听客户端的配置
        backend <name>:后端为前端提供服务的配置,也就是如何连接后端,有那些后端等
        listen <name>:这里可以定义一个完整的代理,它的前端与后端组合在了一起,但是只可以定义TCP流量,所以只能进行伪四层代理
    注:在配置文件中名字可以使用_-.:符号,当然也可以使用字母与数字
    Proxy部分关键字说明
        acl
            acl <aclname> <criterion> [flags] [operator] <value> …   
            acl acl的名字 acl定义的标准 [标记] [选项] 值… 
            acl invalid_src  src          0.0.0.0/7 224.0.0.0/3
            acl invalid_src  src_port     0:1023
            acl local_dst    hdr(host) -i localhost
            返回的数据类型:
                boolean:布尔型值
                integer:整数
                IPv4 or IPv6:IP地址
                string:字符串
                data block:数据块
            ACL可以匹配识别的数据类型
                boolean:布尔型
                integer or integer range:整数或者一个整数的范围
                IP or network:IP或者网段
                string:字符串
                hex block:十六进制块
            ACL的标记:
                -i:忽略匹配内容的大小写
                -f:从文件中读取所要的匹配内空
                -m:使用特定的模式匹配
                -n:禁止DNS解析
                -M:加载一个相当于-f指定的文件,内容为健–值型调用
                -u:强制ACL使用的唯一ID号
                –:强制结束标记,也就是给相关的字符串进行非标记符进行转意
            选项
                匹配整数时可用的运算符
                    eq,lt,le,gt,ge
                字符串匹配:
                    exact match     (-m str):提取的字符串必须完全匹配
substring match (-m sub):在内查找图片,提取字符串,进行ACL匹配
prefix match    (-m beg):对匹配字符串的开头进行比较,匹配ACL
suffix match    (-m end):对匹配字符串的尾部进行比较,匹配ACL
subdir match    (-m dir):匹配一个路径(uri)的其中一段,以/分割取其中的某些段
domain match    (-m dom):匹配一个url,以.分割,取其中的特定段
            ACL标准:
                关于IP与端口的标准:
                    dst:目标IP
                    dst_port:目标端口
                    src:源IP
                    src_prot:源端口
                关于PATH的,也就是URI的相关标准:
                path:string    //提取请求中的URL路径,该路径以/开头,并在?之前结束
                    path     : exact string match
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
                关于URI的相关标准:
                    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
                关于请求头部的标准:
                    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 valid_method method GET HEAD    //定义一个acl,标准为method,方法为GET和HEAD
                    http-request deny if ! valid_method   //对此acl进行操作,可以使用非
        blance:算法
            roundrobin:动态轮询
            static-rr:静态轮询
            leastconn:最小连接
            first:连接一台服务器到其负载最大值,再连接下一台服务器
            source:对源IP进行绑定,类似于nginx的hash与ip_hash
            uri:对uri左半部分进行hash,并由服务器总权重相除以后派发至某个挑出的服务器上
            url_param:对用户请求的uri的<param>部分参数值做为hash计算,并由服务器总权重相除以后溾发至某个挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server上
            hdr(<name>):对于每个http请求指定的头部做hash,并由服务器总权重相除后派发至挑选的服务器上,没有有效值的会被轮询调度
            rdp-chookie(<name>):也就是chookie绑定,对应的用户只会由对应的服务器进行响就,也只有此一个服务器去响应,当然了,那些进行动静分离的不算,如果没有检查到chookie,那么会进行轮询对backend进行挑选
        hash_type:定义使用的hash算法类型
            map-bashed:除权法,也就是静态算法
            consistents:一致性哈希算法,这个是一个动态算法
        bind:对端口进行绑定
            bind *:80   //对80端口进行绑定
        block:如果条件匹配就阻止第七层请求
            acl test_name hdr_reg(Status Code) 200
            block if ! test_name
        default-backend <backend>:设定默认的backend,用于frontend中;
            use_backend     dynamic  if  url_dyn
            use_backend     static   if  url_css url_img extension_img
            default_backend dynamic
        default-server:为backend中的各server设定默认选项
            default-server inter 1000 weight 13
        mode:设定实例的运行模式与协议
            tcp:基于四层代理,可代理mysql,ssh,ssl,等协议
            http:仅当代理的协议为http时使用
            health:工作为健康状态的响应模式,当连接请求到达时回应OK后即断开连接
        cookie:在backend开启基于cookie的长连接
            cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ]
              [ postonly ] [ preserve ] [ httponly ] [ secure ]
              [ domain <domain> ]
[ maxidle <idle> ] [ maxlife <life> ]
            cookie JSESSIONID prefix
            cookie SRV insert indirect nocache
            cookie SRV insert postonly indirect
            cookie SRV insert indirect nocache maxidle 30m maxlife 8h
        compression algo <algorithm>:启用压缩,设定压缩算法
            identity:适用于在开发时测试使用
            gzip:压缩为gzip
            deflate:类似于gzip
            
            compression algo gzip
            compression type text/html text/plain
        compression type <mime type>:
        compression offload:
        enable:将一个代理启动,默认为启动,所以此指令通常不使用
        disable:将一个代理关闭,默认为启动,在进行灰度发布时可以将一个代理设置为disable
        errorfile <code> <file>:将HAProxy的错误返回为指定文件
            errorfile 400 /etc/haproxy/errorfiles/400badreq.http
            errorfile 408 /dev/null  # workaround Chrome pre-connect bug
            errorfile 403 /etc/haproxy/errorfiles/403forbid.http
            errorfile 503 /etc/haproxy/errorfiles/503sorry.http
        errorloc302 <code><url>:将HAProxy的错误重定向到指定页面
        errorloc303 <code><url>:
        http-check expect [!] <match> <pattern>:在特定的内容或者状态码下进行http的健康检测
            status <string>:检测响应码确切的字符串
            rstatus <regex>:检测响应码的匹配字符串
            string <string>:检测响应内空的确切字符串
            rstring <regex>检测响应内容的匹配字符串

            http-check expect status 200    //响应状态码为200时进行检测
            http-check expect ! string SQL\ Error   //响应内容为非”SQL Error”进行检测
            http-check expect ! rstatus ^5    //这个是非以5开头的响应码
            http-check expect rstring <!–tag:[0-9a-f]</html>   //检测在html之前是否有正确的十六进制标签
        http-request:七层访问控制
            http-request { allow | deny | tarpit | auth [realm <realm>] | redirect <rule> |
              add-header <name> <fmt> | set-header <name> <fmt> |
              del-header <name> | set-nice <nice> | set-log-level <level> |
              replace-header <name> <match-regex> <replace-fmt> |
              replace-value <name> <match-regex> <replace-fmt> |
              set-tos <tos> | set-mark <mark> |
              add-acl(<file name>) <key fmt> |
              del-acl(<file name>) <key fmt> |
              del-map(<file name>) <key fmt> |
              set-map(<file name>) <key fmt> <value fmt>
             }
             [ { if | unless } <condition> ]
            
            http-request replace-header Cookie foo=([^;]
);(.) foo=\1;ip=%bi;\2
            http-request replace-value X-Forwarded-For ^192.168.(.
)$ 172.16.\1

acl nagios src 192.168.129.3
acl local_net src 192.168.0.0/16
acl auth_ok http_auth(L1)
http-request allow if nagios
http-request allow if local_net auth_ok
http-request auth realm Gimme if local_net auth_ok
http-request deny
            
            acl auth_ok http_auth_group(L1) G1
            http-request auth unless auth_ok
        http_ response:修改响应报文
            http-response { allow | deny | add-header <name> <fmt> | set-nice <nice> |
                set-header <name> <fmt> | del-header <name> |
                replace-header <name> <regex-match> <replace-fmt> |
                replace-value <name> <regex-match> <replace-fmt> |
                set-log-level <level> | set-mark <mark> | set-tos <tos> |
                add-acl(<file name>) <key fmt> |
                del-acl(<file name>) <key fmt> |
                del-map(<file name>) <key fmt> |
                set-map(<file name>) <key fmt> <value fmt>
              }
              [ { if | unless } <condition> ]
        log:日志配置
            log global   //调用全局配置中的日志存储
            log <address> [len <length>] <facility> [<level> [<minlevel>]]  //自定义日志
            no log   //不启用日志
            log global
            
            log 127.0.0.1:514 local0 notice        
            log 127.0.0.1:514 local0 notice notice 
            log ${LOCAL_SYSLOG}:514 local0 notice 
        maxconn <conns>:指定配置HAProxy前端的最大并发连接
        option forwardfor [ except <network> ] [ header <name> ] [ if-none ]:开启报文头部的X-Forwarded-For选项
            
            backend www
            mode http
            option forwardfor header X-Client
        redirect location <loc> [code <code>] <option> [{if | unless} <condition>]
        redirect prefix   <pfx> [code <code>] <option> [{if | unless} <condition>]
        redirect scheme   <sch> [code <code>] <option> [{if | unless} <condition>]
        reqadd:在请求报文头部添加信息
            reqadd  <string> [{if | unless} <cond>]
        repadd:在响应报文头部添加信息
        reqdel:在请求报文头部添加信息
        repdel:在响应报文头部删除信息
        server:在backend中申明一个服务器
            server <name> <address>[:[port]] [param*]
            
            param:
                maxconn:当前server最大连接数
                backlog <backlog>:连接达到最大数的后援队列长度
                backup:将此服务器定义为sorryserver
                check:地当前server进行健康检测
                    addr:对地址进行检测
                    port:对端口进行检测
                    inter <delay>:检测时的延迟
                    rise <count>:连续多少次成功才会标记服务可用,默认为2
                    fall <count>:连续多少次失败才会标记失败,默认为3
                cookie <value>:为当前server指定其cookie值,用于实现基于cookie的会话黏性;
                disabled:标记为不可用;
                redir <prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL;
                weight <weight>:权重,默认为1;
            server first  10.1.1.1:1080 cookie first  check inter 1000
server second 10.1.1.2:1080 cookie second check inter 1000
server transp ipv4@
server backup ${SRV_BACKUP}:1080 backup
server www1_dc1 ${LAN_DC1}.101:80
server www1_dc2 ${LAN_DC2}.101:80
stats enable:开启状态页
        stats admin { if | unless } <cond>:定义状态页可以由那此主机登陆
            stats admin if localhost
        stats auth <user>:<passwd>:认证时的账号和密码,可使用多次;
        stats uri <prefix>:自定义stats page uri
        stats refresh <delay>:设定自动刷新时间间隔;
        stats realm <string>:配置一个输入提示
            配置示例:
listen stats
bind :9099
stats enable
stats realm HAPorxy\ Stats\ Page
stats auth admin:admin
stats admin if TRUE
    HAProxy实现的动静分离,使用keepalived实现其高可用性,使用stats page对HAProxy进行管理
        拓扑图:
            
        此环境配置分为四大步
            配置backend
            配置frondend
            配置keepalived
            配置全栈ssl
        配置backend
            配置node3:
                yum -y install httpd php php-mysql showmount   //安装相关包
                vim /etc/httpd/conf/httpd.conf
                    #DocumentRoot “/var/www/html”
                vim /etc/httpd/conf.d/vhost.conf
                    <Directory /data>
   Allowoverride none
   require all granted
</Directory>
Listen *:8080
                    DirectoryIndex index.php index.html
<Virtualhost *:80>
   Documentroot /data/static
</Virtualhost>
<Virtualhost *:8080>
   Documentroot /data/dynamic
</Virtualhost>
                mkdir /data/{static,dynamic} -p
                vim /data/static/index.html
                    <h1>Web1:172.18.250.38</h1>
                vim /data/dynamicl/index.php
                    <?php
echo “172.18.250.38”;
   phpinfo();
?>
                systemctl start httpd
            配置node4
                yum -y install httpd php php-mysql mariadb-server  //安装相关包
                vim /etc/httpd/conf/httpd.conf
                    #DocumentRoot “/var/www/html”
               vim /etc/httpd/conf.d/vhost.conf
                   <Directory /data>
   Allowoverride none
   Require all granted
</Directory>
Listen *:8080
DirectoryIndex index.php index.html
<Virtualhost *:80>
   Documentroot /data/static
</Virtualhost>
<Virtualhost *:8080>
   Documentroot /data/dynamic
</Virtualhost>
                mkdir /data/{static,dynamic} -p
                vim /data/static/index.html
                    <h1>Web2:172.18.251.103</h1>
                vim /data/dynamicl/index.php
                    <?php
echo “172.18.251.103”;
   phpinfo();
?>
                systemctl start httpd
        配置frondend:
            配置node1:
                yum -y install httpd haproxy
                vim /var/www/html/index.html
                    <h1>I’m sorry</h1>
                vim /etc/haproxy/haproxy.cfg
                    global
   log         127.0.0.1 local2

   chroot      /var/lib/haproxy
   pidfile     /var/run/haproxy.pid
   maxconn     4000
   user        haproxy
   group       haproxy
   daemon

   stats socket /var/lib/haproxy/stats

defaults
   mode                    http
   log                     global
   option                  httplog
   option                  dontlognull
   option http-server-close
   option forwardfor       except 127.0.0.0/8
   option                  redispatch
   retries                 3
   timeout http-request    10s
   timeout queue           1m
   timeout connect         10s
   timeout client          1m
   timeout server          1m
   timeout http-keep-alive 10s
   timeout check           10s
   maxconn                 3000

listen stats_web *:3303
       stats enable
       stats realm HAProxy\ Basic
       stats refresh 5s
       stats uri /admin?stats
       stats auth admin:admin
       stats admin if TRUE
frontend  main *:80
       acl dynamic_web path_end .php
       use_backend static if ! dynamic_web
       use_backend dynamic if dynamic_web

backend static
   balance     roundrobin
   server      static1 172.18.250.38:80 check 
   server      static2 172.18.251.103:80 check
       server          sorry_web1 127.0.0.1:8080 check backup 
backend dynamic
       balance         roundrobin
       server          dynamic1 172.18.250.38:8080 check
       server          dynamic2 172.18.250.38:8080 check
       server          sorry_web2 127.0.0.1:8080       check backup
                systemctl start haproxy
                vim /etc/httpd/conf/httpd.conf 
                    #Listen 80
                    Listen 8080
                配置LVS_RS脚本,如下,两个节点相同
                    #!/bin/bash
VIP=”172.18.35.105″
netmask=”255.255.255.255″
device=”enp0s3″
case $1 in 
start)
       echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
       echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
       echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
       echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
       ifconfig lo:0 $VIP netmask $netmask broadcast $VIM up
       route add -host $VIP dev lo:0
       ;;
stop)
       ifconfig lo:0 down
       route del -host $VIP dev lo:0
       ;;
*)
       echo “Usage $(basename $0) {start|stop}”
       ;;
esac
配置node2:
                yum -y install haproxy httpd
                vim /etc/haproxy/haproxy.cfg
                    global
   log         127.0.0.1 local2

   chroot      /var/lib/haproxy
   pidfile     /var/run/haproxy.pid
   maxconn     4000
   user        haproxy
   group       haproxy
   daemon

   stats socket /var/lib/haproxy/stats

defaults
   mode                    http
   log                     global
   option                  httplog
   option                  dontlognull
   option http-server-close
   option forwardfor       except 127.0.0.0/8
   option                  redispatch
   retries                 3
   timeout http-request    10s
   timeout queue           1m
   timeout connect         10s
   timeout client          1m
   timeout server          1m
   timeout http-keep-alive 10s
   timeout check           10s
   maxconn                 3000

listen stats_web *:3303
       stats enable
       stats realm HAProxy\ Basic
       stats auth admin:admin
       stats uri /admin?stats
       stats refresh 5s
       stats admin if TRUE
frontend  main *:80
       acl dynamic_web path_end .php
       use_backend dynamic if dynamic_web
       use_backend static if ! dynamic_web

backend static
   balance     roundrobin
   server      static1 172.18.250.38:80 check
   server      static2 172.18.251.103:80 check
       server          sorry_web1      127.0.0.1:8080  check backup
backend dynamic
   balance     roundrobin
   server      dynamic1 172.18.250.38:8080 check
   server      dynamic2 172.18.251.103:8080 check
       server          sorry_web1      127.0.0.1:8080  check backup
                service haproxy start
                vim /etc/httpd/conf/httpd.conf
                    #Listen 80
                    Listen 8080
                service httpd start
        配置keepalived:
            配置node6
                yum -y install keepalived
                vim /etc/keepalived/keepalived.conf
                    ! Configuration File for keepalived

global_defs {
  notification_email {
    sysadmin@firewall.loc
  }
  notification_email_from root@localhost.con
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id CentOS7-node5
  vrrp_mcast_group4 224.0.0.18
}

vrrp_instance VI_1 {
   state MASTER
   interface enp0s3
   virtual_router_id 51
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
               172.18.35.105
   }
}

virtual_server 172.18.35.105 80 {
   delay_loop 6
   lb_algo wrr
   lb_kind dr
   nat_mask 255.255.255.255
   protocol TCP

   real_server 172.18.252.96 80 {
       weight 1
   }
   real_server 172.18.250.37 80 {
       weight 1
   }
}
virtual_server 172.18.35.105 3303 {
   delay_loop 6
   lb_algo wrr
   lb_kind dr
   nat_mask 255.255.255.255
   protocol TCP

   real_server 172.18.252.96 3303 {
       weight 1
   }
   real_server 172.18.250.37 3303 {
       weight 1
   }
}
            配置node6:
                yum -y install keepalived
                vim /etc/keepalived/keepalived.conf
                    ! Configuration File for keepalived

global_defs {
  notification_email {
    acassen@firewall.loc
  }
  notification_email_from root@localhost.com
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id CentOS7-node6
  vrrp_mcast_group4 224.0.0.18
}

vrrp_instance VI_1 {
   state BACKUP
   interface enp0s3
   virtual_router_id 51
   priority 98
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       172.18.35.105
   }
}

virtual_server 172.18.35.105 80 {
   delay_loop 6
   lb_algo wrr
   lb_kind DR
   nat_mask 255.255.255.255
   protocol TCP

   real_server 172.18.252.96 80 {
       weight 1
   }
   real_server 172.18.250.37 80 {
       weight 1
   }
}
virtual_server 172.18.35.105 3303 {
   delay_loop 6
   lb_algo wrr
   lb_kind DR
   nat_mask 255.255.255.255
   protocol TCP

   real_server 172.18.252.96 3303 {
       weight 1
   }
   real_server 172.18.250.37 3303 {
       weight 1
   }

                       

原创文章,作者:gaomei,如若转载,请注明出处:/76267

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达娱乐直属  测试  万达主管  万达娱乐平台  万达登录  万达招商  万达娱乐直属  万达娱乐开户  万达娱乐开户  万达娱乐主管