linux之haproxy负载均衡 介绍 和优点和nginx动静分离
一、haproxy介绍
haproxy是属于基于七层代理的负载均衡代理方案,同样支持对四层模拟TCP的负载,功能强大。其中七层应用层是基于Http协议进行代理调度;四层是基于tcp四层协议层进行调度,支持加密(TLS的https和Mysql调度)
1.提供高可用性、负载均衡以及基于TCP和HTTP应用代理、免费、开源、可靠解决方案。适用于负载大web站点
2.实现了基于事件驱动、单一进程模型,此模型支持数千级别的并发连接
3.haproxy不能实现ha高可用,但是可以基于健康检查,来进行监控后端节点的状态。
4.haproxy只是httpd协议的反向代理,不提供缓存加速功能。但是反向代理功能强大,额外支持四层负载
二: HAProxy 相对其他负载均衡器主要优点:
1.HAProxy 是支持虚拟主机,通过 frontend (前端)指令来实现 有多少前端,就有多少虚拟网站
2.能够补充 Nginx 的一些缺点,比如 Session 的保持,Cookie(请求引导到同一台服务器)引导等工作
3.支持 url 检测,后端的服务器出问题的检测会有很好的帮助
4.跟 LVS 一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲 HAProxy 更会比Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx。
5.HAProxy 可以对 Mysql 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,不过在后端的 MySQL slaves 从数量超过 10 台时性能不如 LVS,所以更推荐 LVS+Keepalived。
6.能对请求的 url 和 header 中的信息 网址做匹配,有比 lvs 有更好的 7 层实现
注意:haproxy基于七层(应用层)负载,实现反向代理,必须监听在与之对应的应用程序端口上。和Nginx代理一样,基于多前端、交叉的方式、调度后端的调度方式
1.)haproxy安装方式:
1.源代码编译安装7.4版本 rpm -ql haproxy
2.yum方式的二进制程序包7.6
yum -y install haproxy
/etc/haproxy haproxy的相关配置路径
/etc/haproxy/haproxy.cfg 主配置文件
/usr/sbin/haproxy 指主程序
haproxy主配置文件以及原理相关剖析
global:全局配置段
frontend:前端配置段
backend:后端服务配置段
listen:前后端不分离,直接使用。
default:默认配置段
2.)案例:前端增加 增加一个负载均衡haproxy为七层代理的
cd /etc/haproxy/
vim haproxy.cfg 添加一个负载均衡
frontend main *:80负载均衡器的名称main 侦听端口为80
#acl url_static path_beg -i /static /images /javascript /stylesheets
#acl url_static path_end -i .jpg .gif .png .css .js
#use_backend static 使用static后端 if url_static
default_backend 后端默认使用的集群服务器 webapps
backend webapps
balance roundrobin轮询 算法
server app1 192.168.20.100:80 check server指定包含的机器
server app2 192.168.20.200:80 checkcheck
server app3 192.168.20.120:80 backupbackup备份
其余不用暂且注解掉
启动:
systemctl start haproxy
查看服务端日志
tail /var/log/messages
另外两台httpd 网页服务 20.100 20.200
编写测试网页 100 200
cd /var/www/html/
vim index.html
在client/浏览器访问测试(将20.100与20.200都停止httpd服务,20.120将启用)
那两台启动httpd服务
停止httpd服务
3.)haproxy主配置文件剖析
4.负载均衡代理配置(backend):代理的请求发送到后端服务器 调度算法 bind监听端口
1)balance:调度算法(分为动态和静态算法,定义在listen或backend配置段)
1.)roundrobin 动态轮询(可加权重,属于动态调整的方式,后端服务器不能超过4128台)
2.)static-rr: 静态轮询(可加权重,属于静态算法,后台服务器无上限)
3.)leastconn: 最少连接数(新的连接请求派发至最少连接数目的后端服务器。属于动态算法,仅仅适用于长连接会话)
4.)source:源地址散列 hash(默认为静态算法,若接入hash-type,则可以根据选项进行定义)
hash-type: ①map-based:取模法--->静态
②consistent:一致性hash--->动态
5.)uri:uri左半部分 通过uir可以把访问相同资源请求发送给同一台服务器 对URI的左半部分做hash运算,基于URI进行绑定调度,会对让访问同一个uri的请求访问到同一台服务器,也支持hash-type
6..)url_param:根据url中指定的参数值进行调度,把值做hash计算,也支持hash-type
7.)hdr(<name>): 根据请求报文中的header进行调度,包括(user_agent浏览器,referer,hostname网站名),也支持hash-type。
例如:
2.)bind:绑定监听的地址(可以绑定多个监听端口,只能用于frontend和listen)例如:
可指定 所有的ip 默认为80端口 所有的ip 默
netstat -antulp | grep haprox
systemctl restart haproxy.service
frontend main
bind 192.168.10.10:80指定ip 和端口
default_backend webapps
……
backend webapps
balance roundrobin
server app1 192.168.20.100:80 check
server app2 192.168.20.200:80 check
server app3 192.168.20.120:80 backup
如果有错 跟踪日志即可
tail -f /var/log/messages
3.)mode:方法方式 指定实例的运行模式或协议。
当实现内容交换时,前端和后端必须工作于同一种模式(默认为http模式)否则无法启动。
格式:
mode {http|tcp|health}
这个 默认就是 http
4.)log:启用日志 流量日志,可以用于所有区段,最多定义两个,如果在全局global配置段中定义了两个,多余的log参数被忽略。
格式:log global
log <address> <facility> [<level> [<minlevel>]]
如:
vim /etc/haproxy/haproxy.cfg
log 127.0.0.1 local2
我要记录日志 127.0.0.1 放本机的位置 日志级别2
如果需要指定log 查看主配置文件的说明 1) 2)
vim /etc/rsyslog.conf修改日志文件的配置
#Provides UDP syslog reception解开udp协议下面这两行
$ModLoad imudp
$UDPServerRun 514
local2.* /var/log/haproxy.log
日志类型2 的所以级别都放到 文件位置 如果类型2被占用 那么0-6中选一个没有被占的
记得 两个配置文件 日志类型要一样 都是2
systemctl restart haproxy
systemctl restart rsyslog
查看日志是否有错
tail -f /var/log/messages
5.)maxconn:前端最大并发连接数 也可以后端,表示server承受最大连接数(尽量调高此参数值,但不能超过global)
在全局配置指定即可
vim /etc/haproxy/haproxy.cfg
6)default_backend:为frontend指明使用的默认后端
前端后端通过这个 就行连接
在这 指定webapps的后端 那么就会把这个转发给 这个来处理
7)use_backend:条件式后端调用定义几个后端
use_backend dynamic 定义几个后端 直接定义use_backend +名字
default_backend dynamic if url_dyn 满足if url_dyn 则使用 dynamic 这个后端
8)server:为后端声明一个server,因此不能用于default和frontend配置段。
格式: server <name> <address>[:port] [param*]
名字 IP地址(必须要) 加端口 加其他参数
<name>:为此服务器指定内部名称,只是出现在日志或警告信息中,没有太大实际用途。
常用的param选项:
一 backup:设定当前server为备份服务器
二 check:对此server做健康状态监测(间隔时间默认为2秒)
子选项:inter<delay>:设定间隔时间,单位为ms(毫秒)
fall:从up到down状态的确认检查次数 宕机
rise:从down到up状态的确认检查次数 起来
如:
server app1 192.168.10.200:80 cookie cookie1 check inter 1000 间隔是一千毫秒
对app 服务器就行检测 间隔1000毫秒 名字叫cookie1
三 cookie:为指定server设定cookie值,此处指定的值在进行入站时被检查,目的实现会话绑定、持久连接的功能。
格式:
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]
insert命令,表示在将响应报文交给客户端之前,先插入一个属性名为"name"的cookie
rewrite模式时,haproxy将重写cookie的值为后端服务器的标识符。
prefix的时候,cookie指令设置的cookie名必须和后端设置的cookie一样
要点:①每个server有自己唯一的cookie标识
②在backend中定义为用户请求调度完成后操纵其cookie
vim /etc/haproxy/haproxy.cfg
frontend main 定义前端的名字叫 main
bind 192.168.10.10:80IP地址 10.10 80端口
default_backend webapps 默认使用后端
……
backend webapps
balance roundrobin轮询算法
cookie serverid insert nocache indirect在nocache 和indirect这两种情况下下插入
使用cookie 名字是serverid insert插入的方法 在回应响应报文里面插入这给cookie
server app1 192.168.20.100:80 check weight 1 cookie webser1
server app2 192.168.20.200:80 check weight 1 cookie webser2
定义的是 server cookie的唯一标识 webser2
server app3 192.168.20.120:80 backup
浏览器访问10.10
每次都是 100
四 maxconn:此server接受的并发连接的最大数量
五 maxqueue:请求队列的最大长度
六 observer:根据流量判断后端server的健康状态
七 weight:权重,默认为1,最大值256, 0表示不参与负载均衡
vim /etc/haproxy/haproxy.cfg
frontend main
bind 192.168.10.10:80
default_backend webapps
……
backend webapps
balance roundrobin
cookie serverid insert nocache indirect
server app1 192.168.20.100:80 check weight 1 cookie webser1
server app2 192.168.20.200:80 check weight 3 cookie webser2
systemctl restart haproxy重启服务
curl 192.168.10.10 会发现weight 3的网页多出现两次
权重
八 redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求 以302状态码响应,需要注意prefix后不能使用/和相对地址,以免造成语法错误和循环。
例如:
server srv1 192.168.10.200 redir http://web1.ujiuye123.com check
srv1 名字 server的ip 如果服务10.200的请求 以GET和HEAD的方法 回应302状态码
把请求重定向到web1.ujiuye.com
9.)案例:状态监控 启用haproxy的状态监控页
使用stats enable启用,基于程序编译时默认设置的统计报告,不能用于frontend配置段,
如:
stats uri /haproxy?stats 路径
status页面默认出现的位置 http://xxx.xxx.xxx.xxx:port/haproxy?stats
#stats realm “HAPorxy status” status页面的提示信息
stats auth no authentication
stats scope no restriction 作用域(关闭即可全局生效) 注解
为了确保其安全性,尽量修改其监听的端口号,隐藏其版本号,修改其默认uri,最好进行管理员的账号密码登录访问控制。定义状态监控页属性,最好定义在listen配置段,比较简洁、安全。
补充选项:
stats uri /haproxyadmin?stats 定义新的status页面uri
stats realm "haproxy\ deng" 定义新的登录账号密码的提示页面
stats auth admin:123456 定义登录 账号和密码(普通管理员)
stats admin if TRUE 认证成功才开启管理员功能(前提需要进行全局生效,则要注释关闭stats scope选项)
监控例子:
vim /etc/haproxy/haproxy.cfg --编写主配置文件 增加下面这段话 增加监控
systemctl restart haproxy --重启服务生效
listen status名字
bind *:1080所有ip的 1080端口
stats enable开启监控
stats hide-version关闭版本信息
stats uri /haproxyadmin?Stats设置路径
stats realm Haproxy\ Statistics提示信息
stats auth admin:123456用户名密码
stats admin if TRUE全局生效
访问:http://192.168.10.10:1080/haproxyadmin?stats
全局配置:
28 chroot /var/lib/haproxy运行过程中产生的文件存放位置 默认即可
29 pidfile /var/run/haproxy.pidpid 进程号放置的文件
30 maxconn 4000前端最大承受量
31 user haproxy运行的系统账号
32 group haproxy组
33 daemon以守护进程的运行,不加即运行至前台
其他常用全局配置:
1)nbproc <number>指定启动的haproxy守护进程的个数,不加此选项默认一个
2)ulimit -n设定每个进程能打开的最大文件句柄数(相当于ulimit -n)
3)spread-check <0..50>:线程的检测 在haproxy后端有很多服务器场景,在精确的时间间隔后统一对众多服务器进行状态检查(统一),会集中消耗大量带宽,这个选项可以在检查的时间间隔长度上增加或减少一定的随机时长。
5.)haproxy访问控制(基于TCP和HTTP,一般结合acl机制)
Acl 什么样的IP可以访问说明样的资源
http-request (http-request allow 或者 httpd-request deny)
tcp-request (tcp-request allow 或者 tcp-request deny)
例如:
acl nagios src 192.168.10.200 --定义访问控制列表 +名字naigios+来源地址是src10.200
acl local_net src 192.168.10.0/24--网段控制 +访问的来源网段地址
acl auth_ok http_auth--认证的 内部变量
http-request allow if nagios--如果是nagios代表客户机访问 来源IP10.200 允许
http-request allow if local_net auth_ok--通过auth ok 代表http的认证
http-request allow realm Gimme if local_net auth_ok 如果通过local net认证 则返回信息 允许
http-request deny 其余没有通过则不允许 realm Gimme返回信息
1.)Haproxy ACL控制机制格式 类型
格式:
acl <acl的name> <criterion标准> [flag标签] [operator操作符] <value真正值> ...
aclname:acl名称,区分大小写,只能包括大小写字母、数字,连接线、下划线、点号、冒号
criterion:测试标准,表示检查那些数据或内容,
数据类型常用:
src:ip 来源IP
src_port:integer 源端口
dst:ip 目标IP
dst_port:integer 目标端口
flag:acl标志位,代表控制条件,例如是否区分字符大小写等,可选参数如下:
-i 忽略字符大小写
-m 启用特定的匹配方式,一般不用
-n 禁止DNS反向解析
-u 不允许aclname重复,默认是可重名的,当两个acl的名称相同时,运算为 或 机制
operator:操作符 比较数值 判断匹配条件 与<criterion标准>相比较的操作
匹配整数值:eq等于 ge大于等于 gt大于 le小于等于 lt小于
value:测试的数据值,访问控制的具体内容或值
boolean:布尔值
integer or integer range:整数或整数范围
IP address/network:网络地址
string(exact, substring, suffix, prefix, subdir, domain):字符串
regular expression:正则表达式
2.常用的criterion测试标准:前端 后端
1. be_sess_rate:用于测试指定的backend后端 会话创建的速率(即每秒创建的会话数)连接创建的
Be 代表backend sess rate速率
例如:
backend dynamic 客户端名称dynamic
mode http使用的模式为http
acl being_scanned be_sess_rate gt 100 访问控制列表 名称 使用测试标准 gt操作符大于
redirect location /error_page/denied.html if being_scanned 如果acl成立 则重定向到error
2. fe_sess_rate:用于测试指定的frontend前端 会话创建的速率(即每秒创建的会话数)
例如
frontend mail
bind *:25
mode tcp
maxconn 5000
acl too_fast fe_sess_rate gt 100 定义acl toofast 前端的会话创建 速率大于100
tcp-request inspect-delay 500ms 延迟500毫秒
tcp-request content accept if ! too_fasttcp请求 ! 取非 即速率小于100 内容 接受
tcp-request content accept if WAIT_END
3. hdr: 根据请求报文中的header进行 匹配调度,包括(user_agent,referer,hostname)
4. method:根据请求的方法进行匹配
5. path_beg根据请求URL路径的开头来匹配 静态acl
acl url_static path_beg -i /static /images /javascript /stylesheets
定义acl 名称 urlstatic 忽略大小写 路径开头 为以上面// //什么什么开头
在nginx location中 一定要有相应的配置 如 location /static
6. path_end根据URL路径请求的结尾 来匹配
例如:
acl url_static path_end -i .jpg .gif .png .css .js
定义acl 名称 urlstatic 忽略大小写 路径结尾 以 .jpg .gif .png .css .js结尾
6.案例:结合ACL进行动态分离
1.网页动静分离 三台机器需安装nginx apache
vim /etc/haproxy/haproxy.cfg
frontend main定义前端
bind 192.168.10.10:80绑定10.10IP上的80端口 提供网站服务
acl url_static path_beg -i /img /static /images /javascript /stylesheets
定义Acl 名字叫url static url的 路径以/img/ 等开头 忽略大小写
acl url_static path_end -i .jpg .gif .png .css .js 以jpg结尾 静态
acl url_dynamic path_end -i .php以.php结尾 动态
定义访问控制列表
use_backend static if url_static 如果urlstatic成立 用_backend static 后端
use_backend webapps if url_dynamic 如果url_dynamic成立 用webapps 后端
default_backend webapps
backend static静态
balance roundrobin调度算法轮询
cookie serverid insert nocache indirect
server static 192.168.20.110:80 check weight 1 cookie webser-static
健康检查
backend webapps动态
balance roundrobin轮询
cookie serverid insert nocache indirect
server app1 192.168.20.100:80 check weight 1 cookie webser1
server app2 192.168.20.200:80 check weight 1 cookie webser2
server app3 192.168.20.120:80 backup
2.)设置记录全部日志 除了自己
frontend main
bind 192.168.10.10:80
option forwardfor except 127.0.0.1/8
acl url_static path_beg -i /img /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
acl url_dynamic path_end -i .php
use_backend static if url_static
use_backend webapps if url_dynamic
default_backend webapps
backend static
balance roundrobin
cookie serverid insert nocache indirect
server static 192.168.20.110:80 check weight 1 cookie webser-static
backend webapps
balance roundrobin
cookie serverid insert nocache indirect
server app1 192.168.20.100:80 check weight 1 cookie webser1
server app2 192.168.20.200:80 check weight 1 cookie webser2
server app3 192.168.20.120:80 backup
3.)nginx不用修改日志格式,apache修改日志格式:
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
日志中,nginx日志条目出现一个浏览器所在的服务器ip,apahce是开头部分
Apache 修改可查看客户端访问真实的ip 记录
vim /etc/httpd/conf/httpd.conf
修改apache日志格式,加入红色变量,并使用相应日志格式纪录日志:
LogFormat "%{X-Forwarder-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
修改为
7.Nginx安装 动静分离
1.安装基于perl的正则表达式,支持URL重写
yum -y install pcre-devel zlib-devel 安装三个软件包
yum -y install openssl-devel如需支持https,支持ssl
2:建立nginx用户
useradd -r nginx 建立用户
3.解压安装包配置 预配置(根据实际情况添加或修改功能)
tar xvf nginx-1.16.0.tar.gz --解压安装包(来源桌面)
cd nginx-1.16.0/ --到目录解压
./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio && make && make install
注释:
--prefix=/usr/local/nginx默认安装的路径
--conf-path=/etc/nginx/nginx.conf 配置文件所在目录,
--user=nginx 属主 --group=nginx属组
--error-log-path=/var/log/nginx/error.log 错误日志位置
--http-log-path=/var/log/nginx/access.log 访问日志
--pid-path=/var/run/nginx.pid pid进程
--lock-path=/var/lock/nginx.lock 进程锁
--user=nginx 运行时的用户
--group=nginx属组
--with-http_ssl_module支持ssl模块
--with-http_v2_module支持v2模块
--with-http_dav_module
--with-http_stub_status_module支持状态统计模块
--with-threads
--with-file-aio支持多线程
4.启动服务路径写到path环境中 nginx直接启动服务 配置生效的方式 可tab出来
启动方法: /usr/local/nginx/sbin/nginx 或者在/sbin下执行 ./nginx
echo '/usr/local/nginx/sbin/' >> /etc/profile 把路径写到PATH环境中 nginx直接启动服务
vim /etc/profile
export PATH=$PATH:/usr/local/nginx/sbin
让/etc/profile文件修改后立即生效 ,可以使用如下命令:
# source /etc/profile
nginx --启动
nginx -s reload --重新加载配置文件
5.改动配置生效的方式
nginx -s reload--重新加载,原来配置不变
stop--停止 然后 nginx 直接启动即可
quit
reopen
6.配置两个虚拟主机 80和8080端口 增加解析网站 /etc/hosts
1.两个server网站:配置指令:
server {
}: --定义虚拟主机
80端口
server {
listen 80;
server_name web.ujiuye.com web; --定义网站 别名
access_log logs/host.access.log main; 重启时该文件不存在,手动建立并修改属主与属组
location / {
root html;--指定网站根目录 默认为/usr/local/nginx/html下的网页
index index.html index.htm;--网页
charset utf-8; --指定字符集
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
vim /etc/hosts 增加解析
7.指定路径建立测试网页img 创建目录images 检测语法 排错 查看日志
location / {
root html; 此处的html的绝对路径为 安装根路径下的html,即/usr/local/nginx/html
index index.html index.htm;
}
location /img {
root images; 实际对应的目录是:/usr/local/nginx/images/img,注意目录叠加关系
index index.html index.htm; --请求的是 http://www.ujiuye.com/images
}
cd /usr/local/nginx/ --到创建
mkdir images
echo images-text > index.html
/usr/local/nginx/sbin/nginx -t 检测语法错误
/usr/local/nginx/sbin/nginx -s stop 停止
/usr/local/nginx/sbin/nginx 启动