当前位置: 首页 > news >正文

haproxy高级功能及配置

章节

一、haproxy 基础用法

二、haproxy 高级用法

三、haproxy之ACL的使用

目录

1 基于cookie的会话保持

1.1 cookie命名,并赋予其值

1.2 验证cookie信息

1.2.1 Windows浏览器验证

1.2.2 Linux下虚拟机验证

2 IP透传

2.1 四层与七层透传的区别

2.2 七层IP透传

2.2.1 增加 forwardfor 选项

2.2.2 修改web服务端的日志格式

2.3 四层透传


1 基于cookie的会话保持

cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址 hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session共享服务器代替

1.1 cookie命名,并赋予其值

注意:不支持 tcp mode,使用 http mode

listen webclusterbind *:80mode http                      #不支持 tcp modebalance roundrobin
# insert:表示在响应头中插入一个新的 cookie。
# nocache:表示禁用缓存,防止浏览器缓存 cookie。
# indirect:表示使用间接方式来保存会话关联的服务器信息,而不是直接在 cookie 中保存服务器名称。cookie WEBCOOKIE insert nocache indirectserver web1 192.168.239.10:80 cookie lee1 check inter 2 fall 3 rise 5  weight 1server web2 192.168.239.20:80 cookie lee2 check inter 2 fall 3 rise 5  weight 1server web3_sorry 192.168.239.100:8080 backup

1.2 验证cookie信息

1.2.1 Windows浏览器验证

点击刷新一直都是同一个网页内容证明实现效果成功

1.2.2 Linux下虚拟机验证

[root@localhost ~]# curl -b WEBCOOKIE=lee1 192.168.239.100
this is web1
[root@localhost ~]# curl -b WEBCOOKIE=lee2 192.168.239.100
this is web2
[root@localhost ~]# curl -b WEBCOOKIE=lee2 192.168.239.100
this is web2
[root@localhost ~]# curl -b WEBCOOKIE=lee2 192.168.239.100
this is web2
[root@localhost ~]# curl -b WEBCOOKIE=lee2 192.168.239.100
this is web2
[root@localhost ~]# curl -b WEBCOOKIE=lee2 192.168.239.100
this is web2
[root@localhost ~]# curl -b WEBCOOKIE=lee2 192.168.239.100
this is web2
[root@localhost ~]# curl -b WEBCOOKIE=lee2 192.168.239.100
this is web2
[root@localhost ~]# curl -b WEBCOOKIE=lee1 192.168.239.100
this is web1
[root@localhost ~]# curl -b WEBCOOKIE=lee1 192.168.239.100
this is web1
[root@localhost ~]# curl -b WEBCOOKIE=lee1 192.168.239.100

2 IP透传

web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。

2.1 四层与七层透传的区别

layer 4 与 layer 7

四层:IP+PORT转发

七层:协议+内容交换

四层负载

在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的选择web服务器的规则选择对应的web服务器IP地址,这样client就可以直接跟此服务器建立TCP连接并发送数据,而四层负载自身不参与建立连接,而和LVS不同,haproxy是伪四层负载均衡,因为haproxy 需要分别和前端客户端及后端服务器建立连接

七层代理

七层负载均衡服务器起了一个反向代理服务器的作用,服务器建立一次TCP连接要三次握手,而client要访问webserver要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver建立TCP连接,然后webserver把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用,七层代理需要和Client和后端服务器分别建立连接

2.2 七层IP透传

当haproxy工作在七层的时候,如何透传客户端真实IP至后端服务器

HAProxy配置

在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For”首部,其值为前端客户端的地址;用于向后端主发送真实的客户端IP

option forwardfor [ except <network> ] [ header <name> ] [ if-none ]
[ except <network> ]:请求报请来自此处指定的网络时不予添加此首部,如haproxy自身所在网络
[ header <name> ]:使用自定义的首部名称,而非“X-Forwarded-For”,示例:X-client
[ if-none ]  如果没有首部才添加首部,如果有使用默认值

范例:

2.2.1 增加 forwardfor 选项

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

2.2.2 修改web服务端的日志格式

修改NGINX支持的日志格式

[root@web1 ~]# vim /etc/nginx/nginx.conf

web1服务器配置文件中增加下列参数(NGINX)

[root@web1 ~]# systemctl restart nginx

客户端测试

查看NGINX的访问日志

web2服务器配置文件中增加下列参数(apache)

[root@web2 ~]# systemctl restart httpd

2.3 四层透传

修改mode 为tcp

在NGINX配置内添加变量proxy_protocol_addr 记录透传过来的客户端IP,并启用proxy_protocol代理功能

#haproxy 配置:
listen webclusterbind *:80mode tcpbalance roundrobinserver web1 192.168.239.10:80 send-proxy check inter 2 fall 3 rise 5  weight 1server web2 192.168.239.20:80  check inter 2 fall 3 rise 5  weight 1#nginx配置:添加变量proxy_protocol_addr 记录透传过来的客户端IP
http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''"$proxy_protocol_addr"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';server {listen       80 proxy_protocol; #启用此项,将无法直接访问此网站,只能通过四层代理访问server_name 192.168.239.10;

web1(NGINX)上查看访问日志

http://www.lryc.cn/news/423136.html

相关文章:

  • 【前端】NodeJS:记账本案例优化(MongoDB数据库)
  • Padding Mask;Sequence Mask;为什么如果没有适当的掩码机制,解码器在生成某个位置的输出时,可能会“看到”并错误地利用该位置之后的信息
  • 派森学长带你学python—字典
  • 如何设置 Visual Studio Code 的滚轮缩放功能
  • Python模拟退火算法
  • C语言典型例题36
  • 实现高亮的全文分页检索
  • 【buildroot与yocto区别】
  • 原创音乐小程序的设计
  • 使用 MongoDB 构建 AI:Flagler Health 的 AI 旅程如何彻底改变患者护理
  • 在 Linux 系统中下载 Python 并配置环境
  • 优化if-else的几种方式
  • 关于k8s集群Pod启动过程
  • Linux Vim教程(十五):使用Vimscript进行脚本编写
  • 解决element-ui回车键绑定按钮功能后却刷新浏览器的问题
  • MySQL基础练习题37-查找结果的质量和占比
  • 酒店行业如何利用XML进行营销短信
  • 【模型】TFLiteModel
  • 【Kubernetes】Service 概念与实战
  • RTSP|RTMP流如何指定坐标位置和分辨率获取RGB数据实时渲染和算法分析
  • 基于ssm+vue+uniapp的英语学习交流平台小程序
  • 如何判断一个TimerTask是否已经完成
  • Android常用面试题
  • JSON与Jsoncpp库:数据交换的灵活选择
  • salesforce rich text 字段支持html中内嵌JavaScript吗
  • Ubuntu24.04、22.04或20.04安装Golang方法教程
  • 学习记录第二十二天
  • 红酒与艺术展览:品味艺术与风味的双重盛宴
  • 1Panel配置
  • 场外期权是如何定价的?场外期权定价的基本原理是什么?