HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
(1)解压haproxy压缩包,安装源码编译软件,源码编译haproxy软件
[root@server2 ~]#yum install -y rpm-build #源码编译软件
[root@server2 ~]#rpmbuild -tb haproxy-1.6.11.tar.gz (可能回报错,因为没有安装依赖包prce-devel)
[root@server2 ~]#yum install pcre-devel -y
[root@server2 ~]#cd rpmbuild/RPMS/x86_64
[root@server2 x86_64]#rpm -qpl haproxy-1.6.11-1.x86_64.rpm
[root@server2 x86_64]# rpm -ivh haproxy-1.6.11-1.x86_64.rpm #安装haproxy
[root@server2 x86_64]#cd ~
[root@server2 ~]# tar zxf haproxy-1.6.11.tar.gz
(2)更改文件名字,因为haproxy启动脚本中读取的配置文件时/etc/haproxy/haproxy.cfg
[root@server2 ~]# cd haproxy-1.6.11/examples/
[root@server2examples]#cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg
[root@server2 examples]# cd /etc/haproxy/
(3)建立haproxy用户和组
[root@server2 haproxy]# grep 20 /etc/passwd
[root@server2 haproxy]# groupadd -g 200 haproxy
[root@server2 haproxy]# useradd -u 200 -g 200 -M haproxy
[root@server2 haproxy]# id haproxy
uid=200(haproxy) gid=200(haproxy) groups=200(haproxy)
[root@server2 haproxy]# vim /etc/security/limits.conf
文件末尾添加:haproxy - nofile 10000
HAProxy配置中分五大部分:
global:全局配置参数,进程级的,用来控制Haproxy启动前的一些进程及系统设置
defaults:配置一些默认的参数,可以被frontend,backend,listen段继承使用
frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理
backend:定义后端服务器集群,以及对后端服务器的一些权重、队列、连接数等选项的设置,我将其理解为Nginx中的upstream块
listen:我将其理解为frontend和backend
配置文件更改如下:vim /etc/haproxy/haproxy.cfg
global
maxconn 10000 #默认最大连接数
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 #本机日志
uid 200 #所属运行的用户uid
gid 200 #所属运行的用户组
chroot /var/empty #chroot运行的路径
Daemon #以后台形式运行haproxy
Defaults #默认的全局设置
retries 2 #3次连接失败就认为服务不可用,也可以通过后面设置
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
timeout connect 5s #连接超时
timeout server 30s #服务器超时
timeout queue 30s
option httpchk HEAD /login.php
mode http #所处理的类别(7层 http;4层tcp)
log global
option httplog #日志类别http日志格式
option dontlognull #不记录健康检查的日志信息
monitor-uri /monitoruri
maxconn 8000 #最大连接数
timeout client 30s #客户端超时
stats uri /admin/stats
# The public 'www' address in the DMZ
frontend public
bind 172.25.66.2:80 name clear #监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
default_backend dynamic
# the application servers go here
backend dynamic
balance roundrobin # 负载均衡算法rr
server dynsrv1 172.25.66.3:80 check inter 1000 # 后端服务器server3
server dynsrv2 172.25.66.4:80 check inter 1000 # 后端服务器server4
打开server2的haproxy服务,打开server3和server4的httpd,还要记得在server2中关闭httpd服务
[root@server2 haproxy]# /etc/init.d/haproxy start ##打开服务
在server2和server3中分别打开httpd
[root@server3 ~]# /etc/init.d/httpd start
健康检查:
监控:
当server3和server4上的服务是开着的,会出现绿色的界面
当server3服务关闭之后,会出现红色
操作步骤:
[root@server2 ~]# cd /var/log
[root@server1 log]# vim /etc/rsyslog.conf
[root@server1 log]# /etc/init.d/rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
[root@server2 log]# /etc/init.d/haproxy restart
Stopping haproxy: [ OK ]
Starting haproxy: [ OK ]
[root@server2 log]# cat haproxy.log
Oct 2 00:11:44 localhost haproxy[2044]: 172.25.66.250:35166 [02/Oct/2018:00:11:44.128] public public/ 0/-1/-1/-1/0 200 15625 - - PR-- 0/0/0/0/0 0/0 "GET /admin/stats HTTP/1.1"
Oct 2 00:12:14 localhost haproxy[2044]: 172.25.66.250:35170 [02/Oct/2018:00:12:14.183] public public/ 0/-1/-1/-1/0 200 15641 - - PR-- 0/0/0/0/0 0/0 "GET /admin/stats HTTP/1.1"
acl blacklist src 172.25.66.250
http-request deny if blacklist
errorloc 403 http://172.25.66.2:8080/index.html
acl blacklist src 172.25.14.250 ##重定向
redirect location http://172.25.14.1:8080/index.html if blacklist
35 frontend public
36 bind *:80 name clear
42 use_backend dynamic if { path_end -i *.php }
43 default_backend dynamic
44
45 # the application servers go here
46 backend dynamic
47 balance roundrobin
48 server dynsrv1 172.25.66.3:80 check inter 1000
49 backend static
50 balance roundrobin
51 server dynsrv2 172.25.66.4:80 check inter 1000
默认是动态,在动态ip(172.25.66.3)上写入/var/www/html/index.php
35 frontend public
36 bind *:80 name clear
37
38 acl write method POST
39 acl write method put
45 use_backend dynamic if write
46 default_backend static
[root@server2 haproxy]# /etc/init.d/haproxy reload
index.php:
upload_file.php:
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"; # 不符合上传条件显示Invalid file
}
?>