基于cookie的会话保持
cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,但同时也加大了haproxy负载,目前此模式使用较少,已经被session共享服务器代替
注意:不支持mode tcp,使用mode http
cookie [option]
name: #cookie的key名称,用于实现持久连接
insert: #插入新的cookie,默认不插入cookie
indirect: #如果客户端已经有cookie,则不会再发送cookie信息
nocache: #当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie
#配置
listen web_80
bind 172.16.0.8:80
bind 10.0.0.8:80
cookie webserver insert nocache
log global
server 10.0.0.7 10.0.0.7:80 check inter 3s fall 2 rise 3 cookie web1
server 10.0.0.17 10.0.0.17:80 check inter 3s fall 2 rise 3 cookie web2
curl -i 172.16.0.8
set-cookie: webserver=web1; path=/
curl -b webserver=web1 172.16.0.8
10.0.0.7
HAproxy状态页
配置:
stats enable #基于默认的参数启用stats page
stats hide-version #将状态页中haproxy版本隐藏
stats refresh 30s #设定自动刷新时间间隔,默认不自动刷新
stats uri /status #自定义stats uri路径
stats realm #账户认证时的提示信息
stats auth admin:123456 #认证时的账号和密码,可有多行用户
stats admin if TRUE #启用stats page中的管理功能,不建议开启
#例:
listen stats
bind 10.0.0.8:9999
stats enable
log global
stats uri /haproxy_status
stats auth admin:123456
stats admin if TRUE
#通过curl 命令对haproxy的状态页的访问实现健康检查
curl -I http://admin:[email protected]:9999/status
HTTP/1.1 200 OK
content-type: text/html
七层IP透传
#IP透传:
web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护等场景
#Haproxy配置
defaults
option forwardfor header x-client #首部字段为 x-client:10.0.0.10
mode http
#apache服务器配置
LogFormat "%{X-client}i %a %l %u %t \"%r\" %>s %b \"%{Referer}i\"" combined
CustomLog "logs/access_log" combined
tail -f /var/log/httpd/access_log
172.16.0.6 10.0.0.8 - - [09/Apr/2020:23:29:20 +0800] "GET / HTTP/1.1" 200 9 "-"
#Nginx服务器配置
$proxy_add_x_forwarded_for:包括客户端IP和中间经过的所有代理的IP
$http_x_forwarded_For:只有客户端IP
log_format main '"$proxy_add_x_forwarded_for"'
'$status $body_bytes_sent "$http_referer"'
'"$http_user_agent" $http_x_forwarded_For';
tail /var/log/nginx/access.log
"172.16.0.200, 10.0.0.100" 10.0.0.100 - - [09/Apr/2020:19:10:16 +0800] "GET / HTTP/1.1" 200 4057 "-" "curl/7.19.7 " "172.16.0.200"
报文修改
在http模式下,基于实际需求修改客户端的请求报文与响应报文,通过http-request和http-response在请求报文添加或删除字段
示例:
http-request add-header Date %T #请求报文添加date字段
http-request del-header Date #请求报文删除date字段
http-response add-header Via haproxy #响应报文添加Via字段
http-response del-header server #响应报文删除server字段
listen web_80
bind 172.16.0.8:80
http-request add-header Date %T
http-response del-header server
日志管理
log global #开启日志功能,默认只会在记录下面格式的日志
option httplog #开启记录httplog日志格式选项
capture request header Host len 256 #记录请求报文中host的256字节
capture request header X-clinet len 15 #记录请求报文中x-clinet的15字节
压缩功能
#对响应给客户端的报文进行压缩,以节省网络带宽
#注:会占用部分CPU性能,建议在后端服务器开启压缩功能,而非在HAProxy上开启压缩
compression algo gzip #启用http协议中的压缩机制gzip
compression type <mime type> #要压缩的文件类型
#示例:
listen web_http
compression algo gzip
compression type text/html text/csstext/plain
Web服务器状态监测
#web服务器状态七层检查会生成大量日志
#使用HEAD方法节省流量带宽
option httpchk HEAD / #默认HTTP/1.0
option httpchk HEAD / HTTP/1.1\r\nHost:\ 10.0.0.8 #HTTP/1.1 必须带host首部
#例:
listen
option httpchk HEAD / HTTP/1.1\r\nHost:\ 10.0.0.8
#后端服务器查看访问日志
tail -f /var/log/httpd/access_log
- 10.0.0.8 - - [10/Apr/2020:14:07:47 +0800] "HEAD / HTTP/1.1" 200 - "-"
- 10.0.0.8 - - [10/Apr/2020:14:07:50 +0800] "HEAD / HTTP/1.1" 200 - "-"
- 10.0.0.8 - - [10/Apr/2020:14:07:53 +0800] "HEAD / HTTP/1.1" 200 - "-" ...
ACL控制
访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤,并做出控制
#匹配规范
hdr_beg(host) www. #前缀匹配,header中host字段以www.开头
hdr_end(host) .com #后缀匹配,header中host字段以.com结尾
hdr_dom(host) www.ssy.org #域匹配,header中host字段为www.ssy.org
hdr_dir(host) #路径匹配,header的uri路径
hdr_sub(User-agent) #子串匹配,包含,header中的模糊匹配
#提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)
<scheme>://<user>:<password>@<host>:<port>#/;#?#
path_beg #请求的URL开头,如/static、/images、/img、/css
path_end #请求的URL中资源的结尾,如 .gif .png .css .js .jpg .jpeg
dst #目标IP
dst_port #目标PORT
src #源IP
src_port #源PORT
#acl匹配模式
-i 不区分大小写
-n 不做DNS解析
-u 禁止acl重名,否则多个同名ACL匹配或关系
#acl调用方式
与:默认使用
或:使用“or”
取反:使用 "!"
ACL基于域名匹配
frontend web_80
mode http
bind 172.16.0.8:80
log global
#acl
acl pc.domain hdr_dom(host) www.ssy.org
acl m.domain hdr_dom(host) m.ssy.org
use_backend pc_host if pc.domain
use_backend m_host if m.domain
default_backend pc_host #默认调度
backend pc_host
server 10.0.0.7 10.0.0.7:80 check inter 3s fall 2 rise 3 cookie web1
backend m_host
server 10.0.0.17 10.0.0.17:80 check inter 3s fall 2 rise 3 cookie web2
cat /etc/hosts
172.16.0.8 m.ssy.org www.ssy.org
curl www.ssy.org
10.0.0.7 Apache
curl m.ssy.org
10.0.0.17 Nginx
ACL基于源IP地址或子网匹配
frontend web_80
mode http
bind 172.16.0.8:80
log global
acl pc.domain hdr_dom(host) www.ssy.org
acl m.domain hdr_dom(host) m.ssy.org
acl ip_host src 172.16.0.0/16 10.0.0.6 #匹配源IP来自172.16.0.0/24网段
use_backend pc_host if ip_host #调度到后端pc_host,此优先级比下面的高
use_backend pc_host if pc.domain
use_backend m_host if m.domain
default_backend pc_host
backend pc_host
server 10.0.0.7 10.0.0.7:80 check inter 3s fall 2 rise 3 cookie web1
backend m_host
server 10.0.0.17 10.0.0.17:80 check inter 3s fall 2 rise 3 cookie web2
curl 172.16.0.8 #连续三次curl都是后端10.0.0.7
10.0.0.7 Apache
ACl基于浏览器类型匹配
frontend web_80
mode http
bind 172.16.0.8:80
log global
acl use_agent hdr_sub(User-agent) -i curl wget
acl use_agent_ab hdr_sub(User-agent) -i Apachebench
http-request deny if use_agent_ab #使用ab命令就拒绝
redirect prefix www.baidu.com if use_agent #使用curl或wget就302重定向
default_backend pc_host
backend pc_host
server 10.0.0.7 10.0.0.7:80 check inter 3s fall 2 rise 3 cookie web1
backend m_host
server 10.0.0.17 10.0.0.17:80 check inter 3s fall 2 rise 3 cookie web2
curl -I 172.16.0.8
HTTP/1.1 302 Found
content-length: 0
location: www.baidu.com/
ab -c1 -n1 http://172.16.0.8/
Non-2xx responses: 1
curl -A apachebench 172.16.0.8
<html><body><h1>403 Forbidden</h1>
ACL-基于后缀名实现动静分离
frontend web_80
mode http
bind 172.16.0.8:80
log global
acl static path_end -i .html .css .jpg .png
acl php path_end -i .php
use_backend pc_host if php
use_backend m_host if static
default_backend pc_host
#也可以使用此方式
# acl static path_beg -i /static /images /javascript
# use_backend m_host if static
# default_backend pc_host
backend pc_host
server 10.0.0.7 10.0.0.7:80 check inter 3s fall 2 rise 3 cookie web1
backend m_host
server 10.0.0.17 10.0.0.17:80 check inter 3s fall 2 rise 3 cookie web2
curl 172.16.0.8/yyy.html
static
curl 172.16.0.8/yyy.php
php
自定义HAproxy错误页面
#自定义错误页
支持状态码 400, 403, 405, 408, 425, 429, 500, 502,503,504
#示例:
defaults
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
vim /apps/haproxy/html/503.http #http后缀文件需要有报文头部信息
HTTP/1.1 503 Service Unavailable
Content-Type:text/html;charset=utf-8
.... #以下为错误页面代码