一.Haproxy简介
1.定义
(1)Haproxy是一个使用C语言编写的自由以及开放的源代软件,其提供高性能,负载均衡,以及基于TCP和HTTP应用程序代理。相较于Nginx,HAProxy更专注于反向代理,因此它可以支持更多的选项,更精细的控制,更多的健康检测机制的负载均衡算法。
(2)HAProxy特别适用于那些负载特别大的web站点,这些站点通常又需要会话保持或者七层处理,HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。
(2)HAProxy的运行模式使得它可以很简单安全的整合进当前的架构中,同时可以保护后台的web服务器不被暴露到网络上。
二.模拟HAProxy:apache的反向代理+负载均衡的实现
1.实验环境的搭建
创建rhel6.5版本的虚拟机base作为母盘,建立快照vm1,vm2,vm3(详情请参考博文:母盘的创建6.5)
rhel6.5 selinux and iptables disabled
主机名 | IP | 服务 |
---|---|---|
hetoto1 | 172.25.12.1 | haproxy |
hetoto2 | 172.25.12.2 | apache |
hetoto3 | 172.25.12.3 | apache |
物理机 | 172.25.12.250 | 测试 |
2.配置过程
- Makefile:原码编译时把一些所有的项目写好后,configue会生成该文件,有Makefile就有make && make
install - rpm:安装包安装在安装好以后会把配置文件的路径打乱
- 原码编译:可以直接指定下载婉称后位呢加的放置路径
- gdb:C语言的调制工具
(1)官网下载安装包(本次实验已有安装包直接将安装包scp的hetoto1上即可)
http://download.openpkg.org/components/cache/haproxy/
(2)安装包的解压
注意:find -name *.spec查看时如果图上所显示的文件存在表示可以用原码软件包安装,本次实验是将其重新做成rpm包再进行安装配置文件会生成再/etc/haproxy目录但是目录里面没有配置源文件,需要自己添加
(3)安装源码编译软件,源码编译HAproxy软件
a.安装该软件安装过程中的需要的安装包,解决其安装过程中的依赖性,否则会显示编译失败(安装打包工具及其编译工具)
[root@hetoto1 haproxy-1.7.3]# yum install -y rpm-build pcre-devel gcc
b.生成rpm包
[root@hetoto1 ~]# rpmbuild -tb haproxy-1.7.3.tar.gz
c.会生成rpmbuild目录(安装包所在的目录)该目录下的子目录中有生成的安装包
[root@hetoto1 ~]# cd /root/rpmbuild/RPMS/x86_64/
[root@hetoto1 x86_64]# ls
[root@hetoto1 x86_64]# rpm -ivh haproxy-1.7.3-1.x86_64.rpm
(4)建立haproxy用户和组,利用linux对haproxy用户的访问控制实现对haproxy的服务的控制
[root@hetoto1 x86_64]# groupadd -g 200 haproxy
[root@hetoto1 x86_64]# useradd -u 200 -g 200 -M haproxy
[root@hetoto1 x86_64]# id haproxy
(5)找到haproxy的配置文件,并复制到/etc/haproxy的目录下
(6)编辑配置文件
配置文件的编辑内容及详解如下:
10 global ##全局定义
11 maxconn 10000 #最大连接数
12 stats socket /var/run/haproxy.stat mode 600 level admin
13 log 127.0.0.1 local0 #本机日志
14 uid 200 #haproxy用户的uid
15 gid 200 #haproxy的gid
16 chroot /var/empty
17 daemon
18
19 defaults #默认条件
20 mode http #默认使用http的7层模式 tcp:4层
21
22
23 log global
24 option httplog
25 option dontlognull
26 monitor-uri /monitoruri
27 maxconn 8000
28 timeout client 30s
29
30 stats uri /admin/stats
31 option prefer-last-server
32 retries 2
33 option redispatch
34 timeout connect 5s
35 timeout server 5s
36
37 frontend public
38 bind *:80 name clear #监听所有服务端口
39 # bind 192.168.1.10:443 ssl crt/etc/haproxy/haproxy.pem
40 # use_backend static if { hdr_beg(host) -i img }
41 # use_backend static if { path_beg/img/css }
42
43 default_backend static #默认实用static后端服务器集群
44
45 #The static backend backend for 'Host:img',/img and /css.
46
47 backend static
48 balance roundrobin #负载均衡算法
49 server statsrv1 172.25.12.2:80 check inter 1000 #后端服务器hetoto2
50 server statsrv2 172.25.12.3:80 check inter 1000 #后端服务器hetoto3
(7)打开haproxy服务
[root@hetoto1 haproxy]# /etc/init.d/haproxy start
3.测试如下:
在hetoto2和hetoto3上安装httpd,并开启httpd服务,编写默认发布内容
[root@hetoto2 ~]# yum install -y httpd
[root@hetoto2 ~]# cd /var/www/html
[root@hetoto2 html]# vim index.tml
[root@hetoto2 html]# cat index.tml
server2
[root@hetoto2 html]# /etc/init.d/httpd start
[root@hetoto3 ~]# yum install -y httpd
[root@hetoto3 ~]# cd /var/www/html
[root@hetoto3 html]# ls
[root@hetoto3 html]# vim index.html
[root@hetoto3 html]# cat index.html
server3
[root@hetoto3 html]# /etc/init.d/httpd start
- 在物理机端测试haproxy服务主机(hetoto1)发现在hetoto2和hetoto3上轮询
- http://172.25.12.1/monitoruri ##检查服务是否有误
- http://172.25.12.1/admin/stats #看其stats网页状态
三.HAProxy的其它配置
1.定义用户密码及其刷新次数
- 编辑haproxy的配置文件,添加如下内容
- 重启服务
- 测试:再stats网页可以看到每隔5s就会刷新一次,刷新页面会显示输入密码
基于TCP和HTTP的应用程序代理
创建日志指定存放路径
- 编辑日志服务的配置文件
文件编辑内容如下:
45 acl blacklist src 172.25.12.250
46 http-request deny if blacklist
47 errorloc 403 http://172.25.12.1:8080/index.html
- 重启日志服务
[root@hetoto1 haproxy]# /etc/init.d/haproxy restart
- 测试:
再haproxy日志中查看到haproxy更新内容显示为设置的每5s更新一次
添加访问控制
- 编辑配置文件
vim haproxy.cfg
- 文件添加内容如下:
- 重新启动haproxy服务
/tec/init.d/haproxy restart
在hetoto1上配置失败回切
a.下载httpd服务
[root@hetoto1 haproxy]# yum install -y httpd
b.修改httpd的默认发不端口因为80已经被haproxy占用
[root@hetoto1 haproxy]# vim /etc/httpd/conf/httpd.conf
Listen 8080
- 编写默认发布的内容
- 重启服务
[root@hetoto1 html]# /etc/init.d/httpd start
[root@hetoto1 html]# /etc/init.d/httpd restart
- 测试:
在物理机
动态页面和静态页面的分离
- 在hetoto3上安装php,编辑动态页面,完成后重启服务
[root@hetoto3 html]# yum install -y php
- 在hetoto1上编辑haproxy的配置文件
- 重启服务
- 测试:
浏览器页面:
默认访问hetoto2页面
设置访问hetoto3的动态页面
读写分离
-
hetoto1上编辑配置文件,如果有写入操作,访问的是动态hetoto3主机
-
文件编辑内容如下:
-
重启服务
此配置文件的目的为:默认进入web2的发布页面,也就是web2为读的服务器,write时为static服务,也就是web1写服务器,实现网页的读写分离。 -
在hetoto3的默认发布目录下,有index.php(选择图片的静态页面)和uoload_file.php(上传图片的动态页面)存放图片的目录是uoload目录
-
给文件和目录添加相应的权限以便进行操作
-
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文件内容:(上传图片的动态页面)
<?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";
}
?>
- 修改上传文件的大小限制
- 将编辑好的文件scp到hetoto2上
- 在hetoto2上安装php,并重启httpd
- hetoto3上开启httpd服务
- 测试: 在浏览器输入: http://172.25.12.1/index.php 显示以下界面:
- 点击Browse上传一个图片
- 上传成功显示如下:
- 在hetoto2上查看可以看到上传的图片传到了hetoto2上
- 在hetoto3上查看发现没有