可以针对HTTP请求添加cookie,进行路由后端服务器
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至备用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双向添加,修改或删除HTTP报文首部
支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息
软件包:yum install haproxy
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service
配置段:
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
fronted:前端,相当于nginx, server {}
backend:后端,相当于nginx, upstream {}
listen:同时拥有前端和后端,适用于一对一环境,也就是前段和后端是一一对应的关系,只有一个端和一个后端
备注:以下的所有实验都是根据此拓扑图完成的
代理配置段:
check:对当前server做健康状态检测,只用于四层检测
注意:httpchk,“smtpchk”, “mysql-check”, “pgsql-check” and “ssl-hello-chk” 用于定义应用层检测方法
addr:检测时使用的IP地址,可以实现后端的服务器检测时使用一个ip地址,提供服务使用另外一个ip地址,使流量分流,提高效率
port :针对此端口进行检测
inter <delay>:连续两次检测之间的时间间隔,默认为2000ms
rise <count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2
fall <count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3
cookie <value>:为当前server指定cookie值,实现基于cookie的会话黏性
disabled:标记为不可用
redir<prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL
cookie <name>[ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain>]* [ maxidle <idle>] [ maxlife <life>]
<name>:cookie名称,用于实现持久连接
rewrite:重写
insert:插入
prefix:前缀
在火狐浏览器上访问时,按F12进入调试页面也可以看到,第一次访问时响应报文里会有一个cookie值,这样浏览器下次访问时就会带着这个cookie值,从而被调度到固定的主机
stats enable
启用统计页;基于默认的参数启用stats page
-stats uri: /haproxy?statsuri默认值
-stats realm : HAProxy\Statistics
-stats auth: no authentication
stats uri <prefix>
自定义stats page uri
stats auth <user>:<passwd>
认证时的账号和密码,可使用多次
stats realm <realm>
认证时的realm
stats hide-version
隐藏版本
stats refresh <delay>
设定自动刷新时间间隔
stats admin { if | unless } <cond>
启用stats page中的管理功能
maxconn <conns>:为指定的frontend定义其最大并发连接数;默认为2000
mode { tcp|http|health}
定义haproxy的工作模式
tcp:基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议,https时使用此模式,默认模式
http:仅当代理协议为http时使用,centos实际默认模式
health:工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接,较少使用
TCP模式的健康状态检测示例
对后端服务器做http协议的健康状态检测:
option httpchk默认为:/ OPTIONS HTTP/1.0
option httpchk <uri>
option httpchk <method><uri>
option httpchk <method><uri><version>
定义基于http协议的7层健康状态检测机制http-check expect [!] <match><pattern>
http协议健康状态检测响应内容或指定响应码
option forwardfor[ except <network>] [ header <name>] [ if-none ]
在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For”首部,其值为前端客户端的地址;用于向后端主发送真实的客户端IP
[ except <network>]:请求报文来自此处指定的网络时不予添加此首部,如haproxy自身所在网络
[ header <name>]:使用自定义的首部名称,而非“X-Forwarded-For”
[ if-none ]如果没有首部才添加首部,如果有使用默认值
示例
errorfile <code><file>自定义错误页
<code>:HTTP status code,支持200, 400, 403, 408, 500, 502, 503, 504,<file>:错误页文件路径
errorlo c<code><url>
相当于errorloc 302 <code><url>,利用302重定向至指URL
示例1
reqadd <string>[{if | unless} <cond>]
在请求报文尾部添加指定首部
rspadd <string>[{if | unless} <cond>]
在响应报文尾部添加指定首部
示例:rspadd X-Via:\ HAPorxy
reqdel <search>[{if | unless} <cond>]
reqidel <search>[{if | unless} <cond>] (ignore case) 不分大小写
从请求报文中删除匹配正则表达式的首部
rspdel <search>[{if | unless} <cond>]
rspidel <search>[{if | unless} <cond>] (ignore case) 不分大小写
从响应报文中删除匹配正则表达式的首部
示例1
示例1
示例2
示例3基于acl实现动静分离
示例4实现不同的域调度到不同服务器
示例5
1 、支持ssl会话;
bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE
crt后证书文件为PEM格式,且同时包含证书和所有私钥
cat demo.crt demo.key>demo.pem
2、 把80端口的请求重向定443
bind *:80
redirect scheme https if !{ ssl_fc}
3、 向后端传递用户请求的协议和端口(frontend或backend)
http-request set-header X-Forwarded-Port %[dst_port] ---添加端口
http-request add-header X-Forwared-Proto https if { ssl_fc} ---添加https协议
支持https指的是客户端访问haproxy时使用https协议,因为这一段一般是外网,而haproxy访问后端的web服务器时不用https,因为这一段一般都是内网
示例
这里我们使用简单的 httpd 服务进行测试。
实验环境
测试IPv6访问
在机器 3 上安装 httpd,配置监听 IPv4 和 IPv6 的 80 端口。
文件:/etc/httpd/conf/httpd.conf
Listen10.144.85.73:80
Listen[fd88:5110:a240::886:f252]:80
在 1 上通过 curl 访问 :
curl10.144.85.73:80
IPv4 可以正常访问 ,返回数据较长,这里不再展示。
#curl-g[fd88:5110:a240::886:f252]:80
curl: (7)Failedconnecttofd88:5110:a240::886:f252:80Connectionrefused
IPv6 地址无法访问到 httpd 服务。 IPv6 访问不稳定 ,有时可以正常返回数据。
机器 1 上抓包来看,数据包发送出去了:
23:42:52.924028IP6epic1.52564>fd88:5110:a240::886:f252.http:Flags[S],seq480439591,win28800,options[mss 1440,sackOK,TS val 17786404 ecr 0,nop,wscale 7],length0
23:42:52.924033ethertypeIPv6,IP6epic1.52564>fd88:5110:a240::886:f252.http:Flags[S],seq480439591,win28800,options[mss 1440,sackOK,TS val 17786404 ecr 0,nop,wscale 7],length0
23:42:52.924035ethertypeIPv6,IP6epic1.52564>fd88:5110:a240::886:f252.http:Flags[S],seq480439591,win28800,options[mss 1440,sackOK,TS val 17786404 ecr 0,nop,wscale 7],length0
23:42:52.937267ethertypeIPv6,IP6fd88:5110:a240::886:f252.http>epic1.52564:Flags[R.],seq0,ack480439592,win0,length0
23:42:52.937270ethertypeIPv6,IP6fd88:5110:a240::886:f252.http>epic1.52564:Flags[R.],seq0,ack1,win0,length0
23:42:52.937271IP6fd88:5110:a240::886:f252.http>epic1.52564:Flags[R.],seq0,ack1,win0,length0
此时机器 3 上抓不到包。
HAproxy 代理测试
在机器 1 上安装 HAproxy。
IPv6 代理 IPv4
我们配置 机器 1 的 IPv6 地址来代理 机器 3 的 IPv4 地址,配置如下:
另外,配置了 HAproxy 的管理页面,这里不再赘述。
理论上,可以在浏览器中输入http://[fd88:5110:a240::886:f250]:8080/,来测试。
由于公司环境,VPN 没有代理 IPv6 地址,所以只能通过 curl 的方式测试。
在机器 3 上访问:
curl -g [fd88:5110:a240::886:f250]:8080
数据可以正常返回,返回用时不稳定,大部分情况下 返回结果用时很长 ,用时近 15s。也有访问无返回的情况。
通过 机器 2 访问时,一切正常!返回速度也很快!
IPv4 代理 IPv6
现在机器 3 的 httpd 服务无法通过 IPv6 正常访问,我们只能采用 迂回的方式 来做这个测试了。
既然,在机器 2 上可以通过 IPv6 访问 HAproxy 代理的服务,那我们在机器 2 上再做一层 HAproxy。
机器 2 的 HAproxy 配置:
这里的后端 http1 的地址使用的是机器 2 上的 HAproxy 的对外地址。
这里,可以通过浏览器访问http://10.144.91.125:18080/:
正常访问
结论
1、通过 HAproxy 可以实现 IPv4 代理 IPv6,IPv6 代理 IPv4 ;
2、地址转换时感觉还是有些问题,不确定是否是 httpd 服务的问题还是机器;
3、下一步需要 部署真实服务再进行验证 ;
链接:https://www.jianshu.com/p/09e62aa8caff
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)