Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1827797
  • 博文数量: 636
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3950
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-06 21:58
个人简介

博客是我工作的好帮手,遇到困难就来博客找资料

文章分类

全部博文(636)

文章存档

2024年(5)

2022年(2)

2021年(4)

2020年(40)

2019年(4)

2018年(78)

2017年(213)

2016年(41)

2015年(183)

2014年(66)

我的朋友

分类: 系统运维

2017-05-17 17:36:26

Haproxy下载地址:


关闭SElinux、配置防火墙

1、vi /etc/selinux/config

#SELINUX=enforcing #注释掉

#SELINUXTYPE=targeted #注释掉

SELINUX=disabled #增加

:wq!  #保存退出

setenforce 0 #使配置立即生效

2、vi /etc/sysconfig/iptables  #编辑

-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT  #允许组播地址通信

-A RH-Firewall-1-INPUT -p    vrrp    -j ACCEPT  #允许VRRP(虚拟路由器冗余协)通信

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT  #允许80端口通过防火墙

:wq! #保存退出

/etc/init.d/iptables restart #重启防火墙使配置生效


安装HAProxy

1、创建HAProxy运行账户和组

groupadd haproxy #添加haproxy组

useradd -g haproxy haproxy -s /bin/false #创建nginx运行账户haproxy并加入到haproxy组,不允许haproxy用户直接登录系统

2、安装


[root@A local]# yum install -y gcc
[root@A local]# tar zxvf haproxy-1.6.9.tar.gz
[root@A local]# cd haproxy-1.6.9
[root@A local]# make  TARGET=linux3100 CPU=x86_64  PREFIX=/usr/local/haprpxy  #编译  uname -r #查看系统内核版本号
[root@A local]# make install PREFIX=/usr/local/haproxy  #安装

#数说明:
#TARGET=linux3100
#使用uname -r查看内核,如:2.6.18-371.el5,此时该参数就为linux26

#kernel 大于2.6.28的用:TARGET=linux2628

#CPU=x86_64   #使用uname -r查看系统信息,如x86_64 x86_64 x86_64 GNU/Linux,此时该参数就为x86_64

#PREFIX=/usr/local/haprpxy   #/usr/local/haprpxy为haprpxy安装路径


3、设置HAProxy

mkdir -p  /usr/local/haproxy/conf  #创建配置文件目录

mkdir -p /etc/haproxy  #创建配置文件目录

touch  /usr/local/haproxy/conf/haproxy.cfg  #创建配置文件

ln -s  /usr/local/haproxy/conf/haproxy.cfg   /etc/haproxy/haproxy.cfg  #添加配置文件软连接

cp -r  /usr/local/src/haproxy-1.6.9/examples/errorfiles  /usr/local/haproxy/errorfiles  #拷贝错误页面

ln -s  /usr/local/haproxy/errorfiles  /etc/haproxy/errorfiles  #添加软连接

mkdir -p  /usr/local/haproxy/log  #创建日志文件目录

touch  /usr/local/haproxy/log/haproxy.log  #创建日志文件

ln -s  /usr/local/haproxy/log/haproxy.log  /var/log/haproxy.log  #添加软连接

cp /usr/local/src/haproxy-1.6.9/examples/haproxy.init  /etc/rc.d/init.d/haproxy  #拷贝开机启动文件

chmod +x  /etc/rc.d/init.d/haproxy  #添加脚本执行权限

chkconfig haproxy on  #设置开机启动

ln -s  /usr/local/haproxy/sbin/haproxy  /usr/sbin  #添加软连接

4、配置haproxy.cfg参数

cp  /usr/local/haproxy/conf/haproxy.cfg   /usr/local/haproxy/conf/haproxy.cfg-bak  #备份

vi  /usr/local/haproxy/conf/haproxy.cfg  #编辑,修改


#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log    127.0.0.1 local2          ###[err warning info debug] 
    chroot  /usr/local/haproxy
    pidfile  /var/run/haproxy.pid   ###haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 
    maxconn  4000                   ###最大连接数,默认4000
    user   haproxy
    group   haproxy
    daemon                          ###创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"
 
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will 
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode   http                       ###默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
    log    global                       ###采用全局定义的日志
    option  dontlognull             ###不记录健康检查的日志信息
    option  httpclose                ###每次请求完毕后主动关闭http通道 
    option  httplog                   ###日志类别http日志格式 
    option  forwardfor              ###如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
    option  redispatch              ###serverId对应的服务器挂掉后,强制定向到其他健康的服务器
    timeout connect 10000       #default 10 second timeout if a backend is not found
    timeout client 300000         ###客户端连接超时
    timeout server 300000        ###服务器连接超时
    maxconn     60000             ###最大连接数
    retries     3                       ###3次连接失败就认为服务不可用,也可以通过后面设置 
####################################################################
listen stats
        bind 0.0.0.0:1080           #监听端口  
        stats refresh 30s            #统计页面自动刷新时间  
        stats uri /stats               #统计页面url  
        stats realm Haproxy Manager #统计页面密码框上提示文本  
        stats auth admin:admin      #统计页面用户名和密码设置  
        #stats hide-version         #隐藏统计页面上HAProxy的版本信息
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main
    bind 0.0.0.0: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 if url_static      ###满足策略要求,则响应策略定义的backend页面
    default_backend   dynamic            ###不满足则响应backend的默认页面
 
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
 
backend static
    balance     roundrobin                                 ###负载均衡模式轮询
    server      static 127.0.0.1:80 check              ###后端服务器定义
     
backend dynamic
    balance    roundrobin
    server         websrv1 10.252.97.106:80 check maxconn 2000
    server         websrv2 10.117.8.20:80 check maxconn 2000
 
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
#errorloc  503  

errorfile 403 /etc/haproxy/errorfiles/403.http

errorfile 500 /etc/haproxy/errorfiles/500.http

errorfile 502 /etc/haproxy/errorfiles/502.http

errorfile 503 /etc/haproxy/errorfiles/503.http

errorfile 504 /etc/haproxy/errorfiles/504.http

:wq! #保存退出

service haproxy start #启动

service haproxy stop  #关闭

service haproxy restart  #重启

5、设置HAProxy日志
vi  /etc/syslog.conf  #编辑,在最下边增加

# haproxy.log

local0.*          /var/log/haproxy.log

local3.*          /var/log/haproxy.log

:wq! #保存退出

vi  /etc/sysconfig/syslog   #编辑修改

SYSLOGD_OPTIONS="-r -m 0"   #接收远程服务器日志

:wq! #保存退出

service syslog restart  #重启syslog

5.浏览器打开haproxy的监控页面

如下:  //说明:1080即haproxy配置文件中监听端口,stats 即haproxy配置文件中的监听名称 


实验环境


node1:  eth0 192.168.139.2(可访问公网)

            eth1 192.168.10.7

node4:  192.168.10.8 网关:192.168.10.7

node5:  192.168.10.9 网关:192.168.10.7


其中在node1上装有HAProxy,用作负载均衡调度器

node4|node5装有httpd,用来作为后端的RS_Server 

为了让后端RS不暴露在外网环境下(安全考虑),本次实验采用node4|node5的IP与node1(调度器)的eth0不再一个网段的方法,所以先为node1添加一个网卡,作为node4|nde5的网关 . 

开启node1|node4|node5

[root@node1 ~]# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:0C:29:1C:13:12  
          inet addr:192.168.139.2  Bcast:192.168.139.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe1c:1312/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6137 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3743 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:403125 (393.6 KiB)  TX bytes:239297 (233.6 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:1C:13:1C  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

为新添的网卡eth1配置IP

[root@node1 ~]# ifconfig eth1 192.168.10.7/24 up 

[root@node1 ~]# ifconfig


eth0      Link encap:Ethernet  HWaddr 00:0C:29:1C:13:12  
          inet addr:192.168.139.2  Bcast:192.168.139.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe1c:1312/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6707 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4103 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:449123 (438.5 KiB)  TX bytes:272859 (266.4 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:1C:13:1C  
          inet addr:192.168.10.7  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe1c:131c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:208 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:13954 (13.6 KiB)  TX bytes:328 (328.0 b)

配置node4|node5的网关和IP并启动httpd

[root@node4 ~]# ifconfig eth0 192.168.10.8/24 up

[root@node4 ~]#route add default gw 192.168.139.7

[root@node4 ~]#service httpd start

[root@node5 ~]# ifconfig eth0 192.168.10.9/24 up

[root@node5 ~]# route add default gw 192.168.139.7

[root@node4 ~]#service httpd start

[root@node1 ~]# curl

node4.zxl.com


[root@node1 ~]# curl

node5.zxl.com





在node1上安装HAProxy

[root@node1 ~]# yum install -y haproxy

[root@node1 ~]# cd /etc/haproxy/

[root@node1 haproxy]# cp haproxy.cfg haproxy.cfg.bak

要启用本机的日志功能local2要做以下配置

[root@node1 haproxy]# vim /etc/sysconfig/rsyslog 

SYSLOGD_OPTIONS="-c 2 -r"

[root@node1 haproxy]# vim /etc/rsyslog.conf 

local2.*                        /var/log/haproxy.log


[root@node1 haproxy]# service rsyslog restart

Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]

[root@node1 haproxy]# vim haproxy.cfg

global #全局端配置

log         127.0.0.1 local2 #启用本机的日志功能local2


    chroot      /var/lib/haproxy               #chroot限制根目录 /var/lib/haproxy 安全

    pidfile     /var/run/haproxy.pid          #pid文件

    maxconn     4000                           #设定一个前端的最大并发连接数为4000,因此其不能用于backend区段
    user        haproxy                          #以HAProxy用户身份运行
    group       haproxy                         #以HAProxy组身份运行
    daemon                                        #让haproxy以守护进程的方式工作于后台
  # turn on stats unix socket
    stats socket /var/lib/haproxy/stats 


defaults                          #为所有其它配置段提供默认参数
    mode              http      #设定实例的运行模式或协议,若调度mysql则为tcp
    log               global      #当前实例的日志系统参数同"global"段中的定义
    option             httplog  #启用记录HTTP请求、会话状态和计时器的功能。
                         #默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。


    option               dontlognull #不要记录空日志 
    option http-server-close
    option forwardfor     except 127.0.0.0/8 #除了来自本机的请求(本机本身为DR),在发往服务器的请求首部中插入“X-Forwarded-For”首部。通Nginx的X-Real-IP,可以记录真实的client IP
    option             redispatch
    retries             3  #重试次数3
    timeout http-request    10s #下面则是一些关于时间的定义,一般默认就行
    timeout queue         1m
    timeout connect        0s
    timeout client        1m
    timeout server         1m
    timeout http-keep-alive 10s
    timeout check         10s
    maxconn             3000


listen stats   #“listen”段通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用

    mode http                                     #值可以为http|tcp|health
    bind 0.0.0.0:1080                          #定义一个或几个监听的套接字,监听在所有地址的1080端口,进行状态监控
    stats enable                                 #启用基于程序编译时默认设置的统计报告(监控),不能用于“frontend”区段
    stats hide-version                         #隐藏HAProxy的版本号(防止有人知道版本号后查到相应的系统漏洞)
    stats uri   /haproxyadmin?stats      #根据这个URI进行监控页面的访问
    stats realm   Haproxy\ Statistics    #认证时的提示信息,\为脱义符后面有空格
    stats auth    admin:zxl                 #用户名和密码
    stats admin if TRUE                    #如果认证成功则打开web监控管理界面


frontend http-in  #http-in随便给的名称,“frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
    bind *:80   #通过80端口向外提供服务(web)
    mode http 
    log global  #启用提前将HTTP请求记入日志,不能用于“backend”区段。
    option httpclose 
    option logasap
    option dontlognull #不要记录空日志 

    capture request header Host len 20 捕获并记录指定的请求首部最近一次出现时的第一个值为HOST(主机)的请求报文的前20个字节并保留下来

    capture request header Referer len 60#捕获并记录指定的请求首部最近一次出现时的第一个值为Referer的请求报文的前20个字节并保留下来

    default_backend servers #在没有匹配的"use_backend"规则时为实例指定使用的默认后端,因此,其不可应用于backend区段。

frontend healthcheck             #定义一个健康检查段
    bind :1099                       #用1099端口进行健康状态检查
    mode http
    option httpclose                #为每一个请求都附加此首部“X-Forwarded-For”
    option forwardfor              #允许在发往服务器的请求首部中插入“X-Forwarded-For”首部。
    default_backend servers 


backend servers       #“backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。

balance roundrobin #使用roundrobin调度算法

 server websrv1 192.168.10.8:80 check port 80 inter 2 rise 1 fall 2 maxconn 2000

 server websrv2 192.168.10.9:80 check port 80 inter 2 rise 1 fall 2 maxconn 2000

#check:启动对此server执行健康状态检查,检查端口80

#inter:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter  来根据服务器端状态优化此时间延迟;

#rise:某离线的server从离线状态转换至正常状态需要成功检查的次数;

#fall:确认server从正常状态转换为不可用状态需要检查的次数;

[root@node1 haproxy]# service haproxy start
Starting haproxy:                                          [  OK  ]

[root@node1 haproxy]# netstat -tnlp |grep haproxy
tcp       0 0.0.0.0:1099    0.0.0.0:*       LISTEN      2007/haproxy        
tcp       0 0.0.0.0:80      0.0.0.0:*      LISTEN      2007/haproxy        
tcp       0 0.0.0.0:1080     0.0.0.0:*       LISTEN      2007/haproxy  

可以看到启动时执行的是以下命令

[root@node1 haproxy]# ps aux |grep haproxy

haproxy   /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid


负载均衡MySQL服务的配置如下


[root@node1 haproxy]# vim haproxy.cfg

    log         127.0.0.1 local2

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

defaults

    mode                    tcp
    log                     global
    option                  httplog
    option                  dontlognull
    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                 600

listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE

frontend mysql
    bind *:3306 
    mode tcp    #mysql为tcp模式
    log global
    default_backend mysqlservers


backend mysqlservers
    balance leastconn
    server dbsrv1 192.168.10.8:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
    server dbsrv2 192.168.10.9:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300

本次实验完毕!



HAProxy概述
       HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持 10G 的并发。HAProxy 特别适用于那些负载特大的 web 站点, 这些站点通常又需要会话保持或七层处理。 HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的 web 服务器不被暴露到网络上。其支持从 4 层至 7 层的网络交换,即覆盖所有的 TCP 协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。

相同点:在功能上,proxy 通过反向代理方式实现 web 均衡负载,和 Nginx,ApacheProxy,lighttpd, Cheroke 等一样。

不同点:Haproxy 并不是 Http 服务器。以上提到所有带反向代理均衡负载的产品,都清一色是 WEB 服务器。

简单说,就是他们能自个儿提供静态(html,jpg,gif..)或动态(php,cgi..)文件的传输以及处理。而 Haproxy 仅仅而且专门是一款的用于均衡负载的应用代理。其自身并不能提供 http 服务。 但其配置简单,拥有非常不错的服务器健康检查功能还有专门的系统状态监控页面,当其代理的后端服务器出现故障, HAProxy 会自动将该服务器摘除,故障恢复后再自动将该服务器加入。

HAProxy 负载的几种方式:

1. 轮询                    roundrobin
2. 最少连接数          Leastconn
3. 根据源IP             source
4. 根据URI              uri
5. 根据URL里的参数   url_param(根据请求串中的数据hush后做lb,譬如需要一个userid永远在某台服务器上,该策略是静态的

2.HAProxy 官网地址


3.Haproxy 实验拓扑

HaProxy分发器:192.168.42.175

Web1 (nginx)server:192.168.42.176

Web2 (nginx)server:192.168.42.177

wKiom1kKzbPDwoNlAACAMF5fi_I672.jpg-wh_50

Haproxy服务端配置
[root@xuegod175 ~]# tar xvf haproxy-1.5.15.tar.gz -C /usr/local/src/

[root@xuegod175 ~]#cd /usr/local/src/haproxy-1.5.15/

[root@xuegod175 haproxy-1.5.15]# cat README | less //查看安装方式,比较特殊

[root@xuegod175 haproxy-1.5.15]# uname -a

Linux xuegod175.cn 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

[root@xuegod175 haproxy-1.5.15]# make TARGET=linux26 PREFIX=/usr/local/haproxy

//指定操作系统内核类型和安装的路径。也可以直接修改 Makefile 配置文件中这两个变量的值。如下:

[root@xuegod175 haproxy-1.5.15]# vim Makefile
添加:TARGET = linux26 
[root@xuegod175 haproxy-1.5.15]# make install PREFIX=/usr/local/haproxy

[root@xuegod175 haproxy-1.5.15]# cd /usr/local/haproxy/

[root@xuegod175 haproxy]# ls

doc sbin share #没有配置文件目录

[root@xuegod175 haproxy]# mkdir /usr/local/haproxy/etc ; cd

[root@xuegod175 ~]# cp /usr/local/src/haproxy-1.5.15/examples/haproxy.cfg /usr/local/haproxy/etc/ 

[root@xuegod175 ~]# vim /usr/local/haproxy/etc/haproxy.cfg
 
#global 全局,以全局定义为准
#defaults   默认,在全局的前提下,默认跟局部的配置,如果局部没说,那就按默认走,如果局部有定义那就按局部。

#frontend   前端,监听地址,监听端口,该如何处理。。。。。

#backend    后端服务器,定义那些真正处理业务的服务器Realserver.

#listen 将frontend和backend 合体的一种方案

global
log 127.0.0.1  local0
#log 127.0.0.1  local1 notice
#log loghost    local0 info
maxconn 4096
chroot /usr/local/haproxy
uid 99                          #所属运行的用户uid
gid 99                          #所属运行的用户组
daemon                          #以后台形式运行haproxy
nbproc 1                        #启动1个haproxy实例。# #工作进程数量(CPU数量) ,实际工作中,应该设置成和CPU核心数一样。 这样可以发挥出最大的性能。
pidfile /usr/local/haproxy/run/haproxy.pid  #将所有进程写入pid文件
#debug                          #调试错误时用
#quiet                          #安静
defaults
log    global
log    127.0.0.1      local3        #日志文件的输出定向。产生的日志级别为local3. 系统中local1-7,用户自己定义
mode    http                         #工作模式。所处理的类别,默认采用http模式,可配置成tcp作4层消息转发
option  httplog                      #日志类别,记载http日志
option  httpclose                   #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
option  dontlognull                 #不记录空连接,产生的日志
option  forwardfor                  #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option  redispatch                  #当serverid对应的服务器挂掉后,强制定向到其他健康服务器
retries 2                            #2次连接失败就认为服务器不可用,主要通过后面的check检查
maxconn 2000                        #最大连接数
balance roundrobin                  #负载均衡算法
stats  uri    /haproxy-stats        #haproxy 监控页面的访问地址 # 可通过 访问
timeout connect      5000ms                #连接超时时间。 单位:ms 毫秒,
 timeout client      50000ms               #客户端连接超时时间,
timeout server      50000ms               #服务器端连接超时时间,
 listen  localhost 0.0.0.0:80                  #运行的端口及主机名 
mode    http
option  httpchk GET /index.html                 #健康检测。#注意实际工作中测试时,应该下载某一个页面来进行测试,因此这个页面应该是个小页面,而不要用首页面。这里是每隔一秒检查一次页面。
server  s1 192.168.42.176:80  weight 3 check      #后端的主机 IP &权衡
server  s2 192.168.42.177:80 weight 3 check       #后端的主机 IP &权衡


[root@xuegod175 ~]# id nobody //99 是 nobody 运行用户

uid=99(nobody) gid=99(nobody) groups=99(nobody)

[root@xuegod175 ~]# mkdir -p /usr/local/haproxy/run

[root@xuegod175 ~]# chown nobody /usr/local/haproxy/ -R

[root@xuegod175 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg //启动

[root@xuegod175 ~]# ps -aux | grep haproxy

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
nobody 3327 0.0 0.0 12200 960 ? Ss 13:37 0:00 /usr/local/haproxy/sbin/haproxy -f

/usr/local/haproxy/etc/haproxy.cfg

[root@xuegod175 ~]# netstat -antup | grep 80

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3327/haproxy

比较特殊重启方法:

[root@xuegod175 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg -st `cat /usr/local/haproxy/run/haproxy.pid`

//重启 -st 参数含义:-sf/-st [pid ( haproxy 当前进程程 ID) ] 完成/终止旧的 PID。 此参数必须是最后一个参数

[root@xuegod175 etc]# killall haproxy //停止服务

制作 HAproxy 启动脚本

[root@xuegod175 ~]# cp /usr/local/src/haproxy-1.5.15/examples/haproxy.init /etc/init.d/haproxy //可以修改此文件

实现启动脚本,太多修改内容

直接使用下面的作为启动脚本

[root@xuegod175 ~]# vim /etc/init.d/haproxy 


[root@xuegod175 haproxy-1.5.15]# cat /etc/init.d/haproxy 
 
#! /bin/sh
 
set -e
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin
 
PROGDIR=/usr/local/haproxy
 
PROGNAME=haproxy
 
DAEMON=$PROGDIR/sbin/$PROGNAME
 
CONFIG=$PROGDIR/etc/haproxy.cfg
 
PIDFILE=$PROGDIR/$PROGNAME.pid
 
DESC="HAProxy daemon"
 
SCRIPTNAME=/etc/init.d/$PROGNAME
 
# Gracefully exit if the package has been removed.
 
test -x $DAEMON || exit 0
 
start()
 
{
 
echo -n "Starting $DESC: $PROGNAME"
 
$DAEMON -f $CONFIG
 
echo "."
 
}
 
stop()
 
{
 
echo -n "Stopping $DESC: $PROGNAME"
 
haproxy_pid=$(cat $PIDFILE)
 
kill -15 $haproxy_pid
 
echo "."
 
}
 
restart()
 
{
 
echo -n "Restarting $DESC: $PROGNAME"
 
$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
 
echo "."
 
}
 
case "$1" in
 
start)
 
start
 
;;
 
stop)
 
stop
 
;;
 
restart)
 
restart
 
;;
 
*)
 
echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
 
exit 1
 
;;
 
esac
 
exit 0
#说明:脚本中 set -e 的作用 
#你写的每个脚本都应该在文件开头加上 set -e,这句语句告诉 bash 如果任何语句的执行结果不是 true 则应该退出。这样的好处是防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉。

[root@xuegod175 ~]# /etc/init.d/haproxy restart //可以实现启动
HA-Proxy 日志配置
配置日志收集
[root@xuegod175 ~]# vim /etc/rsyslog.conf //打开以以下两行的注释,不打开收不到日志。

$ModLoad imudp #取消注释

$UDPServerRun 514 #取消注释

local7.* /var/log/boot.log #下面添加两行

local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log

[root@xuegod175 ~]# /etc/init.d/rsyslog restart

Web服务端配置测试文件
注:这里的web服务器均使用了nginx,安装过程省略掉。

[root@xuegod176 ~]# cat /usr/local/nginx/html/index.html

192.168.42.176

[root@xuegod177 ~]# cat /usr/local/nginx/html/index.html

192.168.42.177

访问进行测试:

测试访问界面web1


Haproxy代理WEB服务


-----client---------haproxy-------nginx1---------nginx2------
192.168.1.250 192.168.1.1 192.168.1.10 192.168.1.20

一、安装Nginx

[root@localhost ~]# yum -y install pcre-devel zlib-devel

[root@localhost ~]# useradd -M -s /sbin/nologin nginx

[root@localhost ~]# tar -zxvf nginx-1.6.0.tar.gz -C /usr/src/

[root@localhost ~]# cd /usr/src/nginx-1.6.0/

[root@localhost nginx-1.6.0]# ./configure --
prefix=/usr/local/nginx --user=nginx --group=nginx --with-fileaio
--with-http_stub_status_module --with-http_gzip_static_module
--with-http_flv_module --with-http_ssl_module
[root@localhost nginx-1.6.0]# make && make install
[root@localhost ~]# ln -s /usr/local/nginx/sbin/*
/usr/local/sbin/
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx
[root@localhost ~]# netstat -anpt | grep 80
[root@localhost ~]# killall -s HUP nginx //重新加载
[root@localhost ~]# killall -s QUIT nginx //关闭服务
[root@localhost ~]# nginx

验证:

web-1:

[root@localhost ~]#echo "welcome to 192.168.1.20 web server" >
/usr/local/nginx/html/index.html

web-2:
[root@localhost ~]#echo "welcome to 192.168.1.30 web server" >
/usr/local/nginx/html/index.html

[root@localhost ~]# firefox &

二、安装haproxy

1、安装
[root@localhost ~]# yum -y install pcre-devel zlib-devel
[root@localhost ~]# tar -zxvf haproxy-1.4.24.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/haproxy-1.4.24/
[root@localhost ~]# make TARGET=linux26
PREFIX=/usr/local/haproxy
注意:linux26 是指linux 的内核版本号。

[root@localhost ~]# make install PREFIX=/usr/local/haproxy

2、配置haproxy

[root@localhost ~]# mkdir /etc/haproxy

[root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /etc/haproxy/

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg

修改:
global
log 127.0.0.1 local0 //配置日志记录,local0 为日志设备,默认存放到系统日志

log 127.0.0.1 local1 notice //notice 为日志级别,通常有7 个级别

#log loghost local0 info

maxconn 4096 //默认最大连接数,需考虑ulimit-n 限制:

可增加ulimit-n 819200 #ulimit 的数量限制

chroot /usr/share/haproxy //运行路径

uid 99
gid 99
#debug
#quiet
defaults
log global //定义日志为global 中的日志
mode http //模式为http
option httplog //采用http 的日志格式
option dontlognull //不记录健康检查日志信息
retries 3 //三次连接失败就认为是服务器不可用,也可以通过后面设置
#redispatch
maxconn 2000 //最大连接数
contimeout 5000 //连接超时时间
clitimeout 50000 //客户端超时时间
srvtimeout 50000 //服务端超时时间
listen stats
mode http
bind :6677
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
listen webcluster 0.0.0.0:80 //定义集群名、监听地址及端口
option httpchk GET /index.html 注意:可以删除 //检查服务器的index.html 文件
balance roundrobin //负载均衡轮询算法

server inst1 192.168.1.20:80 check inter 2000 fall 3 //在线节点
server inst2 192.168.1.30:80 check inter 2000 fall 3 //最后加

backup 表示备份借点

注意:
如果启动时出现报错:/haproxy.main()] Cannotchroot(/usr/share/haproxy)
则手动创建:

[root@localhost ~]# mkdir /usr/share/haproxy
如果启动时出现报错:Starting proxy cacti: cannot bind socket
则执行:
[root@localhost ~]# sysctl -e net.ipv4.ip_nonlocal_bind=1

3、启动haproxy

[root@localhost ~]# ln -s /usr/local/haproxy/sbin/* /usr/sbin/ //注意软链接的目录

[root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy

[root@localhost ~]# chmod +x /etc/init.d/haproxy

[root@localhost ~]# /etc/init.d/haproxy start
[root@localhost ~]# /etc/init.d/haproxy status
[root@localhost ~]# netstat -anp | grep haproxy //占用的也是TCP 的
80 端口
[root@localhost ~]# chkconfig --add haproxy
[root@localhost ~]# chkconfig haproxy on
查看集群的状态
4、验证:
客户端输入:

断开其中一个节点,再访问:

5、设置haproxy 日志
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg

修改:
log 127.0.0.1 local3 //设置haproxy 日志级别为3

[root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
添加:

$ModLoad imudp //加载模块

$UDPServerRun 514 //接收udp 的514 端口发送过来的日志

local3.* /var/log/haproxy.log //定义haproxy 日志文件

[root@localhost ~]# vim /etc/sysconfig/rsyslog
修改:
SYSLOGD_OPTIONS="-c 2 -r -m 0" //允许远程写入

[root@localhost ~]# /etc/init.d/rsyslog restart

[root@localhost ~]# /etc/init.d/haproxy restart
验证:
[root@localhost ~]# tail -f /var/log/haproxy.log //查看日志
三、验证:
客户端输入:
index.html
不停地刷新
查看:
[root@localhost ~]# tail -f /var/log/haproxy/haproxy.log
日志会记录客户端访问信息
日志会记录haproxy 启动/停止信息


haproxy+Keepalived

编译安装keepalived

[root@localhost keepalived-1.2.13]#./configure --prefix=/ --withkernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
[root@localhost keepalived-1.2.13]# make && make install

[root@localhost ~]#chkconfig --add keepalived
[root@localhost ~]#chkconfig keepalived on
[root@localhost ~]#cp /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf.bak
[root@localhost ~]#vim /etc/keepalived/keepalived.conf

[root@localhost conf]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
notification_email { //通知电子邮件
}
vrrp_instance VI_1 {         //VRRP 热备
state MASTER state BACKUP //热备状态master 为主,backup 为辅
nopreempt //不抢占,master 恢复后不会转移
interface eth0 //承载VIP 的物理接口
virtual_router_id 51 //虚拟路由编号,每组一个
priority 100 priority 55 //优先级,越大越优先
advert_int 1 //心跳频率,单位秒
authentication { //认证信息,每组内一致
auth_type PASS //认证类型
auth_pass 1111 //认证字符串
}
virtual_ipaddress { //漂移地址VIP。可以有多个
192.168.56.10
}
notify_master "/etc/init.d/haproxy start" //成为MASTER 之后执行的动作
notify_backup "/etc/init.d/haproxy stop" //成为BACKUP 之后执行的动作
notify_fault "/etc/init.d/haproxy stop" //FAULT 之后执行的动作
}
[root@localhost ~]#/etc/init.d/keepalived start
[root@localhost ~]#ip addr show
inet 192.168.56.201/24 brd 192.168.56.255 scope global eth0
inet 192.168.56.10/32 scope global eth0
[root@localhost ~]#netstat -anput | grep 80 

Haproxy代理Mysql服务

-----client---------haproxy-------mysql1---------mysql2------
192.168.1.250 192.168.1.1 192.168.1.10 192.168.1.20
一、安装mysql
[root@localhost ~]#tar -zxvf bison-2.5.tar.gz
[root@localhost ~]#./configure && make&& make install
[root@localhost ~]#tar -zxvf cmake-2.8.7.tar.gz
[root@localhost ~]#./bootstrap && gmake && gmake install
[root@localhost ~]#tar -zxvf mysql-5.5.22.tar.gz
[root@localhost ~]#cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -
DSYSCONFDIR=/etc/ -DDEFAULT_CHARSET=utf8 -
DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all
[root@localhost ~]#make && make install
初始化mysql:
[root@localhost ~]# cp support-files/my-medium.cnf /etc/my.cnf
[root@localhost ~]# cd scripts
[root@localhost ~]# ./mysql_install_db --basedir=/usr/local/mysql/ --
datadir=/usr/local/mysql/data/ --user=mysql
[root@localhost ~]# cp ../support-files/mysql.server /etc/init.d/mysqld
[root@localhost ~]# ln -s /usr/local/mysql/bin/* /usr/local/bin/
[root@localhost ~]# mysqladmin -u root password 'redhat'
登录测试:
[root@localhost ~]# mysql -u root -p
创建数据库:
[root@localhost ~]# mysql> createdata server1;
当然你也可以使用yum的方式安装mysql
[root@localhost ~]# yum -y install mysql mysql-devel mysql-server
二、安装haproxy
1、安装
[root@localhost ~]# yum -y install pcre-devel zlib-devel
[root@localhost ~]# tar -zxvf haproxy-1.4.24.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/haproxy-1.4.24/
[root@localhost ~]# make TARGET=linux26 PREFIX=/usr/local/haproxy
注意:linux26 是指linux 的内核版本号。
[root@localhost ~]# make install PREFIX=/usr/local/haproxy
2、配置haproxy
[root@localhost ~]# mkdir /etc/haproxy
[root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /etc/haproxy/
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
修改:
global
log 127.0.0.1 local0 //配置日志记录,local0 为日志设备,默认存放到系统日志
log 127.0.0.1 local1 notice //notice 为日志级别,通常有7 个级别
#log loghost local0 info
maxconn 4096 //默认最大连接数,需考虑ulimit-n 限制 :可增加ulimitn
819200 #ulimit 的数量限制
chroot /usr/share/haproxy //运行路径
uid 99
gid 99
#debug
#quiet
defaults
log global //定义日志为global 中的日志
mode tcp //模式为四层
option tcplog //采用http 的日志格式
option dontlognull //不记录健康检查日志信息
retries 3 //三次连接失败就认为是服务器不可用,也可以通过后面设置
#redispatch
maxconn 2000 //最大连接数
contimeout 5000 //连接超时时间
clitimeout 50000 //客户端超时时间
srvtimeout 50000 //服务端超时时间
listen stats
mode http
bind :6677
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE

listen mysqlcluster 0.0.0.0:3306

balance roundrobin

server m1 192.168.56.202:3306 check port 3306 maxconn 300

server m2 192.168.56.203:3306 check port 3306 maxconn 300

注意:
如果启动时出现报错:/haproxy.main()] Cannot chroot(/usr/share/haproxy)
则手动创建:
[root@localhost ~]# mkdir /usr/share/haproxy
如果启动时出现报错:Starting proxy cacti: cannot bind socket
则执行:
[root@localhost ~]# sysctl -e net.ipv4.ip_nonlocal_bind=1
3、启动haproxy
[root@localhost ~]# ln -s /usr/local/haproxy/sbin/* /usr/sbin/ //注意软链接的目录
[root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.init
/etc/init.d/haproxy
[root@localhost ~]# chmod +x /etc/init.d/haproxy
[root@localhost ~]# /etc/init.d/haproxy start
[root@localhost ~]# /etc/init.d/haproxy status
[root@localhost ~]# netstat -anp | grep haproxy //占用的也是TCP 的80 端口
[root@localhost ~]# chkconfig --add haproxy
[root@localhost ~]# chkconfig haproxy on
查看集群的状态
四、MySql 授权用户登录(集群内的mysql 都要授权)
mysql> GRANT ALL ON *.* TO 'root'@'192.168.56.%' IDENTIFIED BY 'redhat';
mysql> flush privileges;
五、测试:
[root@localhost ~]# mysql -u root -h 192.168.56.200 -p
登录两次分别查看
可增加keepalived



共涉及四台服务器、一台客户端设备。

分别为:

主haproxy+主keepalived  192.168.71.128   虚拟IP:192.168.71.200

辅haproxy+辅keepalived  192.168.71.138   虚拟IP:192.168.71.200

  192.168.71.200(DNS服务器192.168.71.138兼)


后端服务器:
server01:192.168.71.135  (Windows下 apache+php+mysql)

server02: 192.168.71.136 (centos 6.2下nginx+php+mysql)

客户端:192.168.71.1

所要达到的目的:

1、主辅haproxy服务器为实际后端服务器提供负载均衡。

2、server01或者server02任何一台宕机,不影响用户访问。

3、主辅haproxy任何一台宕机,不影响用户访问。 


安装配置:
1、实际服务器分别能单独访问:







2、分别在主辅haproxy服务器上安装配置haproxy和keepalived。

(1)192.168.71.128

haproxy.cfg配置(/usr/local/haproxy):

global
        log 127.0.0.1   local0
        maxconn 4096
        chroot /usr/local/haproxy
        uid 501
        gid 501
        daemon
        nbproc 1
        pidfile /usr/local/haproxy/haproxy.pid
#       debug
#      quiet

defaults
        log     127.0.0.1       local3
        mode    http
        option httplog
        option httpclose
        option dontlognull
        option forwardfor
        option redispatch
        retries 2
        maxconn 2000
       # balance roundrobin
        balance leastconn
        stats   uri     /haproxy-stats
        stats realm Haproxy\ statistics
        stats auth admin:bobo365
        stats hide-version
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000


listen web_proxy :80

        option httpchk GET /index.php  HTTP/1.1\r\nHOST:

        #option httpchk HEAD /index.php  HTTP/1.1\r\nHOST:\
        #option httpchk HEAD /index.php  HTTP/1.0/r/nHOST:/

        server web1_192.168.71.138  192.168.71.138:8080 cookie app1inst1 check inter 2000 rise 2 fall 5

        server web2_192.168.71.136  192.168.71.136:80 cookie app1inst2 check inter 2000 rise 2 fall 5

        server web3_192.168.71.135  192.168.71.135:80 cookie app1inst3 check inter 2000 rise 2 fall 5

keepalived.conf配置(/etc/keepalived):


! Configuration File for keepalived


global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}


vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.71.200
    }
}



(2)192.168.71.138


haproxy.cfg配置(/usr/local/haproxy):

global
        log 127.0.0.1   local0
        maxconn 4096
        chroot /usr/local/haproxy
        uid 501
        gid 501
        daemon
        nbproc 1
        pidfile /usr/local/haproxy/haproxy.pid
#       debug
#      quiet

defaults
        log     127.0.0.1       local3
        mode    http
        option httplog
        option httpclose
        option dontlognull
        option forwardfor
        option redispatch
        retries 2
        maxconn 2000
       # balance roundrobin
        balance leastconn
        stats   uri     /haproxy-stats
 stats realm Haproxy\ statistics
        stats auth admin:bobo365
        stats hide-version
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000


listen web_proxy :80
        option httpchk GET /index.php  HTTP/1.1\r\nHOST:
        #option httpchk HEAD /index.php  HTTP/1.1\r\nHOST:\
        #option httpchk HEAD /index.php  HTTP/1.0/r/nHOST:/

        server web1_192.168.71.138  192.168.71.138:8080 cookie app1inst1 check inter 2000 rise 2 fall 5
        server web2_192.168.71.136  192.168.71.136:80 cookie app1inst2 check inter 2000 rise 2 fall 5
        server web3_192.168.71.135  192.168.71.135:80 cookie app1inst3 check inter 2000 rise 2 fall 5

keepalived.conf配置(/etc/keepalived):

! Configuration File for keepalived


global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}


vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.71.200
    }
}


 其他:
1、检测keepalvied安装是否成功:(ip a命令)

192.168.71.128正常提供服务时:
1: lo: mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:e1:9a:1e brd ff:ff:ff:ff:ff:ff
    inet 192.168.71.128/24 brd 192.168.71.255 scope global eth0
    inet 192.168.71.200/32 scope global eth0
    inet6 fe80::20c:29ff:fee1:9a1e/64 scope link 
       valid_lft forever preferred_lft forever
3: sit0: mtu 1480 qdisc noop 
    link/sit 0.0.0.0 brd 0.0.0.0

192.168.71.128宕机时192.168.71.138状态:

1: lo: mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:6d:6b:18 brd ff:ff:ff:ff:ff:ff
    inet 192.168.71.138/24 brd 192.168.71.255 scope global eth0
    inet 192.168.71.200/32 scope global eth0
    inet6 fe80::20c:29ff:fe6d:6b18/64 scope link 
       valid_lft forever preferred_lft forever
3: sit0: mtu 1480 qdisc noop 
    link/sit 0.0.0.0 brd 0.0.0.0


2、启动关闭命令:
关闭:killall -9 haproxy
启动:/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg

/etc/init.d/keepalived stop|start|restart

3、检测页面:http:///haproxy-stats


新增配置(20120614补充)

haproxy.cfg:(/bobo365.com均可访问,主辅之间无缝切换)


global
        log 127.0.0.1   local0
        maxconn 51200
        chroot /usr/local/haproxy
        uid 501
        gid 501
        daemon
        nbproc 1
        pidfile /usr/local/haproxy/haproxy.pid
#       debug
#       quiet
defaults
        log     global
        log     127.0.0.1       local3  notice
        mode    http
        option httplog
        option httpclose
        option dontlognull
        option forwardfor
        option redispatch
        retries 3
        maxconn 51200
       # balance roundrobin
        balance leastconn
        stats   uri     /haproxy-stats
        stats realm Haproxy\ statistics
        stats auth admin:bobo365
        stats hide-version
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000
frontend        http-in
bind    *:80
        acl host_www hdr_beg(host) -i www.
        use_backend www_bobo365 if host_www
        acl bobo365_com hdr_beg(host) -i bobo365.com
        use_backend bobo365_com if bobo365_com
backend www_bobo365              
   balance leastconn
   option forwardfor
   option httpchk HEAD /index.php HTTP/1.1\r\nHost:\
server web1_71.136_80 192.168.71.136:80 check inter 5s rise 2 fall 5
#server web2_71.136_8000 192.168.71.136:8000 check inter 5s rise 2 fall 5

backend bobo365_com
   balance leastconn
   option forwardfor
   option httpchk HEAD /index.php HTTP/1.1\r\nHost:\ bobo365.com
server web1_71.136_80 192.168.71.136:80 check inter 5s rise 2 fall 5
#server web2_71.136 192.168.71.136:8000 check inter 5s rise 2 fall 5

Haproxy是目前比较流行的一种集群调度工具,与同类集群调度工具LVS和Nginx相比,LVS性能最好,但是搭建相对复杂,Nginx的upstream模块支持集群功能,但是对集群节点健康检查功能不强,性能没有Haproxy好。

LVS、Haproxy、Nginx最常用的调度算法有三种,分别是RR(Round Robin)轮询、LC(Least Connection)最小连接数、SH(Source Hashing)基于来源访问。

知识点的描述:1.负载均衡的常用调度算法:
         (1):RR(Round Robin),是最简单最常用的一种算法,即轮询调度。
         (2):LC(LEAST Conections),即最小节点数算法,根据后端的节点数大小动态分配前端请求
         (3):SH(Source Hashing),即基于来源访问调度算法,用于一些有Session会话记录在服务器端的场景,可以基于来源的IP,Cookis等做集群调度
         (4):如果需要实现haproxy的高可用,可以配置前一次所讲的keepalived,配置方法基本相同,需要增加一台haproxy用来做备份,注意一点的是需要在防火墙上开启keepalived的组播地址:224.0.0.18端口


wKiom1hqAZbT_heAAACGeaO_yT4040.png
单台Haproxy服务器就可以实现多台Web服务器之间的热备和负载均衡,这里使用Keepalived保证了Haproxy本身的高可用。


一、Haproxy服务器的安装与配置
1.编译安装Haproxy

wKioL1hqAdjiQonmAAACj4xTRh0946.png
安装两个支持包


wKiom1hqAdnRdAqnAAAHoyJD5Rw008.png

将haproxy编译到内核中
wKioL1hqAdmCvpIDAAACajfyeA0553.png



安装


2.Haproxy服务器配置

wKioL1hqAdngtYYXAAAClMB61Fo853.png
创建配置文件目录

wKiom1hqAdmzaMDGAAADLew5bk0684.png


复制源码包中的配置文件作为模版进行修改

wKioL1hqAdri5C0jAAAMAxStPCU006.png
wKioL1hqAdqTFIZlAAAIyD0P-3c519.png
wKiom1hqAduSkf73AAAIJhG30Xg421.png



wKiom1hjXoGARTKRAAFNGjHfTno995.png-wh_50
Haproxy配置文件通常分为三个部分:global(全局配置)、defaults(默认配置)、listen(应用组件配置)。
以示例参数说明如下:
global
log127.0.0.1  local0                    //配置日志记录,local0为日志设备,默认存放到系统日志
log127.0.0.1  local1notice              //notice为日志级别,通常有24个级别
maxconn  4096                           //最大连接数
uid99                                   //所属运行的用户UID
gid99                                   //所属运行的用户GID
pidfile  /var/run/haproxy.pid           //pid文件存放路径
daemon                                  //以后台形式运行haproxy
defaults
logglobal                               //定义日志为global配置中的日志定义
mode  http                             //模式为http
option  httplog                        //采用http日志格式几率日志
option  dontlognull                    //不记录健康检查的日志信息
option  redispatch                     //serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option  httpclose                      //每次请求完毕后主动关闭http通道
retries3                                  //3次连接失败就认为服务不可用
maxconn  2000                          //最大连接数
contimeout  5000                       //连接超时时间
clitimeout   50000                     //客户端超时间
srvtimeout  50000                      //服务器超时时间
listen  webcluster  0.0.0.0:80      //Frontend和Backend的组合体,监控组的名称,按需自定义名称,监听80端口。
option  httpchk  POST /index.htm       //心跳检测的文件
balance  roundrobin                    //负载调度使用轮询算法
server  inst1  192.168.1.20:80  check  inter  2000  fall  3        //服务器定义,check inter 2000表示检测心跳频率,fall 3是3次失败认为服务器不可用
server  inst1  192.168.1.21:80  check  inter  2000  fall  3


3.创建自启动脚本

wKioL1hqAdvR0C4WAAADOJk83-4465.png
复制源码包中的服务脚本作为haproxy程序的控制脚本
wKioL1hqAx7xzI8jAAAFU2pE0UI290.png
优化并添加系统服务
wKiom1hqAx6AIIX3AAADq-c-seI871.png
启动haproxy服务
wKiom1hqAx_ysKZnAAADC-23VZE032.png
开启iptables防火墙80端口的例外



二、使用keepalived实现Haproxy本身的高可用
1.编译安装keepalived
wKiom1hqAx_T2M7oAAAC3gyb4Xg530.png

安装keepalived之前需要安装三个支持包
wKioL1hqAx-if44BAAALaPf2vfI663.png

编译安装keepalived,使用指定的内核位置对keepalived进行配置,并将安装路径指定为根目录,这样就无需额外创建链接文件了。


wKiom1hqAyDxkHCgAAADv1PTeNY966.png

添加系统服务


2.主服务器的配置
wKiom1hqAyCyf8hfAAAMQ-ceFvM742.png
wKioL1hqA8Szl8bSAAAKX0_3wDo986.png
global_defs{…}                     //指定全局参数
router_id                          //指定本服务器名称
vrrp_instance 实例名称 { ... }                   //指定VRRP热备实例
state                              //指定热备状态
virtual_router_id                 //虚拟路由器的ID号,每个热备组保持一致
priority                          //优先级,数值越大优先级越高
advert_int                        //通告间隔秒数(心跳频率)
authentication {…}                                    //认证信息,每个热备组保持一致
auth_type                         //认证类型
auth_pass                         //密码子串
virtual_ipaddress{…}                               //指定漂移地址,可以有多个


重启keepalived服务

wKioL1hqA8TCinfbAAAE4y3uPHs731.png

wKiom1hqA8WxTeTwAAAPWasHK-g665.png
在haproxy 01上部署完keepalived服务后,查看网卡的信息,发现eth0接口自动添加了VIP地址。


3.备用服务器的配置
在haproxy 02上安装keepalived的过程一样,只是配置文件中主要有三处不同:路由器名称、热备状态、优先级。
wKioL1hqA8bAjGaaAAAET0o7gWc308.png

可以在haproxy 02上直接复制第一台的配置文件
wKiom1hqA8bxV2GpAAANdViv1Xs360.png

wKioL1hqA8ax88fvAAAQF0lX0QY313.png

修改这三处即可

wKiom1hqA8fjD6ylAAAElqasDk4994.png


重启keepalived服务

wKiom1hqA8fjK1gXAAAO1kxgj7E620.png

查看网络接口信息,发现eth0接口没有添加VIP地址。

在客户机访问VIP的地址,打开两次后发现同样可以实现负载均衡的效果。
如果,要测试haproxy本身的高可用,只要停用haproxy 01,然后在客户端再次访问VIP地址即可。


三、Haproxy日志
Haproxy的日志默认是输出到系统的syslog中(即/var/log/message),查看不方便。所以,可以将其单独定义出来。
 
1.修改Haproxy配置文件关于日志配置的选项
wKiom1hqBNDhSBVSAAACxSModdM819.png

这里主要是将Haproxy的info及notice日志分别记录到不同的日志文件中。


重启haproxy服务


2.修改rsyslog配置

wKioL1hqBNCw3RkMAAACh5ANPEM119.png
为了便于管理,将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。



wKiom1hqBNHxYDlxAAAKE5e4cRw377.png
在haproxy.conf中加入以上内容
“& ~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。


wKioL1hqBNGxkEz1AAAFcFo9HdU760.png

重启rsyslog服务
wKiom1hqBNGyLpgiAAAJpBf0eVo252.png

即时查看日志信息,在客户端访问haproxy 01服务器后,便会弹出新的日志信息。




一、测试环境

HAProxy:

主机名:RH7-HAProxy

IP地址:192.168.10.20

操作系统:Red Hat Enterprise Linux Server release 7.2 (Maipo)最小化安装

防火墙与SELinux:关闭

安装的服务:HAProxy-1.5.14

WEB01:

主机名:RH7-Web-01

IP地址:192.168.10.21

操作系统:Red Hat Enterprise Linux Server release 7.2 (Maipo)最小化安装

防火墙与SELinux:关闭

安装的服务:Apache-httpd 2.4

WEB02:

主机名:RH7-Web-02

IP地址:192.168.10.22

操作系统:Red Hat Enterprise Linux Server release 7.2 (Maipo)最小化安装

防火墙与SELinux:关闭

安装的服务:Apache-httpd 2.4

三、安装配置HAProxy

1、[root@RH7-HAProxy~]yum -y install haproxy

2、[root@RH7-HAProxy~]systemctl start haproxy

3、[root@RH7-HAProxy~]systemctl enable haproxy

4、[root@RH7-HAProxy~]mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

5、[root@RH7-HAProxy~]vi /etc/haproxy/haproxy.cfg

增加以下内容,然后重启haproxy服务

9、修改haproxy的配置文件,将web01的权重改为3,web02的权重仍为1,这样访问到两台web的比例应该为3:1,改好后重启下haproxy服务

10、再次通过浏览器访问HAProxy的IP地址,多次刷新进行访问测试

11、再次登录HAProxy后台查看统计数据,可以看到访问到web01和web02的比例为3:1




四、配置HAProxy使用Https加密访问

1、采用客户端到HAProxy使用https、HAProxy到WEB端使用http的方式,只需要在HAProxy上配置证书,这里我们就配置一张自签名证书来测试一下

2、查看一下配置好的证书jiangjianlong.pem

3、修改HAProxy的配置文件,增加以下参数后重启haproxy服务

4、使用https协议访问HAProxy的IP地址,提示证书存在问题,这是因为自签名证书不受浏览器信任,但说明上文配置的证书已经生效了,点击继续浏览此网站

8、配置http重定向,自动将http重定向为https,修改haproxy配置文件,增加以下参数,并重启服务

9、使用浏览器测试,成功实现http自动重定向为https进行访问,但由于截图无法呈现这个动态的效果,就不截了。


五、配置HAProxy使用独立日志文件

本文原始出处:江健龙的技术博客http://jiangjianlong.blog.51cto.com/3735273/1887279

1、HAProxy的日志默认写入到系统日志中去,我们可以把它独立出来,方便排查管理。编辑/etc/rsyslog.conf,按下图进行修改

2、重启rsyslog服务,再通过浏览器访问一下web以便产生日志,然后查看/var/log/haproxy.log,发现日志已经按照我们上文所配置的那样,记录到/var/log/haproxy.log来了



阅读(2117) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~