一、haproxy的简介
HAProxy是一个使用C语言编写的*及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
二、haproxy实现负载均衡
1、解压haproxy安装包,生成rpm包
cd
tar zxf haproxy-1.7.3.tar.gz
ls
cd haproxy-1.7.3
ls
yum install -y rpm-build ##生成rpm包所需要的工具
rpmbuild -tb haproxy-1.7.3.tar.gz ##生成rpm包
2、haproxy的安装
cd rpmbuild/RPMS/x86_64/
ls
rpm -ivh haproxy-1.7.3-1.x86_64.rpm
3、查询
rpm -qa | grep haproxy
rpm -ql | grep haproxy
rpm -ql haproxy-1.7.3-1.x86_64
4、复制配置文件,修改名称
cd
cd haproxy-1.7.3/examples/
cp content-sw-sample.cfg /etc/haproxy/
cd /etc/haproxy/
ls
mv content-sw-sample.cfg haproxy.cfg
ls
5、添加haproxy用户
useradd -s /sbin/nologin -M haproxy
vim /etc/passwd
haproxy:x:200:200::/home/haproxy:/sbin/nologin
vim /etc/group
haproxy:x:200:
[root@server1 x86_64]# id haproxy
uid=200(haproxy) gid=200(haproxy) groups=200(haproxy)
6、修改配置文件
vim /etc/haproxy/haproxy.cfg
修改如下
#
# This is a sample configuration. It illustrates how to separate static objects
# traffic from dynamic traffic, and how to dynamically regulate the server load.
#
# It listens on 192.168.1.10:80, and directs all requests for Host 'img' or
# URIs starting with /img or /css to a dedicated group of servers. URIs
# starting with /admin/stats deliver the stats page.
#
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 ##对所有的IP进行操作
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#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 dynsrv1 172.25.38.2:80 check inter 1000
server dynsrv2 172.25.38.3:80 check inter 1000
7、启动haproxy,查看端口号
/etc/init.d/haproxy start
netstat -tlnp ##默认端口为80,与httpd冲突,如果使用httpd,需要修改端口为8080
结果
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1806/haproxy
测试:外部机器
server2和server2的apache服务开启
[root@foundation38 kiosk]# curl 172.25.38.1
server3
[root@foundation38 kiosk]# curl 172.25.38.1
<h2>server2</h2>
访问http://172.25.38.1/monitoruri
访问http://172.25.38.1/admin/stats ##监控页面
8、修改监控参数
vim /etc/haproxy/haproxy.cfg
34 stats auth admin:westos ##添加用户名和密码
35
36 stats refresh 5s ##每5秒刷线一次
/etc/init.d/haproxy reload
三、给haproxy添加日志
1、查看haproxy的配置文件,查看日志位置
vim /etc/haproxy/haproxy.cfg
log 127.0.0.1 local0
2、编辑日志配置文件
vim /etc/rsyslog.conf
63 local0.* /var/log/haproxy.log
##日志目录
13 $ModLoad imudp 打开端口
14 $UDPServerRun 514
3、重启日志服务
/etc/init.d/rsyslog restart
测试:重启haproxy并查看日志
/etc/init.d/haproxy restart
cat /var/log/haproxy.log
结果
Feb 19 17:27:08 localhost haproxy[1859]: Proxy dynamic stopped (FE: 0 conns, BE: 0 conns).
Feb 19 17:27:08 localhost haproxy[1884]: Proxy public started.
Feb 19 17:27:08 localhost haproxy[1884]: Proxy dynamic started.
四、haproxy添加访问控制
1、编辑haproxy配置文件,并加载
vim /etc/haproxy/haproxy.cfg
44
45 acl blacklist src 172.25.38.250 ##黑名单
46
47 http-request deny if blacklist
48
49 default_backend dynamic ##默认访问dynamic的回应
50
51
/etc/init.d/haproxy reload
测试:
1、使用172.25.38.2访问,可以访问
[root@server2 bin]# curl 172.25.38.1
<h2>server2</h2>
[root@server2 bin]# curl 172.25.38.1
server3
2、使用172.25.38.250访问,被禁止
[root@foundation38 kiosk]# curl 172.25.38.1
<html><body><h1>403 Forbidden</h1>
Request forbidden by administrative rules.
</body></html>
2、添加被禁止后访问的页面
vim /etc/haproxy/haproxy.cfg
45 acl blacklist src 172.25.38.250
46
47 http-request deny if blacklist
48
49 errorloc 403 http://172.25.38.1:8080/index.html ##错误后,访问本地
50
51 default_backend dynamic
###redirect location http://172.25.0.1:8080/index.html if blackist
/etc/init.d/haproxy reload
3、server1,开启apache服务,并修改默认发布目录
vim /etc/httpd/conf/httpd.conf ##修改端口为8080
136 Listen 8080
vim /var/www/html/index.html
您已经被拉黑
/etc/init.d/httpd start
测试
[root@foundation38 kiosk]# curl 172.25.38.1:8080
您已经被拉黑
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
五、haproxy动静分离
使得动态页面和静态页面分离开。本实验,默认静态页面,只有以.php结尾访问会进入动态页面
server2为静态页面,server3为动态页面
1、编写haproxy的配置文件,并重新加载
vim /etc/haproxy/haproxy.cfg
修改如下
acl blacklist src 172.25.38.44 ##黑名单
http-request deny if blacklist
errorloc 403 http://172.25.38.1:8080/index.html ##黑名单访问
use_backend dynamic if { path_end .php } ##如果以.php结尾访问,显示动态界面
default_backend static ##默认静态
# the application servers go here
backend static ##server2为静态
balance roundrobin
server dynsrv1 172.25.38.2:80 check inter 1000
backend dynamic ##server1为动态
balance roundrobin
server dynsrv2 172.25.38.3:80 check inter 1000
/etc/init.d/haproxy reload ##重新加载
2、server3安装php,并编写默认发布目录,完成后,重启apache
yum install -y php
vim /var/www/html/index.php
编写如下
<?php
phpinfo()
?>
/etc/init.d/httpd restart
测试
访问http://172.25.38.1,显示结果为server2的静态界面
访问http://172.25.38.1/index.php,显示结果为server3的动态界面
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
六、haproxy读写分离
读取数据和写入数据在不同的服务器实现(一般写的服务器为高性能服务器),server2为写的服务器,server3为读服务器。
1、下载上传页面(upload),放到server2和server3的apache目录下
(外部主机)scp -r upload root@172.25.38.2:/var/www/html/
server2
cd /var/www/html/upload/
mv * ..
cd ..
ls
chmod 777 upload ##修改权限使得,可以上传文件
scp -rp upload upload_file.php index.php root@172.25.38.3:/var/www/html/ ##复制到server3
2、修改server1的haproxy的配置文件,并加载
vim /etc/haproxy/haproxy.cfg
编辑如下
acl blacklist src 172.25.38.44
acl write method POST ##重定向,write为 POST和PUT
acl write method PUT
#http-request deny if blacklist
#errorloc 403 http://172.25.38.1:8080/index.html
use_backend static if write ##如果写就访问static(server2)
default_backend dynamic ##默认访问dynamic(server3)
# the application servers go here
backend static
balance roundrobin
server dynsrv1 172.25.38.2:80 check inter 1000
backend dynamic
balance roundrobin
server dynsrv2 172.25.38.3:80 check inter 1000
/etc/init.d/haproxy reload
3、server2和server3都必须安装php,安装完后需要重新启动apache
yum install -y php
/etc/init.d/httpd restart
4、修改server2和server3的文件上传大小
vim /var/www/html/upload_file.php
修改如下
5 && ($_FILES["file"]["size"] < 2000000))
测试:
访问:http://172.25.38.1/
上传文件成功后,在server2查看文件存在
Upload: redhat.jpg
Type: image/jpeg
Size: 52.8876953125 Kb
Temp file: /tmp/phpsVEI3I
Stored in: upload/redhat.jpg
[root@server2 upload]# ls
redhat.jpg
5、安装一个虚拟服务器server4
6、复制server1,haproxy的rpm包到server4
cd rpmbuild/RPMS/x86_64/
ls
scp haproxy-1.7.3-1.x86_64.rpm root@172.25.38.4:
7、server4安装haproxy,httpd(别写发布目录),添加haproxy用户
rpm -ivh haproxy-1.7.3-1.x86_64.rpm
yum install -y httpd
vim /var/www/html/index.html
/etc/init.d/httpd start
groupadd -g 200 haproxy
useradd -u 200 -g 200 -s /sbin/nologin -M haproxy
8、server1给server4发送配置文件
scp /etc/haproxy/haproxy.cfg root@172.25.38.4:/etc/haproxy/
9、server4开启服务,首先修改http的端口为8080(因为haproxy的端口为80)
vim /etc/httpd/conf/httpd.conf
136 Listen 8080
/etc/init.d/httpd restart
/etc/init.d/haproxy start
10、编辑haproxy的配置文件,并加载
vim /etc/haproxy/haproxy.cfg
修改如下
acl blacklist src 172.25.38.44
acl read method PUT ##重定向 read为PUT和HEAD
acl read method HEAD
#http-request deny if blacklist
#errorloc 403 http://172.25.38.1:8080/index.html
use_backend dynamic if read ##如果read,那么访问server3(dynamic)
default_backend static ##默认访问static(server2)
# the application servers go here
backend static
balance roundrobin
server dynsrv1 172.25.38.2:80 check inter 1000
backend dynamic
balance roundrobin
server dynsrv2 172.25.38.3:80 check inter 1000
/etc/init.d/haproxy reload
测试:
访问 172.25.38.4
上传文件成功后,在server2查看文件存在
Upload: redhat.jpg
Type: image/jpeg
Size: 52.8876953125 Kb
Temp file: /tmp/phpsVEI3I
Stored in: upload/redhat.jpg
[root@server2 upload]# ls
redhat.jpg