一,介绍
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。特别适用于那些负载特别大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整 合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。
二,安装
从49服务器下载haproxy-1.4.24.tar.gz,制作rpm安装包
yum install rpm-build -y Rpmbuild -tb haproxy-1.4.24.tar.gz
报错提示需要安装pcre-devel gcc
rpm -ivh /root/rpmbuild/RPMS/x86_64/haproxy-1.4.24-1.x86_64.rpm
即安装成功
三,配置
Server1.example.com
Vim /etc/haproxy/haproxy.cfg
global #log 127.0.0.1 local0 log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 ##并发最大连接数量 chroot /usr/share/haproxy ##jail目录 uid 99 ##用户 gid 99 ##组 daemon ##后台运行 #debug #quiet defaults log global mode http ##默认使用http的7层模式,tcp:4层 option httplog #http日志格式 option dontlognull ##禁用空连接日志 retries 3 ##尝试3次失败认为服务器不可用 option redispatch ##当client连接挂掉的主机时,重新分配到健康的主机 maxconn 2000 contimeout 5000 stats uri /status ##HAproxy监控页面 listen westos 0.0.0.0:80 ##监听所有ip的80端口 balance roundrobin ##负载均衡算法 server web1 172.25.49.3:80 check inter 2000 fall 3 server web2 172.25.49.4:80 check inter 2000 fall 3 server back1 127.0.0.1:8080 backup ###back1的8080端口提供服务 #rise 2:表示 2 次正确认为服务器可用 #fall 5:表示 5 次失败认为服务器不可用 #cookie app1inst1:表示 serverid 为 app1inst1 #check inter 2000:检测心跳频率
创建目录:mkdir /usr/share/haproxy
注意:因为本机作为被backup,所以本机的httpd服务需要开启,当所有realserver宕机时,本机提供一个错误页面,告知用户正在维护中,但HAProxy默认监听80端口,和httpd冲突,所以需要修改httpd监听端口:
vim /etc/httpd/conf/httpd.conf
136行: Listen 8080
/etc/init.d/haprexy reload
/etc/init.d/httpd restart
四,测试
浏览器输入172.25.49.1/status进行页面监控
输入172.25.49.1进行访问,轮询算法为roundrobin,所以交替出现server3和server4的apache发布页面,关掉server3和server4的httpd服务,显示back1主机也就是本机的apache页面。
五,安全验证
为保证监控页面安全,加密密码认证
listen stats_auth 0.0.0.0:8000 stats enable stats uri /status #监控页面地址 stats auth admin:westos #管理帐号和密码 stats refresh 5s #刷新频率
六,HAProxy日志
# vi /etc/rsyslog.conf #接受 haproxy 日志
$ModLoad imudp $UDPServerRun 514 local0.* /var/log/haproxy.log
# /etc/init.d/rsyslog restart
vim /etc/haproxy/haproxy.cfg
global log 127.0.0.1 local0 notice ##删除后面的notice,不限制日志级别
重启服务:/etc/init.d/haproxy reload
tail -f /var/log/haproxy.log
七,ACL
设置拒绝某个IP用户访问:
Vim /etc/haproxy/haproxy.cfg
listen westos 0.0.0.0:80 balance roundrobin acl badguy src 172.25.49.250 ###对来源172.25.49.250设置权限 block if badguy ###拒绝访问 errorloc 403 http://172.25.49.1:8080 ###显示403Forbiden不够人性化,将错误界面进行重定向 server web1 172.25.49.3:80 check inter 2000 fall 3 server web2 172.25.49.4:80 check inter 2000 fall 3 server back1 127.0.0.1:8080 backup
八,前端和后端配置
vim /etc/haproxy/haproxy.cfg
frontend westos 0.0.0.0:80 default_backend linux ##默认后端服务器 backend linux balance roundrobin server web1 172.25.49.3:80 check inter 2000 fall 3 server web2 172.25.49.4:80 check inter 2000 fall 3 server back1 127.0.0.1:8080 backup
九,图片和文字分离
Vim /etc/haproxy/haproxy.cfg
frontend westos 0.0.0.0:80 acl badguy src 172.25.49.250 acl url_img path_end -i .jpg ##设置ACL名url_img,路径结尾为.jpg时启用 #block if badguy #errorloc 403 http://172.25.49.1:8080 default_backend app use_backend image if url_img ##当使用url_img时,启动后端image backend app balance roundrobin server web1 172.25.49.3:80 check inter 2000 fall 3 server web2 172.25.49.4:80 check inter 2000 fall 3 server back1 127.0.0.1:8080 backup backend image balance roundrobin server img1 172.25.49.2:80 check inter 2000 fall 3
测试:
将redhat.jpg放到server2(172.25.49.2)的http发布目录。使用浏览器访问
http://172.25.49.1/redhat.jpg,检测路径到以.jpg结尾,启用后端image,读取172.25.49.2的80端口提供的数据,即redhat.jpg,实现了图片和文字分离。
十,读写分离
frontend westos 0.0.0.0:80 acl badguy src 172.25.49.250 acl url_img path_end -i .jpg acl upload method POST #block if badguy #errorloc 403 http://172.25.49.1:8080 default_backend app use_backend image if url_img use_backend image if upload backend app balance roundrobin server web1 172.25.49.3:80 check inter 2000 fall 3 server web2 172.25.49.4:80 check inter 2000 fall 3 server back1 127.0.0.1:8080 backup backend image balance roundrobin server img1 172.25.49.2:80 check inter 2000 fall 3
在server2,server3,server4的/var/www/html中,从49服务器下载上传文件的php文件和upload目录
Chmod 777 upload/
upload_file.php index.php
安装php:yum install php -y
/etc/init.d/httpd restart
能上传文件到server2的upload即成功。
根据配置文件,默认访问的是server3和server4的apache目录里面的php页面,点击上传文件之后,由HAProxy启用到后端的图片服务器server2,所以会上传到server2的upload目录。
十一,HAProxy+Keepalived
在server1和server2源码安装keepalived
编辑配置文件:
MASTER:
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived vrrp_script check_haproxy { script "/opt/check_haproxy.sh" interval 2 weight 2 } global_defs { notification_email { root@localhost } notification_email_from server1.example.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id server1.example.com } 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 { 172.25.49.100 } track_script { check_haproxy } }
BACKUP:
! Configuration File for keepalived vrrp_script check_haproxy { script "/opt/check_haproxy.sh" interval 2 weight 2 } global_defs { notification_email { root@localhost } notification_email_from server2.example.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id server2.example.com } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.49.100 } track_script { check_haproxy } }
检测脚本:
# cat /opt/check_haproxy.sh
#!/bin/bash /etc/init.d/haproxy status &> /dev/null || /etc/init.d/haproxy restart &> /dev/null if [ $? -ne 0 ];then /etc/init.d/keepalived stop &> /dev/null fi
给检测脚本添加执行权限:
chmod +x /opt/check_haproxy.sh
使用浏览器访问vip:172.25.49.100,可以正常上传文件。