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 indirectnocache 和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 <aclname> <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  启动

 

posted @ 2020-08-01 21:28  浅唱I  阅读(660)  评论(0编辑  收藏  举报