HAproxy
HAProxy 提供高可用性、负载均衡以及基于 TCP(第四层) 和 HTTP(第七层) 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点, 这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整 合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。
四层是传输层:负载均衡效率高(lvs)
HAproxy支持:访问控制、高可用、负载均衡、反向代理、动静分离、读写分离
实验前先了解一些知识:
- 四层是传输层:负载均衡效率高(lvs)
- 七层是应用层:负载软件(haproxy,apache,ngnix)
- 反向代理:反向代理其实就是客户端去访问服务器时,他并不知道会访问哪一台,感觉就是客户端访问了Proxy一样,而实则就是当proxy关口拿到用户请求的时候会转发到代理服务器中的随机(算法)某一台。而在用户看来,他只是访问了Proxy服务器而已,典型的例子就是负载均衡了。
- 正向代理:正向代理通过上面的图理解其实就是用户想从服务器拿资源数据,但是只能通过proxy服务器才能拿到,所以用户A只能去访问proxy服务器然后通过proxy服务器去服务器B拿数据,这种情况用户是明确知道你要访问的是谁,在我们生活中最典型的案例就是“翻墙“了,也是通过访问代理服务器最后访问外网的。
- 源码安装和rpm安装区别?
- 源码安装的好处如下:最大的好处就是可以自行调整编译参数,最大化地定制安装结果。源码安装可以选择最新的软件包,而Linux系统(包括FreeBSD)自带的软件包一般都是最稳定的版本,但不能保证是最新的。相对而言,源码安装的性能是最优异的。源码包安装的软件卸载时极为方便和简单,更重要的是,它比较安全,尤其是对线上的生产环境而言。迁徙也比较方便,如果不涉及系统库文件,复制到另一台机器上也可以使用。
- rpm是安装本地存在的rpm包,如果存在依赖也需要安装上,如果某个rpm是自己修改编译的,那么只能用rpm安装了
实验环境
- rhel6.5
主机名 | IP |
---|---|
server1 | 172.25.60.1 |
server2 | 172.25.60.2 |
server3 | 172.25.60.3 |
foundation60 | 172.25.60.250 |
HAproxy 负载均衡环境配置
实验前先将上个实验配置的删除:删除共享磁盘时: 先删除逻辑卷,再删除逻辑组,然后删除共享的磁盘,最后删除被共享的硬盘
当删除集群时, 要一步一步从小到大删除,先删除服务,再删除节点,最后删除集群.可以通过ps ax 查看进程,看是否删除
- 先下载安装包,并解压(最好下载到家目录下,因为后面,编译后生成的目录会生成到家目录下)
- 进入到该文件后,查看以下有没有spec文件,有这个文件才可以打成rpm包
- 安装rpm-build :
[root@server1 haproxy-1.7.3]# yum install rpm-build -y
- 安装c语言调试工具gcc:
[root@server1 haproxy-1.7.3]# yum install gcc -y
- 安装 pcre:
[root@server1 ~]# yum install pcre-devel -y
- 打包成rpm包:
[root@server1 ~]# rpmbuild -tb haproxy-1.7.3.tar.gz
- 这时会在加目录下生成rpmbuild/,进入到该文件的RPMS/ x86_64/
- 安装haproxy
- 将 haproxy-1.7.3/examples/下的配置文件拷贝到/etc/haproxy下,并重命名位haproxy.cfg
- 修改配置文件:
cd /etc/haproxy/---> vim haproxy.cfg
global ##全局定义
maxconn 10000 ##最大连接数
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 ##本机日志
uid 200 ##haproxy用户的uid
gid 200 ##haproxy用户的gid
chroot /var/empty
daemon
defaults ##默认条件
mode http ##默认使用http的7层模式 tcp:4层
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
frontend public
bind *:80 name clear ##监听端口
default_backend dynamic ##使用默认static服务器集群
backend dynamic
balance roundrobin ##负载均衡算法(轮循)
server web1 172.25.60.2:80 check inter 1000 ##后端服务器server2
server web2 172.25.60.3:80 check inter 1000 ##后端服务器server3
- 开启服务:
/etc/init.d/haproxy start
- 在server2和server3上安装并编写测试页面,开启httpd
- 测试:在foundation60上测试,会发现轮循
- 编辑配置文件,设置stats状态页面、密码、刷新时间,编辑完配置文件要重启服务
- stats状态页:
stats uri /admin/stats
- 用户密码:
stats auth admin:westos
- 刷新时间(每5秒刷新一次):
stats refresh 5s
HAproxy 访问控制
- 创建指定日志存放目录
- 修改日志服务配置文件,从而修改日志的存储位置
*.info : 高级别的日志
local : 自定义日志
[root@server1 haproxy]# vim /etc/rsyslog.conf
- 重启服务后测试
- 访问控制(黑名单)
- 编辑配置文件,将250放进黑名单
- 重启haproxy
- 测试:
- 错误重定向:这里将错误重定向到本机的apache服务默认发布目录的内容
- 要将httpd端口更改为8080,避免和haproxy服务冲突
[root@server1 html]# vim /etc/httpd//conf/httpd.conf
- 给server1安装apache并编写默认发布页面
- 重启haproxy和httpd服务
- 测试: 物理机浏览器访问
HAproxy的动静分离
- 给server3安装php,编辑动态页面,并重启httpd
[root@server3 ~]# yum install php -y
- server2作为静态,访问apache默认页面
- 编辑配置文件:如果访问以.php 结尾的,就访问server3(动态页面);静态(默认)访问server2
- 重启haproxy
- 测试
- 默认访问:172.25.60.1
- 以 .php 结尾:172.25.60.1/index.php
HAproxy的读写分离
- 编辑haproxy配置文件,如果有写操作,就访问动态页面(server3)
- 重启haproxy
- 在server3将静态页面(index.php)和动态页面(upload_file.php)存放在apache的默认发布目录中
- 在静态页面中,修改以下(和server2的静态页面作对比)
- 在动态页面中修改上传东西的上限
- 在server2上安装php
- 将静态页面(index.php)和动态页面(upload_file.php)存放在apache的默认发布目录中。并重启httpd
- 测试:在浏览器上访问server1的IP(默认访问的是server3的页面)
- 点击Browse选择图片后Submit上传
- 会发现保存到server2,而server3没有