HAProxy
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,
同时可以保护你的web服务器不被暴露到网络上。
安装
tar zxf haproxy-1.6.11.tar.gz
find -name *.spec(若存在说明可以将其打为二进制包进行安装)
安装rpmbuild命令被用于创建rpm的二进制软件包和源码软件包
yum install -y rpm-build
打包并安装
rpmbuild -tb haproxy-1.6.11.tar.gz
cd rpmbuild/RPMS/x86_64/
rpm -qlp haproxy-1.6.11-1.x86_64.rpm #查看安装文件
rpm -ivh haproxy-1.6.11-1.x86_64.rpm
拷贝配置文件到指定目录
cp haproxy-1.6.11/examples/content-sw-sample.cfg /etc/haproxy/haproxy.cfg
创建haproxy指定用户
groupadd -g 200 haproxy
useradd -u 200 -g 200 haproxy
添加最大限制文件数
vim /etc/security/limits.conf
haproxy - nofile 65535
sysctl -a | grep file 可查看系统最大文件数
修改配置文件,实现负载均衡
vim /etc/haproxy/haproxy.cfg
defaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
option prefer-last-server
retries 2
option redispatch
timeout connect 5s
timeout server 5s
stats uri /admin/stats
.........................................................
# The public 'www' address in the DMZ
frontend public
bind *:80 name clear
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
default_backend static
........................................................
# The static backend backend for 'Host: img', /img and /css.
backend static
balance roundrobin
server web1 172.25.40.2:80 check inter 1000
server web2 172.25.40.3:80 check inter 1000
开启server2 server3http服务 端口80
测试:1.物理机 curl 172.25.40.1,实现负载均衡
2.浏览器输入网址:172.25.40.1/admin/stats/ ,可查看其stats状态页
自定义用户密码(编辑配置文件)
创建指定日志文件
vim /etc/rsyslog.conf
# Provides UDP syslog reception(使UDP端口接收生效)
$ModLoad imudp
$UDPServerRun 514
*.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages (/var/log/messages下不保存)
local0.* /var/log/haproxy.log
/etc/init.d/rsyslog restart #重启日志
acl列表(编辑haproxy配置文件)
1).建立acl黑名单,指定ip
acl blacklist src 172.25.40.250
http-request deny if blacklist
测试403报错
2).错误重定向,这里更改配置文件将错误重定向到本机的apache服务默认发布目录里的写入内容(记得将httpd的端口改为8080避免和haproxy服务冲突将403报错给客户没实际作用)
acl blacklist src 172.25.40.250
http-request deny if blacklist
errorloc 403 http://172.25.40.1:8080/index.html
3)指定ip重定向
acl blacklist src 172.25.40.4
redirect location http://172.25.40.1:8080/index.html if blacklist
实现动静分离
server3安装php 编辑动态页面 完成后restart httpd服务
vim index.php
phpinfo()
?>
编辑haproxy配置文件
use_backend dynamic if { path_end .php }
..........................................................
# The static backend backend for 'Host: img', /img and /css.
backend static
balance roundrobin
#balance source
server web1 172.25.40.2:80 check inter 1000
#the application servers go here
backend dynamic
balance roundrobin
#balance source
server web2 172.25.40.3:80 check inter 1000
动态访问server3,静态访问server2
实现读写分离
server2 server3 编写php文件如下
cd /var/www/html/
cd upload/
mv * ..
chmod 777 upload
vim upload_file.php
if ((($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 2000000000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "
";
echo "Type: " . $_FILES["file"]["type"] . "
";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
";
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";
}
?>
修改haproxy配置文件
acl read method GET
acl read method HEAD
acl write method POST
acl write method PUT
use_backend dynamic if write
测试:
server3实现写 图片实际保存在server3上 读的时候访问的是server2;server3查看可以看到图片保存在server3上;实现读写分离
paceaker