haproxy 是一个http协议的反向代理服务器 也是tcp层的负载均衡服务器
haproxy 负载均衡
# yum install haproxy
# rpm -ql haproxy
/etc/haproxy/haproxy.cfg \\ 主配置文件
/usr/sbin/haproxy \\ 主程序
# vim /etc/haproxy/haproxy.cfg
frontend main *:80
default_backend www.syk.my \\ 负载均衡的名字
backend www.syk.my
balance roundrobin \\ 轮询
server web1 192.168.10:80 check \\ 后端服务器 check做健康状态检查
server web2 192.168.12:80 check
# systemctl restart haproxy.service
# ss -tnlp \\ 80端口被haproxy监听
# systemctl status haproxy.service \\ 查询状态
# vim /etc/rsyslog.conf \\ 系统里开启haproxy.log 功能
$ModLoad imudp \\ 取消此两项注释
$UDPServerRun 514
local2.* /var/log/haproxy.log \\ 最后添加
# systemctl restart rsyslog.service
# ss -unl \\ udp的514端口被监听
# tail /var/log/haproxy.log \\ 查看日志
实例 1
基于浏览器cookie实现会话绑定 \\ 关键配置如下
backend www.teo.com
balance roundrobin
cookie teo insert nocache indirect \\ 定义cookie名字teo insert在后端插入的方式 nocache不允许缓存 indirect间接的方式
server teo1 192.168.10.10:80 check cookie teo1 \\ 每一个server有自己唯一的cookie标识
server teo2 192.168.10.12:80 check cookie teo2
haproxy配置文件详解
global \\ 全局配置
log 127.0.0.1 local2 \\ 定义全局的syslog服务器,最多可定义两个
chroot /var/lib/haproxy \\ 切换至此目录 以安全方式运行
pidfile /var/run/haproxy.pid \\ pid文件
maxconn 4000 \\ 前端最大连接数
user haproxy \\ 以哪个用户运行
group haproxy \\ 以哪个组运行
daemon \\ 启动为守护进程 不加此项将运行在前台
# turn on stats unix socket \\ 打开状态页面的套接字 本地访问状态页面不用使用tcp/ip协议进行分发
stats socket /var/lib/haproxy/stats \\ 打开上面选择 此选项生效
defaults
mode http \\ 默认tcp 一种http反向代理 一种tcp负载均衡 后端要是https mysql ssl ssh等要使用tcp 与后端对应
log global \\ 可以指明两个位置 多余则不生效
option httplog \\ 当mode为http时 记录详细的日志格式
#option logasap \\ 提前记录日志 默认不启用 会少记录很多东西
option dontlognull
option http-server-close \\ 下面if-none仅在此首部不存在时才将其添加至请求报文中 防止多层代理获取不到真实ip地址
option forwardfor except 127.0.0.0/8 if-none \\ 真正的请求来源ip地址 除了此ip本机
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000 \\ 前端最大并发连接数 不能超过global数
frontend main *:80 \\ 定义前端 监听端口 *:80 此段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
bind *:80 \\ 把上面*:80去掉 可以换成此句 绑定多个端口 bind 只能用于frontend listen
bind *:8080 \\ 绑定两个端口 也可以是一个端口范围
#use_backend static if url_static \\ 条件试后端调用 static名字 usr_static是acl列表
reqadd Via:\ 192.168.10.15.cn \\ 添加自定义响应报文首部 将请求报文发往服务器时添加
rspadd Via:\ 192.168.10.15.com \\ 添加自定义响应报文首部 将请求报文发往客户端时添加
default_backend webservice \\ 为frontend定义默认后端
use_backend tstatice
listen stats \\ stats名字 段通过关联“frontend”和“backend”定义了一个完整的代理,通常只对TCP流量有用。
bind *:81 \\ 监听81端口
stats enable \\ 数据统计页面开启
stats hide-version \\ 隐藏版本号
stats uri /haproxyadmin?stats \\ 定义访问页面 默认为 teo.com/haproxy?stats
stats realm "HAPorxy\ Statistics" \\ 提示信息 \为转移符 空格需要转换
stats auth admin:123456 \\ 认证 前面用户名 后面密码 可以有多组
stats admin if TRUE \\ 如果认证成功 开启管理员功能 一般不开启
backend webservice \\ 后端服务器 代理将会将对应客户端的请求转发至这些服务器。
balance roundrobin \\ 指明调度算法 详见注1
hash-type map-based \\ 为balance进一步指明算法 详见注1
server web1 192.168.10.12:80 check weight=3
server web2 192.168.10.10:80 check port 443
server teo1 127.0.0.1:8010 check inter 1000 rise 1 fall 4 cooki teo1 backup maxconn 5000
server teo2 172.16.100.10:80 redir http://www.baidu.com check
backup 设置为备用服务器 或叫 sorry server
check 做健康状态检测 默认为2秒 默认为tcp检测 还有httpchk
inter 1000 设定健康状态检查时间间隔 单位毫秒 默认2秒
fall 4 确认服务器从正常状态转换为不可用状态需要检查的次数 默认3次
rise 1 设定健康状态检查中 离线的服务器从离线状态转换至正常状态需要成功检查的次数
port 443 请求的是80端口 也可以检测的是443端口 后面还可以跟地址 检测另外一个地址
cooki teo1 为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后
续的请求中被选中,其目的在于实现持久连接的功能;
maxconn 5000 此服务器接受的并发连接的最大数量
maxqueue 请求队列的最大长度
observe 根据流量判断后端server的健康状态 默认为禁用 其支持的类型有"layer4"和"layer7""layer7"仅能用于http代理场景
weight 权重 默认为1 最大值为256 0表示不参与负载均衡(不被调度/下线了)
redir 启用302重定向功能 需要注意的是 在baidu.com后面不能使用/ 且不能使用相对地址 以免造成循环
注:
1 balance 定义负载均衡算法,可用于“defaults” “listen”和“backend”.用于在负载均衡场景中挑选一个server,其仅应用于持久
信息不可用的条件下或需要将一个连接重新派发至另一个服务器时.支持的算法有:
a roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡 最公平的算法.此算法是动态的,
这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;并支持慢启动.
b static-rr :基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服
务器连接数上没有限制;不支持慢启动,在高负荷的情况下,服务器重新上线时会立即被分配大量连接.
c leastconn(WLC):适用于长连接的会话,新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中
推荐使用此算法,如LDAP SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;
d source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求
始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求
可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态.
hash-type map-based: 取模法 静态
hash-type consistent: 一致性哈希法 动态
e uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以
使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理
以提高缓存的命中率,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;
hash-type map-based: 取模法 静态
hash-type consistent: 一致性哈希法 动态
f url_param:通过为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了
一个值那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标
识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定
的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认静态的,不过其也可以使用hash-type修改此特性
hash-type map-based: 取模法 静态
hash-type consistent: 一致性哈希法 动态
g hdr():对于每个HTTP请求,通过指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫
算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部
分(比如通过www.feiyu.com来说,仅计算feiyu字符串的hash值)以降低hash算法的运算量;此算法默认为静态的.
hash-type map-based: 取模法 静态
hash-type consistent: 一致性哈希法 动态
f rdp-cookie(name):表示根据据cookie(name)来锁定并哈希每一次TCP请求.
2 正向代理与反向代理区别
正向代理 forward proxy: 是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理
服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端.
反向代理 reverse proxy: 是指以代理服务器来接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器
上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就变现为一个反向代理服务器.
1 正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源.
反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等.
2 正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件.
反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器.
3 正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端.
反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器.
4 正向代理和反向代理的作用和目的不同.正向代理主要是用来解决访问限制问题.
反向代理则是提供负载均衡、安全防护等作用.二者均能提高访问速度.