当前位置:   article > 正文

haproxy实验

haproxy实验

基本介绍

http://t.csdnimg.cn/Z64QVicon-default.png?t=N7T8http://t.csdnimg.cn/Z64QV

实验环境

功能IP
客户端172.25.254.233
haproxy

eth0:172.25.254.100   eth1:192.168.0.10

rs1eth0:192.168.0.101
rs2eth0:192.168.0.102

安装haproxy

yum install haproxy -y

多进程和多线程 

vim /etc/haproxy/haproxy.cfg

多进程 

查看多进程信息

多线程 

 查看多线程

haproxy的状态界面

 

Proxies配置-listen 简化配置  

 socat 工具

查看haproxy状态

  1. #查看集群权重
  2. [root@haproxy ~]# echo get weight webcluster/web1 | socat stdio
  3. /var/lib/haproxy/stats
  4. 2 (initial 2)
  5. [root@haproxy ~]# echo get weight webcluster/web2 | socat stdio
  6. /var/lib/haproxy/stats
  7. 1 (initial 1)
  8. #设置权重
  9. [root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio
  10. /var/lib/haproxy/stats
  11. [root@haproxy ~]# echo "set weight webcluster/web1 2 " | socat stdio
  12. /var/lib/haproxy/stats
  13. #下线后端服务器
  14. [root@haproxy ~]# echo "disable server webcluster/web1 " | socat stdio
  15. /var/lib/haproxy/stats
  16. #上线后端服务器
  17. [root@haproxy ~]# echo "enable server webcluster/web1 " | socat stdio
  18. /var/lib/haproxy/stats

 针对多进程处理方法

在配置文件中修改增加以下内容

stats socket /var/lib/haproxy/stats1 mode 600 level admin process 1
stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2
nbproc 2
cpu-map 1 0
cpu-map 2 1

 静态算法

 static-rr:基于权重的轮询调度

不支持运行时利用 socat 进行权重的动态调整 ( 只支持 0 1, 不支持其它值 )
不支持端服务器慢启动
其后端主机数量没有限制,相当于 LVS 中的 wrr
示例:
  1. vim /etc/haproxy/haproxy.cfg
  2. stats socket /var/lib/haproxy/stats1 mode 600 level admin process 1
  3. stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2
  4. nbproc 2
  5. cpu-map 1 0
  6. cpu-map 2 1
  1. [root@haproxy ~]# ll /var/lib/haproxy/
  2. 总用量 0
  3. srw------- 1 root root 0 8月 8 13:43 stats
  4. srw------- 1 root root 0 8月 8 13:46 stats1
  5. srw------- 1 root root 0 8月 8 13:46 stats2

first

根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用 socat 进行动态修改权重 , 可以设置 0 1, 可以设置其它值但无效
示例:
  1. vim /etc/haproxy/haproxy.cfg
  2. listen webserver_80
  3. bind 172.25.254.100:80
  4. mode http
  5. balance first
  6. server webserver1 192.168.0.101:80 maxconn 3 check inter 3s fall 3 rise 5
  7. server webserver2 192.168.0.102:80 check inter 3s fall 3 rise 5
测试效果:
  1. #在两台主机上分别执行此循环,可以观察是否102被调度到
  2. while true;do curl 172.25.254.100 ; sleep 0.1;done

动态算法

基于后端服务器状态进行调度适当调整,
新请求将优先调度至当前负载较低的服务器
权重可以在 haproxy 运行时动态调整无需重启

roundrobin

1. 基于权重的轮询动态调度算法,
2. 支持权重的运行时调整,不同于 lvs 中的 rr 轮训模式,
3. HAProxy 中的 roundrobin 支持慢启动 ( 新加的服务器会逐渐增加转发数 )
4. 其每个后端 backend 中最多支持 4095 real server
5. 支持对 real server 权重动态调整,
6. roundrobin 为默认调度算法 , 此算法使用广泛

 示例:

  1. vim /etc/haproxy/haproxy.cfg
  2. listen webserver_80
  3. bind 172.25.254.100:80
  4. mode http
  5. balance roundrobin
  6. server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
  7. server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

动态调整权重

  1. echo "set weight webserver_80/webserver1 2" | socat stdio
  2. /var/lib/haproxy/haproxy.sock

leastconn

leastconn 加权的最少连接的动态
支持权重的运行时调整和慢启动,即 : 根据当前连接最少的后端服务器而非权重进行优先调度 ( 新客户
端连接 )
比较适合长连接的场景使用,比如: MySQL 等场景。

示例:

  1. vim /etc/haproxy/haproxy.cfg
  2. listen webserver_80
  3. bind 172.25.254.100:80
  4. mode http
  5. balance leastconn
  6. server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
  7. server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

其他算法 

source

源地址 hash ,基于用户源地址 hash 并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一
个后端 web 服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服
务器,默认为静态方式,但是可以通过 hash-type 支持的选项更改这个算法一般是在不插入 Cookie TCP
模式下使用,也可给拒绝会话 cookie 的客户提供最好的会话粘性,适用于 session 会话保持但不支持
cookie 和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法
和一致性 hash

 示例:

  1. vim /etc/haproxy/haproxy.cfg
  2. listen webserver_80
  3. bind 172.25.254.100:80
  4. mode http
  5. balance source
  6. server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
  7. server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

测试:

  1. [root@node10 ~]# for N in {1..6}; do curl 172.25.254.100; done
  2. RS1 server - 192.168.0.101
  3. RS1 server - 192.168.0.101
  4. RS1 server - 192.168.0.101
  5. RS1 server - 192.168.0.101
  6. RS1 server - 192.168.0.101
  7. RS1 server - 192.168.0.101
如果访问客户端时一个家庭,那么所有的家庭的访问流量都会被定向到一台服务器,这时 source
法的缺陷

 map-base 取模法

map-based :取模法,对 source 地址进行 hash 计算,再基于服务器总权重的取模,最终结果决定将此请
求转发至对应的后端服务器。
此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度
缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果
整体改变hash-type 指定的默值为此算法

示例: 

  1. [root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
  2. ...上面内容省略...
  3. listen webserver_80
  4. bind 172.25.254.100:80
  5. mode http
  6. balance source
  7. server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
  8. server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
  9. ...上面内容省略...
  10. #不支持动态调整权重值
  11. [root@haproxy ~]# echo "set weight webserver_80/webserver1 2" | socat stdio
  12. /var/lib/haproxy/haproxy.sock
  13. Backend is using a static LB algorithm and only accepts weights '0%' and '100%'.
  14. #只能动态上线和下线
  15. [root@haproxy ~]# echo "set weight webserver_80/webserver1 0" | socat stdio
  16. /var/lib/haproxy/haproxy.sock
  17. [root@haproxy ~]# echo "get weight webserver_80/webserver1" | socat stdio
  18. /var/lib/haproxy/haproxy.sock
  19. 0 (initial 1)
一致性 hash
一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动 hash o
mod n
hash 算法是动态的,支持使用 socat 等工具进行在线权重调整,支持慢启动

算法:

1 、后端服务器哈希环点 keyA=hash( 后端服务器虚拟 ip)%(2^32)
2 、客户机哈希环点 key1=hash(client_ip)%(2^32) 得到的值在 [0---4294967295] 之间,
3 、将 keyA key1 都放在 hash 环上,将用户请求调度到离 key1 最近的 keyA 对应的后端服务器

 

 

 

hash环偏斜问题  

增加虚拟服务器 IP 数量,比如:一个后端服务器根据权重为 1 生成 1000 个虚拟 IP ,再 hash 。而后端服务器权
重为 2 则生成 2000 的虚拟 IP ,再 bash, 最终在 hash 环上生成 3000 个节点,从而解决 hash 环偏斜问题

 示例:

  1. listen webserver_80
  2. bind 172.25.254.100:80
  3. mode http
  4. balance source
  5. hash-type consistent
  6. server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
  7. server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

 uri

基于对用户请求的 URI 的左半部分或整个 uri hash ,再将 hash 结果对总权重进行取模后
根据最终结果将请求转发到后端指定服务器
适用于后端是缓存服务器场景
默认是静态算法,也可以通过 hash-type 指定 map-based consistent ,来定义使用取模法还是一致性 hash

示例:

  1. listen webserver_80
  2. bind 172.25.254.100:80
  3. mode http
  4. balance uri
  5. server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
  6. server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

uri 一致性hash配置示例

  1.  
  2. listen webserver_80
  3. bind 172.25.254.100:80
  4. mode http
  5. balance uri
  6. hash-type consistent
  7. server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
  8. server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

 访问测试

  1. [root@rs1 ~]# echo RS1 192.168.0.101 index1 > /var/www/html/index1.html
  2. [root@rs1 ~]# echo RS1 192.168.0.101 index2 > /var/www/html/index2.html
  3. [root@rs1 ~]# echo RS1 192.168.0.101 index3 > /var/www/html/index3.html
  4. [root@rs2 ~]# echo RS1 192.168.0.102 index1 > /var/www/html/index1.html
  5. [root@rs2 ~]# echo RS1 192.168.0.102 index2 > /var/www/html/index2.html
  6. [root@rs2 ~]# echo RS1 192.168.0.102 index3 > /var/www/html/index3.html
  7. [root@node10 ~]# curl 172.25.254.100/index.html
  8. RS2 server - 192.168.0.102
  9. [root@node10 ~]# curl 172.25.254.100/index1.html
  10. RS1 192.168.0.101 index1

基于cookie的会话保持

配置:

  1. listen webserver_80
  2. bind 172.25.254.100:80
  3. option forwardfor
  4. mode http
  5. balance roundrobin
  6. cookie WEBCOOKIE insert nocache indirect
  7. server webserver1 192.168.0.101:80 cookie web1 weight 1 check inter 3s fall 3 rise 5
  8. server webserver2 192.168.0.102:80 cookie web2 weight 1 check inter 3s fall 3 rise 5

测试:

指导cookie访问

haproxy状态页配置

状态页配置项
stats enable # 基于默认的参数启用 stats page
stats hide-version # 将状态页中 haproxy 版本隐藏
stats refresh <delay> # 设定自动刷新时间间隔,默认不自动刷新
stats uri <prefix> # 自定义 stats page uri ,默认值: /haproxy?stats
stats auth <user>:<passwd> # 认证时的账号和密码,可定义多个用户 , 每行指定一个用户
# 默认: no authentication
stats admin { if | unless } <cond> # 启用 stats page 中的管理功能

IP透传 

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

四层IP透传

  1. [haproxy ~]# vim /etc/haproxy/haproxy.cfg
  2. ...上面内容省略...
  3. listen webserver_80
  4. bind 172.25.254.100:80
  5. mode tcp
  6. balance roundrobin
  7. server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
  8. #正常的nginx配置
  9. [root@rs1 ~]# vim /etc/nginx/nginx.conf
  10. 。。。内容省略。。。
  11. http {
  12. log_format main '$remote_addr - $remote_user [$time_local] "$request"'
  13. '$status $body_bytes_sent "$http_referer" '
  14. '"$http_user_agent" "$http_x_forwarded_for"';
  15. 。。。内容省略。。。
  16. server {
  17. listen 80;
  18. listen [::]:80;
  19. server_name _;
  20. root /usr/share/nginx/html;
  21. 。。。内容省略。。。
  22. }
  23. }
  24. #在访问haproxy后查看nginx日志
  25. [root@rs1 ~]# tail -n 3 /var/log/nginx/access.log
  26. 192.168.0.10 - - [10/Jul/2024:15:21:00 +0800] "GET / HTTP/1.1"200 18 "-"
  27. "curl/7.29.0" "-"192.168.0.10 - - [10/Jul/2024:15:26:11 +0800] "GET /
  28. HTTP/1.1"200 18 "-" "curl/7.29.0" "-"
  29. 在此日志中是无法看到真实访问源地址的
  30.  

开启四层透传

  1. [root@rs1 ~]# vim /etc/nginx/nginx.conf
  2. 。。。内容省略。。。
  3. http {
  4. log_format main '$remote_addr - $remote_user [$time_local] "$request"'
  5. 5.3.3 七层IP透传
  6. 当haproxy工作在七层的时候,也可以透传客户端真实IP至后端服务器
  7. 5.3.3.1 HAProxy配置
  8. 在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For"首部,其值为前端客户端的地址;用于
  9. 向后端主发送真实的客户端IP
  10. 示例:
  11. ' "$proxy_protocol_addr"'
  12. '$status $body_bytes_sent "$http_referer" '
  13. '"$http_user_agent" "$http_x_forwarded_for"';
  14. 。。。内容省略。。。
  15. server {
  16. listen 80 proxy_protocol; #启用此项,将无法直接访问此网站,只能通过四层代理
  17. 访问
  18. listen [::]:80;
  19. server_name _;
  20. root /usr/share/nginx/html;
  21. 。。。内容省略。。。
  22. }
  23. }
  24. #修改haproxy
  25. haproxy ~]# vim /etc/haproxy/haproxy.cfg
  26. ...上面内容省略...
  27. listen webserver_80
  28. bind 172.25.254.100:80
  29. mode tcp
  30. balance roundrobin
  31. server webserver1 192.168.0.101:80 send-proxy weight 1 check inter 3s fall 3
  32. rise 5
  33. ...上面内容省略...
  34. #查看日志内容
  35. [root@rs1 ~]# tail -n 3 /var/log/nginx/access.log
  36. 192.168.0.10 - - [10/Jul/2024:15:21:00 +0800] "GET / HTTP/1.1"200 18 "-"
  37. "curl/7.29.0" "-"
  38. 192.168.0.10 - - [10/Jul/2024:15:26:11 +0800] "GET / HTTP/1.1"200 18 "-"
  39. "curl/7.29.0" "-"
  40. 192.168.0.10 - - [10/Jul/2024:15:41:56 +0800] "GET / HTTP/1.1" "172.25.254.10"200
  41. 18 "-" "curl/7.29.0"
七层 IP 透传
haproxy 工作在七层的时候,也可以透传客户端真实 IP 至后端服务器

示例:

  1. #修改haproxy
  2. [haproxy ~]# vim /etc/haproxy/haproxy.cfg
  3. ...上面内容省略...
  4. listen webserver_80
  5. option forwardfor
  6. bind 172.25.254.100:80
  7. mode http
  8. balance roundrobin
  9. server webserver1 192.168.0.101:80 send-proxy weight 1 check inter 3s fall 3 rise 5
  10. server webserver1 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

 ACL配置选项

# acl 来定义或声明一个 acl
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 名称 匹配规范 匹配模式 具体操作符 操作对象类型

示例:

  1. [haproxy ~]# vim /etc/haproxy/haproxy.cfg
  2. ...上面内容省略...
  3. frontend testacl
  4. bind :80
  5. mode http
  6. ########### ACL settings #######################
  7. acl web_host hdr_dom(host) www.timinglee.org
  8. ########### host ###########################
  9. use_backend timinglee_host if web_host
  10. ########### default server ###################
  11. default_backend default_webserver
  12. backend timinglee_host
  13. mode http
  14. server web1 192.168.0.101:80 check weight 1 inter 3s fall 3 rise 5
  15. server web2 192.168.0.102:80 check weight 1 inter 3s fall 3 rise 5
  16. backend default_webserver
  17. mode http
  18. server web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5

 测试结果

  1. #在浏览器所在主机中做地址解析
  2. [root@node10 html]# vim /etc/hosts
  3. 172.25.254.100 www.timinglee.org
  4. #测试结果
  5. [root@node10 html]# curl www.timinglee.org
  6. RS1 192.168.0.101
  7. [root@node10 html]# curl www.timinglee.org
  8. RS2 server - 192.168.0.102
  9. [root@node10 html]# curl 172.25.254.100
  10. default web server node10

 自定义HAProxy 错误界面

基于自定义错误页面文件

  1. haproxy ~]# vim /etc/haproxy/haproxy.cfg
  2. ...上面内容省略...
  3. defaults
  4. 测试:
  5. 5.5.2 基于http重定向错误页面
  6. 范例:
  7. mode http
  8. ...内容省略...
  9. timeout client 1m
  10. timeout server 1m
  11. timeout http-keep-alive 10s
  12. timeout check 10s
  13. maxconn 1000000
  14. errorfile 503 /haproxy/errorpages/503page.http
  15. [root@haproxy ~]# mkdir /haproxy/errorpages/ -p
  16. [root@haproxy ~]# cp /usr/share/haproxy/503.http /haproxy/errorpages/503page.http
  17. [root@haproxy ~]# vim /haproxy/errorpages/503page.http
  18. HTTP/1.0 503 Service Unavailable^M
  19. Cache-Control: no-cache^M
  20. Connection: close^M
  21. Content-Type: text/html;charset=UTF-8^M
  22. ^M
  23. <html><body><h1>什么动物生气最安静</h1>
  24. 大猩猩!!
  25. </body></html>
基于 http 重定向错误页面
  1. [haproxy ~]# vim /etc/haproxy/haproxy.cfg
  2. ...上面内容省略...
  3. defaults
  4. mode http
  5. ...内容省略...
  6. timeout client 1m
  7. timeout server 1m
  8. timeout http-keep-alive 10s
  9. timeout check 10s
  10. 5.6 HAProxy 四层负载
  11. 针对除HTTP以外的TCP协议应用服务访问的应用场景
  12. 四层负载示例
  13. 注意:如果使用frontend和backend,一定在 frontend 和 backend 段中都指定mode tcp
  14. 范例:对 MySQL 服务实现四层负载
  15. maxconn 1000000
  16. errorloc 503 https://www.baidu.com
  17. #浏览器访问172.25.254.100 自动跳转到百度

HAProxy https 实现

haproxy 可以实现 https 的证书安全 , 从用户到 haproxy https, haproxy 到后端服务器用 http 通信
但基于性能考虑 , 生产中证书都是在后端服务器比如 nginx 上实现

证书制作

  1. [haproxy ~]# mkdir /etc/haproxy/certs/
  2. [haproxy ~]# openssl req -newkey rsa:2048 \
  3. -nodes -sha256 –keyout /etc/haproxy/certs/timinglee.org.key \
  4. -x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt

 配置:

  1. [haproxy ~]# vim /etc/haproxy/haproxy.cfg
  2. frontend webserver
  3. bind *:80
  4. redirect scheme https if !{ ssl_fc }
  5. mode http
  6. use_backend webcluster
  7. frontend webserver-https
  8. bind *:443 ssl crt /etc/haproxy/timinglee.org.pem
  9. mode http
  10. use_backend webcluster
  11. backend webcluster
  12. mode http
  13. balance roundrobin
  14. server web1 172.25.254.200:80 check inter 3s fall 3 rise 5
  15. server web2 172.25.254.201:80 check inter 3s fall 3 rise 5

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/997670
推荐阅读
相关标签
  

闽ICP备14008679号