haproxy类似nginx、apache 均是7层负载:动静分离,比较智能,可以实现高可用+负载均衡+支持虚拟主机
搭建实验环境
主机 | 功能 |
---|---|
172.25.3.1 | 客户端 |
172.25.3.2 | haproxy代理服务器 |
172.25.3.3 | 后端服务器 |
172.25.3.4 | 后端服务器 |
搭建一个基本的haproxy服务器
(1)在server2上面搭建HAProxy服务器
yum install haproxy -y
利用haproxy实现反向代理与负载均衡
在vm2上配置服务
vim /etc/haproxy/haproxy.cfg
在vm3 vm4上配置httpd服务和发布页面
yum install httpd -y
echo vm2/3 > /var/www/html/index.html
在vm1上去访问172.25.0.2
实现了负载均衡
添加监控页面
设置密码和5秒刷新
改变算法,加权轮询
给haproxy服务器添加日志
vim /etc/haproxy/haproxy.cfg
设置messages接受haproxy的日志信息
打开UDP的两个参数
重启rsyslog服务,此时,查看/var/log/会产生haproxy.log来专门记录haproxy产生的日志信息。haproxy的日志信息此时也不会在message中查看。
负载均衡出现问题的时候,返回给客户的信息(错误页面重定向)
vim /etc/haproxy/haproxy.cfg
结果
动静分离
在server4上安装php
yum install php -y
写一个文件在发布页面
[root@vm4 html]# cat index.php
<?php
phpinfo()
?>
在vm3的HTML目录下加入photos目录下的一张图
在haproxy主机编辑haproxy配置文件
frontend main *:80
acl blacklist src 172.25.3.1
block if blacklist
errorloc 403 http://172.25.3.2:8080
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
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 172.25.3.3:80 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
# server app1 172.25.3.3:80 check
server app2 172.25.3.4:80 check
server backup 127.0.0.1:8080 backup
读写分离
在vm3/4的HTML目录下加入upload目录及文件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>
upload_file.php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
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";
}
?>
给予权限777
[root@vm4 html]# ll
total 12
-rw-r--r-- 1 root root 8 Aug 5 09:56 index.html
-rw-r--r-- 1 root root 257 Aug 9 15:39 index.php_backup
drwxrwxrwx 2 root root 53 Aug 7 15:03 upload
-rw-r--r-- 1 root root 929 Aug 7 14:50 upload_file.php
编辑配置文件
frontend main *:80
# acl blacklist src 172.25.3.1
# block if blacklist
# errorloc 403 http://172.25.5.2:8080
# acl url_static path_beg -i /static /images /javascript /stylesheets
# acl url_static path_end -i .jpg .gif .png .css .js
acl read_request method GET
acl read_request method HEAD
acl write_request method PUT
acl write_request method POST
use_backend static if read_request
use_backend app if write_request
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 172.25.3.3:80 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------