1、什么是haproxy
Haproxy是一个特别适用于高可用性环境的TCP/HTTP开源的反向代理和负载均衡软件。在七层负载均衡方面的功能很强大(支持cookie track, header rewrite等等),支持双机热备,支持虚拟主机,支持健康检查,同时还提供直观的监控页面,可以清晰的监控服务集群的运行状况。
2、配置HAProxy Session亲缘性的三种方式
haproxy负载均衡保持客户端和服务器Session亲缘性的三种方式:
(1)用ip识别
haproxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令)
配置指令 balance source
(2)用cookie识别
haproxy 将WEB服务端发送给客户端的cookie中插入(或添加前缀)haproxy定义的后端的服务器COOKIE ID。
配置指令例举 cookie SESSION_COOKIE insert indirect nocache
用firebug可以观察到用户的请求头的cookie里 有类似" Cookie jsessionid=0bc588656ca05ecf7588c65f9be214f5; SESSION_COOKIE=app1" SESSION_COOKIE=app1就是haproxy添加的内容
(3)用session识别
haproxy 将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。
配置指令例举 appsession JSESSIONID len 64 timeout 5h request-learn
3、负载均衡产品的比较
现在的web系统一般都需要负载均衡和高可用性的支持,以支持7*24的服务。负载均衡可以使用硬件,也可以使用软件来实现。
1) 硬件负载均衡
硬件负载均衡产品,比如F5,Big-IP。
2) 软件的负载均衡
一般是4层(TCP层)或者7层(应用层)来实现。软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载。
负载均衡的主要技术:
1) 反向代理负载均衡
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
在功能上能以proxy反向代理方式实现 WEB均衡负载的产品有很多。包括Nginx,ApacheProxy,lighttpd,Cheroke 等,它们同时也都是WEB服务器。 但要明确一点的,Haproxy 并不是 web 服务器,Haproxy仅仅一款的用于均衡负载的应用代理。其自身并不能提供http服务。
2) DNS负载均衡
基于DNS的方式,是基于DNS能够让多个IP地址(多个真实服务器)被赋给同一个主机名。
其他解决方案:
3)Linux Virtual Servers (LVS)
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
LVS的优点:
性能好,接近硬件设备的网络吞吐和连接负载能力。
LVS的DR模式,支持通过广域网进行负载均衡。这个其他任何负载均衡软件目前都不具备。
缺点:
比较重型。另外社区不如nginx活跃。
4)Nginx ("engine X")
Nginx ("engine x")是一款高性能、轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强。
性能好,可以负载超过1万的并发。
功能多,除了负载均衡,还能作Web服务器,而且可以通过Geo模块来实现流量分配。
社区活跃,第三方补丁和模块很多
支持gzip proxy
缺点:
不支持session保持。
对后端realserver的健康检查功能效果不好。而且只支持通过端口来检测,不支持通过url来检测。
5)haproxy
HAProxy主要有以下优点:
1) 免费开源,稳定性也是非常好,稳定性可以与LVS相媲美;
2) 根据官方文档,HAProxy最高支持10G并发,作为软件级负载均衡,性能强大;
3) HAProxy可以作为MySQL、邮件或其它的非web的负载均衡;
4) 自带强大的监控服务器状态的页面;
5) HAProxy支持虚拟主机。
它的优点正好可以补充nginx的缺点。支持session保持,同时支持通过获取指定的url来检测后端服务器的状态。
支持tcp模式的负载均衡。比如可以给mysql的从服务器集群和邮件服务器做负载均衡。
缺点:
日志通过net方式用syslogd进行记录如果日志太多很影响性能,不支持apache的日志格式。
4、haproxy的配置解说
Haproxy的配通过程分为3个主要部分:
- 命令行参数,这是最优先的
- global (全局)段,设置进程级参数;
- 代理配置段,通常位于default,listen,backend这样的形式内。
配置文件的语法是由关键字后跟可选的一个或者多个参数(参数之间有空格)组成。如果字符串中包含空格,必须用\进行转义。
Haproxy配置段中分五大部分:
global:全局参数配置,进程级的,用来控制Haproxy启动前的一些进程及系统设置。
defaults:配置默认的参数,可以被frontend,backend, listen段集成使用。
frontend :用来匹配接收客户所请求的域名、uri等,并针对不同的匹配做不同的请求处理。
backend:定义后端服务器集群,以及对后端服务器集群的一些权重、队列、连接数等选项的设置,类似于nginx中的upstream模块。
listen:可以理解为frontend和backend的组合体。Haproxy配置文件的配通方法主要有两种,一种是由前端(frontend )和后端( backend )配置块组成,前端和后端都可以有多个。第二种方法是只有一个listen配置块来同时实现前端和后端。最常用也是推荐的方法为第一种,即frontend和backend的模式。
5、haproxy的安装与启用
实验环境:
server1: 172.25.254.1 安装haproxy
server2: 172.25.254.2 后端服务器
server3: 172.25.254.3 后端服务器
在server1上:yum install -y haproxy
在server2、server3上安装httpd服务
yum install -y httpd
systemctl start httpd
systemctl status httpd
echo server2/server3 > /var/www/html/index.html
1)haproxy的负载均衡
vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
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 3000
stats uri /status (添加到默认设置模块)
frontend main *:80 修改端口
default_backend app 指定访问后端
backend app
balance roundrobin 轮询方式
server app1 172.25.254.2:80 check 后端server2ip
server app2 172.25.254.3:80 check 后端server3ip
先解除80端口的占用(httpd服务或者nginx服务)
systemctl stop httpd / nginx
systemctl restart haproxy.service
测试:
在客户端 curl 172.25.254.1,轮询访问,实现负载
用apach访问 172.25.254.1/status,可以看到如下的页面
关闭server1的httpd服务
(2)查看后端服务器的状态
vim /etc/haproxy/haproxy.cfg
结果:用apache访问172.25.254.1/status时,需要用户名和密码,进入后页面5秒刷新一次
(3)haproxy的日志配置
vim /etc/rsyslog.conf
systemctl restart rsyslog
结果:haproxy日志文件被独立出来
(4)haproxy实现动静分离
在server2的/var/www/html下建立目录images,并在目录中放入图片,或建立一个文件
编写完index.php后一定要重启httpd服务
(5)读写分离
vim /etc/haproxy/haproxy.cfg
backend app(172.25.254.2) backend static(172.25.254.3)
在server2和server3中:
yum install php -y
vim /var/www/html/index.php 读的php页面
vim /var/www/html/upload_file.php写的php页面
systemctl restart httpd.service
mkdir /var/www/html/uoload
chmod 777 /var/www/html/upload
cat index.php
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
cat upload_file.php
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
结果:在网页中上传文件,只有server3的目录中上传了文件
(6)黑名单