HAProxy简介:
HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机。
它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点, 这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。
Haproxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择作为配置。
global:用于设定全局配置参数;
default:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件;
frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择);
backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器;
listen:Frontend和Backend的组合体
四层转发tcp(lvs) 七层代理http(haproxy)
稳定性的适合用lvs 网站负载适合用haproxy nginx
haproxy(单核)
实验环境:
server1: 172.25.40.1 haproxy
server2:172.25.40.2 web1
server3:172.25.40.3 web2
配置:
yum install haproxy -y
cd /etc/haproxy/
vim haproxy.cfg
stats uri /status # 监控页面地址
stats auth admin:redhat # 管理帐号和密码
stats refresh 5s #刷新频率
monitor-uri /monitor
frontend main #虚拟前端(代理)
bind *:80 #haproxy虚拟前端监听80端口
acl blacklist src 172.25.40.250 #设置访问控制列表,自命名为blacklist,将172.25.40.250加入blacklist
http-request deny if blacklist #拒绝blacklist中的主机的访问
#错误重定向
# errorloc 403 http://172.25.40.1:8080 (注意端口不要冲突)(403:服务器拒绝你的访问 服务器设定你是坏的 )(如果是403错误就重定向到 172.25.40.1:8080)
# redirect location http://172.25.40.1:8080 if blacklist (如果出现错误访问 就重定向 不管 是什么错误)
error 503 http://172.25.40.1:8080/index.html #找不到服务器时重定向
default_backend webserver #默认访问后端 webserver
backend webserver
balance roundrobin #调度算法:轮询
server web1 172.25.40.2:80 check #监听真实后端服务器80端口
server web2 172.25.40.3:80 check
两台 real server(server2,server3):
vim /var/www/html/index.html
systemctl start httpd
日志监控:
vim /etc/rsyslog.conf
$ModLoad imudp #接受 haproxy 日志
$UDPServerRun 514
*.info;mail.none;authpriv.none;cron.none;local2.none /var/log/messages
local2.* /var/log/haproxy.log #日志文件位置
测试:
(自带健康检查)
web1,web2都在线
(server2)web1,(server3)web2轮询
当server2宕机:
设置acl后:
开启server1 httpd服务,修改监听端口8080(因为haproxy监听80):
vim /etc/httpd/conf/httpd.conf
systemctl start httpd
错误重定向
当server2,server3全部宕机,访问172.25.40.1出现503,重定向到server1
301永久重定向:(一般推荐用301 302临时重定向 有恶意刷点击的嫌疑)
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png
acl westos.org hdr_beg(host) -i westos.org
acl 172.25.40.1 hdr_beg(host) -i 172.25.40.1
# block if badhost
# errorloc 403 http://172.25.40.1:8080
# redirect location http://172.25.40.1:8080 if badhost
redirect code 301 location http://www.westos.org if westos.org
(以westos.org访问 自动重定向 www.westos.org)
redirect code 301 location http://www.westos.org if 172.25.40.1
(以172.25.40.1访问 自动重定向 www.westos.org)
use_backend static if url_static
default_backend webserver
301 redirect: 301 代表永久性转移(Permanently Moved) 永久地,长期不变
302 redirect: 302 代表暂时性转移(Temporarily Moved )临时地,临时
详细来说,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
实现动静分离
frontend main
bind *:80
acl url_static path_beg -i /images #(以什么开头 默认根目录)
acl url_static path_end -i .jpg .gif .png # (以什么结尾)
use_backend static if url_static
# use_backend dynamic if { path_end .php }
default_backend webserver
# static backend for serving up images, stylesheets and such
backend static
balance roundrobin
server web1 172.25.40.2:80 check
backend webserver
balance roundrobin
server web2 172.25.40.3:80 check
server2存放图片
[root@server2 ~]# mkdir /var/www/html/images
[root@server2 ~]# scp kiosk@172.25.40.250:/home/kiosk/Desktop/redhat.jpg /var/www/html/images
当访问图片资源时,server2提供服务
其他默认server3提供服务:
读写分离
frontend main
bind *:80
acl read method GET
acl read method HEAD
acl write method PUT
acl write method POST
use_backend static if write
use_backend dynamic if read
default_backend static
backend static
balance roundrobin
server web1 172.25.40.2:80 check
backend dynamic
balance roundrobin
server web2 172.25.40.3:80 check
server2(server3同样,为测试):
mkdir /var/www/html/upload # 用来保存上传的文件
chmod 777 /var/www/html/upload
测试:
访问172.25.40.1/index.php,server3提供服务。如果上传文件,则只会保存到server2。