haproxy七层代理

一.负载均衡
1.1.什么是负载均衡
负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展。

1.2为什么用负载均衡
Web服务器的动态水平扩展-->对用户无感知
增加业务并发访问及处理能力-->解决单服务器瓶颈问题
节约公网IP地址-->降低IT支出成本
隐藏内部服务器IP-->提高内部服务器安全性
配置简单-->固定格式的配置文件
功能丰富-->支持四层和七层,支持动态下线主机
性能较强-->并发数万甚至数十万


1.通过ip+port决定负载均衡的去向。
2.对流量请求进行NAT处理,转发至后台服务器。
3.记录tcp、udp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。
4.支持四层的软件
   lvs:重量级四层负载均衡器。
   Nginx:轻量级四层负载均衡器,可缓存。(nginx四层是通过upstream模块)
   Haproxy:模拟四层转发。
七层负载均衡


1.通过虚拟url或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
2.代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接,
3.支持7层代理的软件:
    Nginx:基于http协议(nginx七层是通过proxy_pass)
   Haproxy:七层代理,会话保持、标记、路径转移等。

5、 四层和七层的区别
     所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时, 依据四层的信息或七层的
信息 来决 定怎么样转发流量

    四层的负载均衡,就是通过发布三层的 IP 地址( VIP ),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT 处理,转发至后台服务器,并记录下这个 TCP 或者 UDP 的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理

    七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web 服务器的负载均衡,除了根据 VIP 加 80 端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。

1. 分层位置 : 四层负载均衡在传输层及以下,七层负载均衡在应用层及以下
2. 性能 : 四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高 : 七层可支持解析应用层报文消息内容,识别URL 、 Cookie 、 HTTP header 等信息。、
3. 原理 : 四层负载均衡是基于 ip+port; 七层是基于虚拟的 URL 或主机 IP 等。
4. 功能类比 : 四层负载均衡类似于路由器 ; 七层类似于代理服务器。
5.安全性 : 四层负载均衡无法识别 DDoS 攻击 ; 七层可防御 SYN Cookie/Flood 攻击

.haproxy简介

HAProxy是法国开发者 威利塔罗(Willy Tarreau) 2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCPHTTP负载均衡器

支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计

三,软件安装。

[root@haceproc ~]# vim /etc/haproxy/haproxy.cfg    编写主配置文件

web 1端相关配置设定。

web 2端相关配置设定。


二、haproxy基本部署和全局匹配

proxies :代理配置段

    defaults:为frontend, backend, listen提供默认配置
    frontend:前端,相当于nginx中的server {}
    backend:后端,相当于nginx中的upstream {}
    listen:同时拥有前端和后端配置,配置简单,生产推荐使用

[root@haceproc ~]# vim /etc/haproxy/haproxy.cfg    编写主配置文件


#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------

#frontend webcluster
#    bind *:80                              第一种       前端和后端分开
#    mode http
#    use_backend webcluster-host
#
#backend webcluster-host
#balance roundrobin
#   server web1 172.25.254.10:80
#    server web2 172.25.254.20:80

listen webcluster
    bind *:80
    mode http                               第二种           前后端在一起
    balance roundrobin
    server web1 172.25.254.10:80 
    server web2 172.25.254.20:80 
    

[root@haceproc ~]# systemctl restart haproxy.service          重启服务。

测试

全局布局:(双线程双核心设定)。

global :全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug 参数
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
    #stats socket /var/lib/haproxy/stats mode 600 level admin
    #stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2


    # utilize system-wide crypto-policies
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM
    nbproc 2               #开两个进程
    cpu-map 1 0            #1 第一个进程用 ,1 第一个核心 
    cpu-map 2 1            #2 第二个进程用 , 1 第二个核心
#    nbthread 2            #开启两个线程      注意线程和进程不能同时存在

查看多进程

haproxy haproxy]# pstree -p | grep haproxy
              |-haproxy(4817)-+-haproxy(4822)
              | `-haproxy(4824)

proxies配置 (代理配置)

proxies-server服务。

defaults
mode            http                      # HAProxy实例使用的连接协议
log             global                    #指定日志地址和记录日志条目的syslog/rsyslog日志设备
                                          #此处的 global表示使用 global配置段中设定的log值。
option          httplog                #日志记录选项,httplog表示记录与 HTTP会话相关的各属性值
                                        #包括 HTTP请求、会话状态、连接数、源地址以及连接时间等
option          dontlognull               #dontlognull表示不记录空会话连接日志
option http-server-close                  #等待客户端完整HTTP请求的时间,此处为等待10s。
option forwardfor    except 127.0.0.0/8    #透传客户端真实IP至后端web服务器
                                            #在apache配置文件中加入:<br>%{XForwarded-For}i
                                            #后在webserer中看日志即可看到地址透传信息
option          redispatch                     #当server Id对应的服务器挂掉后,强制定
                                             向到其他健康的服务器,重新派发
option          http-keep-alive                #开启与客户端的会话保持
retries         3                          #连接后端服务器失败次数
timeout http-request    1000s                 #等待客户端请求完全被接收和处理的最长时间
timeout queue           60s                       #设置删除连接和客户端收到503或服务不可
                                                  用等提示信息前的等待时间
timeout connect         120s                   #设置等待服务器连接成功的时间
timeout client          600s                   #设置允许客户端处于非活动状态,即既不
                                                发送数据也不接收数据的时间
timeout server          600s                  #设置服务器超时时间,即允许服务器处于既
                                               不接收也不发送数据的非活动时间
timeout http-keep-alive  60s                   #session 会话保持超时时间,此时间段内
                                                会转发到相同的后端服务器
timeout check            10s                     #指定后端服务器健康检查的超时时间
maxconn                3000
default-server inter 1000 weight 3

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------

listen webcluster
    bind *:80
    mode http                               第二种           前后端在一起
    balance roundrobin 
#    redirect prefix http://www.baidu.com/     网页重定向
    server web1 172.25.254.10:80  check inter 2 fall 3 rise 5 weight 1  disabled  关闭页面
    server web2 172.25.254.20:80  check inter 2 fall 3 rise 5 weight 1
#   server web_sorry 172.25.254.100:8080 backup     只有当前面两台都不能访问才会访问错误页面

                                               
chack 检测    inter 每隔多长检测一次   fall 设置三次连接出错后停止连接  
rise 后端下线重启后连续检测5次      weight 权重1

重新测试:

socat 工具
对服务器动态权重和其它状态可以利用 socat 工具进行调整, Socat Linux 下的一个多功能的网络工
具,名字来由是 Socket CAT ,相当于 netCAT 的增强版 .Socat 的主要特点就是在两个数据流之间建立双向
通道,且支持众多协议和链接方式。如 IP TCP UDP IPv6 Socket 文件等
范例:利用工具 socat 对服务器动态权重调整
修改主配置文件。
[root@haceproc ~]# vim /etc/haproxy/haproxy.cfg    编写主配置文件
#查看集群权重
[root@haceproc ~]# echo get weight webcluster/web1 | socat stdio
/var/lib/haproxy/stats
2 (initial 2)

[root@haceproc ~]# echo get weight webcluster/web2 | socat stdio
/var/lib/haproxy/stats
1 (initial 1)

#设置权重
[root@haceproc ~]# echo "set weight webcluster/web1 1 " | socat stdio
/var/lib/haproxy/stats

[root@haceproc ~]# echo "set weight webcluster/web1 2 " | socat stdio
/var/lib/haproxy/stats

#下线后端服务器
[root@haceproc ~]# echo "disable server webcluster/web1 " | socat stdio
/var/lib/haproxy/stats

#上线后端服务器
[root@haceproc ~]# echo "enable server webcluster/web1 " | socat stdio
/var/lib/haproxy/stats
针对多进程处理方法
如果开启多进程那么我们在对进程的 sock 文件进行操作时其对进程的操作时随机的
如果需要指定操作进程那么需要用多 soct 文件方式来完成
[root@haceproc ~]# vim /etc/haproxy/haproxy.cfg    编写主配置文件
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    #stats socket /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


    # utilize system-wide crypto-policies
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM
    nbproc 2
    cpu-map 1 0
    cpu-map 2 1
查看多进程文件。
.haproxy 的算法
HAProxy 通过固定参数 balance 指明对后端服务器的调度算法
balance 参数可以配置在 listen backend 选项中。
HAProxy 的调度算法分为静态和动态调度算法
有些算法可以根据参数在静态和动态算法中相互转换。
4.1 静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重 ( 只能为 0 1, 不支持其它值 ) ,只能靠重启 HAProxy 生效。
4.1.1 static-rr :基于权重的轮询调度
不支持运行时利用 socat 进行权重的动态调整 ( 只支持 0 1, 不支持其它值 )
不支持端服务器慢启动
其后端主机数量没有限制,相当于 LVS 中的 wrr
4.1.2 first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用 socat 进行动态修改权重 , 可以设置 0 1, 可以设置其它值但无效
4.2.1 roundrobin
1. 基于权重的轮询动态调度算法,
2. 支持权重的运行时调整,不同于 lvs 中的 rr 轮训模式,
3. HAProxy 中的 roundrobin 支持慢启动 ( 新加的服务器会逐渐增加转发数 )
4. 其每个后端 backend 中最多支持 4095 real server
5. 支持对 real server 权重动态调整,
6. roundrobin 为默认调度算法 , 此算法使用广泛
haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
bind 172.25.254.100:80
mode http
balance roundrobin
server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
4.3.1.2 一致性 hash
一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动 hash o
mod n
hash 算法是动态的,支持使用 socat 等工具进行在线权重调整,支持慢启动
4.3.2 uri
基于对用户请求的 URI 的左半部分或整个 uri hash ,再将 hash 结果对总权重进行取模后
根据最终结果将请求转发到后端指定服务器
适用于后端是缓存服务器场景
默认是静态算法,也可以通过 hash-type 指定 map-based consistent ,来定义使用取模法还是一致性
hash
Note
注意:此算法基于应用层,所以只支持 mode http ,不支持 mode tcp
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
左半部分: /<path>;<params>
整个 uri /<path>;<params>?<query>#<frag>
新建页面发布内容。
4.3.3 url_param
url_param 对用户请求的 url 中的 params 部分中的一个参数 key 对应的 value 值作 hash 计算,并由服务器
总权重相除以后派发至某挑出的服务器 , 后端搜索同一个数据会被调度到同一个服务器,多用与电商
通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个 real server
如果无没 key ,将按 roundrobin 算法
url_param 取模法配置示例               #支持多个url_param hash
4.3.6 算法总结
#静态
static-rr--------->tcp/http
first------------->tcp/http
#动态
roundrobin-------->tcp/http
leastconn--------->tcp/http
#以下静态和动态取决于hash_type是否consistent
source------------>tcp/http
Uri--------------->http
url_param--------->http
hdr--------------->http
4.3.7 各算法使用场景
first #使用较少
static-rr #做了session共享的web集群
roundrobin
leastconn #数据库
source
#基于客户端公网IP的会话保持
Uri--------------->http #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯
url_param--------->http #可以实现session保持
hdr #基于客户端请求报文头部做下一步处理
. 高级功能及配置
介绍 HAProxy 高级配置及实用案例
5.1 基于 cookie 的会话保持
cookie value :为当前 server 指定 cookie 值,实现基于 cookie 的会话黏性,相对于基于 source 地址 hash
调度算法对客户端的粒度更精准,但同时也加大了 haproxy 负载,目前此模式使用较少, 已经被 session
共享服务器代替
Note
注意:不支持 tcp mode ,使用 http mode
5.1.1 配置选项
cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [
preserve ][ httponly ] [ secure ][ domain ]* [ maxidle <idle> ][ maxlife ]
name: #cookie 的 key名称,用于实现持久连接
insert: #插入新的cookie,默认不插入cookie
indirect: #如果客户端已经有cookie,则不会再发送cookie信息
nocache: #当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,
#因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器
5.1.2 配置示例
[root@haceproc ~]# vim /etc/haproxy/haproxy.cfg    编写主配置文件
验证:
[root@haproxy ~]# curl -b WEBCOOKIE=web1 172.25.254.100
web1 server - 192.168.0.10
[root@haproxy ~]# curl -b WEBCOOKIE=web2 172.25.254.100
web2 server - 192.168.0.20
5.3 IP 透传
web 服务器中需要记录客户端的真实 IP 地址,用于做访问统计、安全防护、行为分析、区域排行等场景。
5.3.2 四层 IP 透传
[root@haceproc ~]# vim /etc/haproxy/haproxy.cfg    编写主配置文件
listen webserver 80
bind *:80
mode tcp                             基于四层传递
balance roundrobin
server webserver1 172.25.254.10:80 weight 1 check inter 3 fa11 3 rise 5
server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

#正常的nginx配置
[root@rs1 ~]# vim /etc/nginx/nginx.conf
。。。内容省略。。。
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
。。。内容省略。。。
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
。。。内容省略。。。
}
}
#在访问haproxy后查看nginx日志
[root@rs1 ~]# tail -n 3 /var/log/nginx/access.log

5.3.3 七层IP透传

[root@haceproc ~]# vim /etc/haproxy/haproxy.cfg    编写主配置文件

listen webserver_80
option forwardfor
bind 172.25.254.100:80
mode http
balance roundrobin
server webserver1 192.168.0.101:80 send-proxy weight 1 check inter 3s fall 3
rise 5
server webserver1 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

#apache 配置:
LogFormat "%{X-Forwarded-For}i %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%
{User-Agent}i\"" combined
#nginx 日志格式:
$proxy_add_x_forwarded_for: 包括客户端IP和中间经过的所有代理的IP
$http_x_forwarded_For: 只有客户端IP
log_format main '"$proxy_add_x_forwarded_for" - $remote_user [$time_local]
"$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_For';
#查看日志如下:
[root@rs1 ~]# tail -n 3 /var/log/nginx/access.log

5.4 ACL
访问控制列表 ACL Access Control Lists
是一种基于包过滤的访问控制技术
它可以根据设定的条件对经过服务器传输的数据包进行过滤 ( 条件匹配 ) 即对接收到的报文进行匹配和过
滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、 URL 、文件后缀等信息内
容进行匹配并执行进一步操作,比如允许其通过或丢弃。
frontend webcluster
bind *:80
mode http
acl test hdr_dom(host)  -i wwW.timinglee.com
use_backend webcluster-host  if test
default_backend default-host
backend webcluster-host
mode http
server web1 172.25.254.10:80 check inter 2 fall 2 rise 5
backend default-host
mode-http
server web2 172.25.254.20:80 check inter 2 fall 2 rise 5
#做本地解析
vim /etc/hosts
172.25.254.100 www.timing.com

window环境下解析路径:
C:\Windows\System32\drivers\etc

[root@haceproc ~]# vim /etc/haproxy/haproxy.cfg    编写主配置文件

haproxy 的状态界面

[root@haceproc ~]# vim /etc/haproxy/haproxy.cfg    编写主配置文件


5.4.7 ACL 示例 - 基于文件后缀名实现动静分离
制作动态页面
5.5 自定义 HAProxy 错误界面
对指定的报错进行重定向,进行优雅的显示错误页面
错误页面设置:
数据库加密认证。
[root@web1 ~]# dnf install mariadb-server -y
[root@web2 ~]# dnf install mariadb-server -y
 vim /etc/my.cnf.d/mariadb-server.cnf
listen dbserver
bind *:3306
mode tcp
balance static-rr
server db1 172.25.254.10:3306
server db2 172 35.354 20:3306 check inter 3 falt 3 rise s
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs2 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs1 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
5.7 HAProxy https 实现
haproxy 可以实现 https 的证书安全 , 从用户到 haproxy https, haproxy 到后端服务器用 http 通信
但基于性能考虑 , 生产中证书都是在后端服务器比如 nginx 上实现
5.7.1 证书制作
haproxy ~]# mkdir /etc/haproxy/certs/
haproxy ~]# openssl req -newkey rsa:2048 \
-nodes -sha256 –keyout /etc/haproxy/certs/timinglee.org.key \
-x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值