本文共 7317 字,大约阅读时间需要 24 分钟。
报文修改:
option forwardfor
在由haproxy发往后端主机的请求报文中添加 "X-Forwarded-For" 首部-其值为前端客户端的地址,用于向后端主机发送真是的客户端IP[except <network>]-请求报文请来自此处指定的网络时不予以添加此
首部--如haproxy所在网络默认配置:option forwardfor except 127.0.0.0/8需要更改后端服务器日志配置:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined效果展示:192.168.23.36 - - [04/Nov/2018:10:27:10 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 172.20.23.20192.168.23.36 - - [04/Nov/2018:10:27:11 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 172.20.23.20[header <name>]:使用自定义的首部名称,而非"X-Forwarded-For"
具体使用:option forwardfor except 127.0.0.0/8 header xxx使用后需要更改后端服务器端日志格式!具体使用:option forwardfor except 127.0.0.0/8 header HostClient[if-none] 如果没有首部才添加首部 如果有使用默认值
在请求报文尾部添加指定首部:
reqadd <string> [{if|unless} <cond>]具体应用:reqadd testheader:\ test结果展示:192.168.23.36 - - [04/Nov/2018:11:28:49 +0800] "HEAD / HTTP/1.1" 200 - "-" "curl/7.29.0" test在响应报文尾部添加指定首部:
rspadd <string> [{if|unless} <cond>]示例:rsqadd X-Via:\ HAPorxy\ -----转移空白字符请求报文中删除匹配正则表达式的首部:reqdel <search> [{if|unless} <cond>]reqidel <search> [{if|unless} <cond>] --不区分大小写从响应报文中删除匹配正则表达式的首部:
rspdel <search> [{if|unless} <cond>]rspidel <search> [{if|unless} <cond>] --不区分大小写示例:rspidel server.*
删除响应报文的server:
frontend webbind 172.20.23.36:80 default_backend httpdrspidel server.*backend httpdbalance roundrobin server srv1 192.168.23.41:80 check server srv2 192.168.23.40:80 check server sorryserver 127.0.0.1:8080 check backup添加报文头部--响应首部:
frontend webbind 172.20.23.36:80 default_backend httpdrspidel server.* --删除server响应首部rspadd Server:\ nginx --添加自定义首部backend httpdbalance roundrobin reqadd testheader:\ testserver srv1 192.168.23.41:80 check server srv2 192.168.23.40:80 check server sorryserver 127.0.0.1:8080 check backup总结:
1 对于前端使用响应相关命令2 对于后端使用请求相关命令错误页面配置:
errorfile <code> <file>自定义错误页面
<code>:HTTP status code支持200|400|403|408|500|502|503|504<file>:错误页面文件路径具体使用:frontend webbind 172.20.23.36:80 default_backend httpderrorfile 503 /etc/haproxy/errorfile/503.htmlerrorloc <code> <url>
相当于errorloc 302 <code> <url>--利用302重定向至URL具体案例:errorloc 503 压缩功能:为指定的MIME类型启用压缩传输功能:
compression algo <algorithm>..:启用http协议的压缩机制,指明压缩算法gzip|deflatecompression type <mine type>...:指明压缩的MIMI类型
7层健康性检查:frontend web
bind 172.20.23.36:80 default_backend httpdbackend httpdbalance roundrobin option httpchk GET /test.htmlhttp-check expect status 200server srv1 192.168.23.41:80 check server srv2 192.168.23.40:80 check server sorryserver 127.0.0.1:8080 check backup简单使用:option httpchk [请求方法] [uri]具体使用:option httpchk GET /test.htmlACL:Haproxy--------ACL
访问控制列表[ACL]的使用提供了一个灵活的解决方案来执行容器交换并且通常基于从请求中提取的内容,响应或任何环境状态决策acl <aclname> <criterion> [flags] [operator] [value]
<aclname>--ACL名称 可以使用字母数字 - _ , 区分字符代销写
<criterion> --比较的标准和条件<value>的类型:
<flags>
-i 不区分大小写-m 使用指定的paatterm匹配方法-n 不做DNS解析-u 强制每个ACL必须唯一ID -- 强制flag结束 当字符串和某个flag相似时使用[operator]:
匹配整数值:eq ge gt le lt匹配字符串:ACL中的逻辑关系:
<criterion> --条件
dst --目标IPdst_port --目标端口src --源IPsrc_port --源端口简单用法:acl invalid_src src 172.20.23.20base:string
<scheme>://<user>:<password>@[<host>:<port>/<path>;<params>]?<query>#<frag>path:string
<scheme>://<user>:<password>@<host>:<port>[/<path>;<params>]?<query>#<frag>path_beg /images/ --以/images/开头
path_end .jpg --以jpg结尾path_reg ^/images.*.jpeg$ --正则表达式path_sub image --包括了image字串检查每一个/xx/path_dir jpegs --包括jpegs文件夹path_dom linux --使用linux域 xxx.[linux].com对比案例:/images/jpegs/20181104/log.jpg具体使用:拒绝某IP用户访问:配合errorfilefrontend webbind 172.20.23.36:80 default_backend httpdacl false_IP src 172.20.23.20block if false_IPerrorfile 403 /etc/haproxy/errorfile/403.htmlbackend httpdbalance roundrobin server srv1 192.168.23.41:80 check server srv2 192.168.23.40:80 check server sorryserver 127.0.0.1:8080 check backup具体使用2:
拒绝所有test为前缀的访问frontend webbind 172.20.23.36:80 default_backend httpdacl false_page path_beg /testblock if false_pageerrorfile 403 /etc/haproxy/errorfile/403.htmlbackend httpdbalance roundrobin server srv1 192.168.23.41:80 check server srv2 192.168.23.40:80 check server sorryserver 127.0.0.1:8080 check backup实现动静分离:
use_backend [backname] if 具体提使用:frontend webbind 172.20.23.36:80 default_backend httpdacl false_page path_beg /test block if false_pageacl php_page path_end .phpuse_backend vip if php_page --当访问php后缀的就网vip组中的主机调度errorfile 403 /etc/haproxy/errorfile/403.htmlbackend httpdbalance roundrobin server srv1 192.168.23.41:80 check server srv2 192.168.23.40:80 check server sorryserver 127.0.0.1:8080 check backupbackend vipbalance roundrobinserver vip1 192.168.23.42:80 check server vip2 192.168.23.43:80 checkurl:string
提取请求中的URL,一个典型的应用时具有预取能力的缓存以及需要从数据库聚合多个信息并将它们保存在缓存中的网页门户入口推荐使用pathreq.hdr([<name>[,<occ>]]):string
提取在一个HTTP请求报文的首部hdr([<name>[,<occ>]]): exact string matchhdr_beg([<name>[,<occ>]]): prefix matchhdr_dir([<name>[,<occ>]]): subdir matchhdr_dom([<name>[,<occ>]]): domain matchhdr_end([<name>[,<occ>]]): suffix matchhdr_len([<name>[,<occ>]]): length matchhdr_reg([<name>[,<occ>]]): regex matchhdr_sub([<name>[,<occ>]]): substring match示例:acl bad_agent hdr_sub(User-Agent) -i curl wgetblock if bad_agent拒绝使用curl和wget访问!测试:wget -O -- 172.20.23.20实现访问不同主机名称调度到不同的后端主机:
frontend webbind 172.20.23.36:80 default_backend httpdacl false_page path_beg /test block if false_pageacl php_page path_end .phpuse_backend vip if php_pageerrorfile 403 /etc/haproxy/errorfile/403.htmlacl bad_agent hdr_sub(Host) -i www.a.comuse_backend vip if bad_agentbackend httpdbalance roundrobin server srv1 192.168.23.41:80 check server srv2 192.168.23.40:80 check server sorryserver 127.0.0.1:8080 check backupbackend vipbalance roundrobinserver vip1 192.168.23.42:80 check server vip2 192.168.23.43:80 checkstatus : integer
返回在响应报文中的状态码系统预定义ACL
TRUE --总是匹配FALSE --总是不匹配HTTP --匹配http协议HTTP_1.0 --匹配1.0协议HTTP_1.1 --匹配1.1协议HTTP_CONTENT --匹配已经存在的内容长度HTTP_URL_ABS --匹配URL绝对路径HTTP_URL_SLASH --匹配URL相对路径HTTP_URL_STAR --匹配URL等于"*" LOACLHOST --匹配从localhost来的连接METH——CONNECT --匹配HTTP CONNECT方法METH_GET --匹配使用get为请求方法的METH-HEAD --匹配使用head为请求方法的其它配置项:
当被acl匹配到时就切换到指定backenduse_backend [backendname] if [aclname]阻止7层请求如果acl匹配成功block if [aclname]http-request {allow|deny|add-header}
acl niceguy src 172.20.23.1acl bedguy src 172.20.23.2具体使用:白名单http-request allow niceguyhttp-request deny bedguy根据第四层条件对传入连接执行操作:
tcp-request connection {accept|reject} [{if|unless} <condition>]示例:
listen sshbind :22222balance roundrobinmode tcpacl false_ip src 172.20.23.20tcp-request connection reject if false_ipserver ssh1 192.168.23.40:22 checkserver ssh2 192.168.23.41:22 check转载于:https://blog.51cto.com/13878078/2375045