什么是haproxy?
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理,HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
使用haproxy实现负载均衡
前提:准备3台虚拟机,一台服务器作为负载均衡调度器,另外两台作为真实服务器。
调度器:
server1 ip:172.25.62.1
服务器:
server2 ip:172.25.62.2
server3 ip:172.25.62.3
首先在调度器server1上进行配置:
1.获取haproxy安装包
2.解压
tar zxf haproxy-1.7.3.tar.gz
解压完成会生成一个haproxy-1.7.3目录
3.安装haproxy
yum install rpm-build pcre-devel gcc -y
这里我使用rpm包安装,安装需要的软件。
rpmbuild -tb haproxy-1.7.3.tar.gz
使用这个命令制作rpm包,会生成一个rpmbuild目录。
cd rpmbuild/RPMS/x86_64/
yum install haproxy-1.7.3-1.x86_64.rpm -y
进入目录安装软件。
cd haproxy-1.7.3/examples/
cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg
进入目录,复制配置文件到/etc/haproxy下命名为haproxy.cfg。
4.添加用户
groupadd -g 200 haproxy
useradd -u 200 -g 200 haproxy
5.修改配置文件
vim /etc/hosts
做本地解析。
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
gid 200
chroot /var/empty
daemon
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
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
stats uri /admin/stats
#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
server web1 172.25.62.2:80 check inter 1000
server web2 172.25.62.3:80 check inter 1000
修改完配置文件后就可以启动服务了。
/etc/init.d/haproxy start
6.配置服务器server2和server3。
yum install -y httpd
vim /var/www/html/index.html
在这两台服务器安装httpd,编写测试页。
测试:
使用另一台主机进行测试
curl 172.25.62.1
访问调度服务器,实现轮循。
可以在浏览器查看后台服务器的负载
每次刷新页面,负载都会发生变化。
设置页面帐号和密码
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
stats uri /admin/stats #监控页面的地址
stats auth admin:redhat #帐号和密码
stats refresh 5s #刷新频率
设置完密码后,进入页面要输入密码。
url的重定向
302:重定向(临时)旧地址依旧在,但网站希望你访问新的(盗链)
301:重定向(永久)旧地址永久移除
403:服务器将IP禁止
[root@server1 ~]# vim /etc/rsyslog.conf
设置haproxy的日志级别。
[root@server1 ~]# /etc/init.d/rsyslog restart
重启日志服务,使设定生效。
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
修改配置文件,其他设定不变。
[root@server1 ~]# /etc/init.d/haproxy restart
重启服务。
在浏览器输入
出现403报错,接下来要做的就是当出现这个报错时进行重定向。
[root@server1 ~]# vim /var/www/html/index.html
编写测试页。
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
修改端口。
[root@server1 ~]# /etc/init.d/httpd restart
重启htppd服务。
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
修改文件将403重定向。
[root@server1 ~]# /etc/init.d/haproxy restart
重启服务。
在浏览器上进行测试
页面重定向成功。
haproxy的动静分离
动静分离是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
use_backend dynamic if { path_end .php }
default_backend static
# The static backend backend for 'Host: img', /img and /css.
backend static
balance roundrobin
server web1 172.25.62.3:80 check inter 1000
backend dynamic
balance roundrobin
server web2 172.25.62.2:80 check inter 1000
设置当默认静态,当访问动态是访问php页面。当静态时,访问web1服务器,当访问动态时,访问web服务器。
[root@server2 ~]# yum install -y php
[root@server2 ~]# vim /var/www/html/index.php
在server2下载php,并编写测试页,之后打开server3的httpd服务。
测试:
在浏览器输入:
172.25.62.1/index.php
172.25.62.1/index.html
这样,可以做到访问动静网页时分别访问不同的服务器。
haproxy的读写分离
顾名思义,读写分离就是准备两台服务器,一台用来读数据,一台用来写数据。
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
设置在web1写数据,在web2写数据。