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
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端口
单台Haproxy服务器就可以实现多台Web服务器之间的热备和负载均衡,这里使用Keepalived保证了Haproxy本身的高可用。
一、Haproxy服务器的安装与配置
1.编译安装Haproxy
安装两个支持包
将haproxy编译到内核中
安装
2.Haproxy服务器配置
创建配置文件目录
复制源码包中的配置文件作为模版进行修改
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.创建自启动脚本
复制源码包中的服务脚本作为haproxy程序的控制脚本
优化并添加系统服务
启动haproxy服务
开启iptables防火墙80端口的例外
二、使用keepalived实现Haproxy本身的高可用
1.编译安装keepalived
安装keepalived之前需要安装三个支持包
编译安装keepalived,使用指定的内核位置对keepalived进行配置,并将安装路径指定为根目录,这样就无需额外创建链接文件了。
添加系统服务
2.主服务器的配置
global_defs{…} //指定全局参数
router_id //指定本服务器名称
vrrp_instance 实例名称 { ... } //指定VRRP热备实例
state //指定热备状态
virtual_router_id //虚拟路由器的ID号,每个热备组保持一致
priority //优先级,数值越大优先级越高
advert_int //通告间隔秒数(心跳频率)
authentication {…} //认证信息,每个热备组保持一致
auth_type //认证类型
auth_pass //密码子串
virtual_ipaddress{…} //指定漂移地址,可以有多个
重启keepalived服务
在haproxy 01上部署完keepalived服务后,查看网卡的信息,发现eth0接口自动添加了VIP地址。
3.备用服务器的配置
在haproxy 02上安装keepalived的过程一样,只是配置文件中主要有三处不同:路由器名称、热备状态、优先级。
可以在haproxy 02上直接复制第一台的配置文件
修改这三处即可
重启keepalived服务
查看网络接口信息,发现eth0接口没有添加VIP地址。
在客户机访问VIP的地址,打开两次后发现同样可以实现负载均衡的效果。
如果,要测试haproxy本身的高可用,只要停用haproxy 01,然后在客户端再次访问VIP地址即可。
三、Haproxy日志
Haproxy的日志默认是输出到系统的syslog中(即/var/log/message),查看不方便。所以,可以将其单独定义出来。
1.修改Haproxy配置文件关于日志配置的选项
这里主要是将Haproxy的info及notice日志分别记录到不同的日志文件中。
重启haproxy服务
2.修改rsyslog配置
为了便于管理,将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
在haproxy.conf中加入以上内容
“& ~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。
重启rsyslog服务
即时查看日志信息,在客户端访问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来了