原理图:
配置由两部分组成:
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上,当然这里的测试页名字与配置文件里的名称不一致