Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92598
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 350
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-04 22:47
文章分类

全部博文(34)

文章存档

2017年(34)

我的朋友

分类: 服务器与存储

2017-04-01 10:14:08

原理图:


配置由两部分组成:
              global settings:对haproxy进程自身属性的设定:
              proxys:对代理的设定
                      defaults
                      forntend
                      backend
                      listen
             
定义一个完整的代理的方式:
               frontend,backend
               listen

               混合使用两方式

URL
             
             
             
会话保持机制:
              IP层:source
                     位于同一个NAT服务器背后的多个请求都会定向至同一个upstream server:不利于均衡:
              应用层:cookie
                     有更好的负载均衡效果:

              source:一般只有不支持使用cookie插入又需要保持会话时使用:

              uri:用于后端服务器是cache server的场景,保证缓存命中率的

              hdr(host)

                      host:
                      host:

                               use_domain_only: 在计算hash值时,仅使用域名,如上面的shamereedwine.com

              /a/b/c/d index.php;user=tom?a1=hello&a2=

调度算法:
             roundrobin
             static-rr
             leastconn
             source
             uri
             url-param
             hdr()
             rdp-cookie

指定haproxy工作模式:使用mode参数:
           http
                  http协议
                  对应用层数据做深入分析,因此支持7层的过滤、处理、转换等机制:
           tcp
                  默认模式:
                  haproxy在客户端和选定的服务器之间建立一个全双工的链接:
                  不会对应用层协议做任何检查:
                  SSL、MySQL、SSL等都应该使用此模式:

指定日志:
                   log global:使用全局配置中定义的日志服务器:
                   log   [ []]

                   capture request header len
                   capture response header len

                  在listen或frontend中指定使用的默认后端:
                           default_backend

                  在listen或frontend中指定使用的条件表达式后端:
                           use_backend if
                           use_backend unless

                  为backend或listen定义各服务器:
                           server [:port] [param*]

                           有众多参数:
                                   其中包括check,实现对健康状态检测;

                  option httpchk:用于指定http协议的server的检测方法
                        option httpchk
                        option httpchk
                        option httpchk
                        option httpchk

                  统计页面输出:
                        stats  enable
                        stats  uri
                        stats  realm
                        stats  auth
                        stats  admin
                       
                        使用单独输出
                        listen  statspage
                             bind  *:8009
                             stats    enable
                             stats    auth admin:password
                             stats    admin  if TRUE
                             stats     uri     /admin?stats
                         
                自定义错误页面:
                      errorfile
                       errorloc
                       errorloc302
                       errorloc303
              
                 超时时长:
                       timeout http request
                       timeout queue

                 实现访问控制:
                       http-request:7层过滤
                       tcp-request content: tcp层过滤

                 acl  hdr_reg(Host) -i .*\.shamereedwine.com

                 scheme://user"password:port/path;params?query#fragment

                acl index path -i /index.html
                
                 acl admin_page path_beg /admin

                 acl dynamic_content path_end .php
                                                  
实验环境:

haproxy: eth0:192.168.0.114
              eth1:虚拟专用网VMnet2  IP:192.168.20.1

node2:虚拟专用网VMnet2         IP:192.168.20.11
node3:虚拟专用网VMnet2         IP:192.168.20.12

注意:三台主机需先装上apache服务器

1、三节点时间同步
haproxy:
[root@localhost ~]# ntpdate 133.100.11.8
 1 Apr 07:39:55 ntpdate[3407]: step time server 133.100.11.8 offset -28806.062998 sec

node2:
[root@localhost ~]# ntpdate 133.100.11.8
 1 Apr 07:40:36 ntpdate[3395]: step time server 133.100.11.8 offset -28806.169842 sec

node3:
[root@localhost ~]# ntpdate 133.100.11.8
 1 Apr 07:41:10 ntpdate[3156]: step time server 133.100.11.8 offset -28806.095532 sec

2、安装所需的包
haproxy:
yum install haproxy

node2:
yum install php php-mysql

node3:
yum install php php-mysql

3、node1和node2连接上虚拟专用网并配置网关,索引界面等
node2:
ifconfig eth0 192.168.20.11/24 up
route add default gw 192.168.20.1

node3:
ifconfig eth0 192.168.20.12/24 up
route add default gw 192.168.20.1

node2:
vim /var/www/html/index.html

node2.shamereedwine.com



node3:
vim /var/www/html/index.html

node3.shamereedwine.com



4、node2和node3节点启动http服务

node2:
service httpd start

node3:
service httpd start

5、修改haproxy的主配置文件

vim /etc/haproxy/haproxy.cfg

加入下面的几行

frontend websrv *:80
    default_backend     webservers

backend webservers
    balance     roundrobin
    server node1 192.168.20.11:80 check
    server node2 192.168.20.12:80 check

6、启动haproxy服务,查看haproxy监听的端口

[root@localhost ~]# service haproxy start
正在启动 haproxy:                                         [确定]

[root@localhost ~]# ss -tnlp|grep haproxy
LISTEN     0      128                       *:80                       *:*      users:(("haproxy",1810,5))

7、访问下服务器地址
如下图所示:刷新页面在node2.shamereedwine.com和node3.shamereedwine.com之间跳跃





8、配置haproxy的日志功能
vim /etc/resyslog.conf
加入下面的几个参数,启用udp和tcp模块,加入haproxy.log的路径
$ModLoad imudp
$UDPServerRun 514

$ModLoad imtcp
$InputTCPServerRun 514

local2.*                                                /var/log/haproxy.log

重启日志服务

[root@localhost ~]# service rsyslog restart
关闭系统日志记录器:                                       [确定]
启动系统日志记录器:                                       [确定]

9、重新载入haproxy
[root@localhost ~]# service haproxy reload
重新载入 haproxy:

10、查看日志的输出

[root@localhost ~]# tail -f /var/log/haproxy.log
Apr  1 10:10:06 localhost haproxy[2038]: 192.168.0.105:62651 [01/Apr/2017:10:10:05.660] websrv webservers/node1 1034/0/3/3/1040 200 300 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Apr  1 10:10:07 localhost haproxy[2038]: 192.168.0.105:62651 [01/Apr/2017:10:10:06.700] websrv webservers/node2 351/0/0/2/353 200 301 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Apr  1 10:10:08 localhost haproxy[2038]: 192.168.0.105:62651 [01/Apr/2017:10:10:07.053] websrv webservers/node1 1132/0/1/4/1137 200 300 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Apr  1 10:10:08 localhost haproxy[2038]: 192.168.0.105:62651 [01/Apr/2017:10:10:08.190] websrv webservers/node2 799/0/1/2/802 200 301 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Apr  1 10:10:09 localhost haproxy[2038]: 192.168.0.105:62651 [01/Apr/2017:10:10:08.992] websrv webservers/node1 963/0/0/1/964 200 300 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Apr  1 10:10:10 localhost haproxy[2038]: 192.168.0.105:62651 [01/Apr/2017:10:10:09.956] websrv webservers/node2 787/0/1/1/789 200 301 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Apr  1 10:10:11 localhost haproxy[2038]: 192.168.0.105:62651 [01/Apr/2017:10:10:10.745] websrv webservers/node1 949/0/9/2/960 200 300 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

11、使用bind参数,定义frontend 监听在80端口上

vim /etc/haproxy/haproxy_cfg

frontend websrv
    bind *:80
    default_backend     webservers

重新载入haproxy
[root@localhost ~]# service haproxy reload
重新载入 haproxy:

查看监听的端口,
[root@localhost ~]# ss -tnlp|grep :80
LISTEN     0      128                       *:80                       *:*      users:(("haproxy",1705,5))

查看测试页



12、基于源地址哈希的算法,来响应http请求

vim /etc/haproxy/haproxy.cfg



把balance调度算法改为source

[root@localhost ~]# service haproxy reload
重新载入 haproxy:

查看测试页面:可以看到来自于同一IP的请求,始终定向至同一台服务器上


13、uri的机制,对同一个uri的请求,始终定义至同一个server上

node2:
定义几个测试页面


node3:
定义几个测试页面


haproxy:
修改调度方法为uri


重新载入haproxy服务
[root@localhost ~]# service haproxy reload
重新载入 haproxy:

访问测试页:

访问测试页test1.html指向至node3节点

换成IE的浏览器,访问test1.html,指向至node3节点

访问test2.html,指向至node2节点

换成IE浏览器访问test2.html,也指向至node节点


14、设置session会话绑定

vim /etc/haproxy/haproxy.cfg

重新载入haproxy
[root@localhost ~]# service haproxy reload
重新载入 haproxy:

可以看到cookie的方式


15、配置服务状态查看

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
添加红色的代码到配置文件中

backend webservers
    cookie node insert nocache
    balance      roundrobin
    stats        enable
    server node1 192.168.20.11:80 check cookie node1
    server node2 192.168.20.12:80 check cookie node2

重新载入haproxy

[root@localhost ~]# service haproxy reload
重新载入 haproxy:

访问状态的链接:出现如下图所示的页面:


16、使用非默认的80端口访问,使用别的端口访问
在haproxy.cfg配置文件中加入下面的几行

listen statistics
    bind   *:8009
    stats  enable
    stats  uri /hpadmin?stats
    stats  auth admin:admin

重新载入haproxy

[root@localhost ~]# service haproxy reload
重新载入 haproxy:

显示如下图所示的界面:


17、启用haproxy管理接口
编辑配置文件haproxy.cfg
加入下面所示的参数
stats  admin if TRUE

重启haproxy 服务
[root@localhost ~]# !se
service haproxy reload
重新载入 haproxy:

查看下面界面,发现多了管理功能:


可以通过此管理功能,管理几个节点

18、定义haproxy的动静分离

编辑配置文件haproxy.cfg,加入下面的代码

frontend  websrvs
    bind  *:80
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js .html
    acl host_static     hdr_beg(host)  -i img. video. download. ftp. imgs. videos.
    acl url_php         path_end       -i .php

    use_backend static          if url_static or host_static
    use_backend dynamic     if url_php
    default_backend             dynamic

backend static
    balance    roundrobin
    server      node1 192.168.20.11:80  check maxconn 30000

backend dynamic
    balance    roundrobin
    server      node2 192.168.20.12:80  check maxconn 1000

修改完配置文件后重新载入配置文件

[root@localhost haproxy]# !se
service haproxy reload
重新载入 haproxy:

演示效果:

访问静态页面都落到node1上,当然这里的测试页名字与配置文件里的名字不一致


访问动态页面都落到node2上,当然这里的测试页名字与配置文件里的名称不一致



阅读(8999) | 评论(0) | 转发(0) |
0

上一篇:Mongdb

下一篇:sed 命令使用详解

给主人留下些什么吧!~~