以下操作基于rhel6.5
.HAproxy 详细介绍
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
下图是HAProxy的架构:
下图是HAProxy的监控页面截图:
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
一.安装
下面介绍三种方式安装haproxy:
方式一:yum install -y haproxy.x86_64
方式二:
下载压缩包haproxy-1.6.11.tar.gz
tar zxf haproxy-1.6.11.tar.gz
进入解压目录
less README #查看文档来安装
make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy #编译
make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy install #安装
#找到配置文件模板
cp /root/haproxy-1.6.11/examples/content-sw-sample.cfg /etc/haproxy/
cd /etc/haproxy
mv content-sw-sample.cfg haproxy.cfg
方式三:
cp /root/haproxy-1.6.11.tar.gz /root/rpmbuild/SOURCES
cd /root/haproxy-1.6.11/examples/
rpmbuild -bb haproxy.spec
cd rpmbuild/RPMS/x86_64/
[root@server1 x86_64]# ls
haproxy-1.6.11-1.x86_64.rpm
rpm -ivh haproxy-1.6.11-1.x86_64.rpm
#和上面一样获取配置文件
cat /etc/sysconfig/network #查看network是否为yes
修改配置文件如下:
global #全参数的设置
maxconn 65535 #设置最大连接数
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 #全局的日志配置
uid 200
gid 200
chroot /var/empty #改变当前的工作目录
daemon #以守护进程的方式运行haproxy
defaults
mode http #默认的模式(tcp/http/health),tcp是四层,http是7层,health只会返回ok
log global #应用全局的日志配置
option httplog #应用日志记录http请求,默认haproxy不会记录http请求日志
option dontlognull#启用该项,日志将不会记录空连接
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
bind 172.25.50.100:80 name clear #监听主机和端口
acl bad src 172.25.50.250
acl read method GET
acl read method HEAD
acl write method PUT
acl write method POST
#http-request deny if bad
#errorloc 403 http://172.25.50.4:80
#redirect location http://172.25.50.4:80
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
#use_backend dynamic if { path_end .php }
#use_backend dynamic if { path_beg /images }
use_backend static if write
default_backend dynamic
# The static backend backend for 'Host: img', /img and /css.
backend dynamic
balance roundrobin
server web1 172.25.50.2:80 check inter 1000
server web2 172.25.50.3:80 check inter 1000
根据配置文件需要设置haproxy的最大并发链接数:
和nginx相同,从三个层面设置:
内核层面:
[root@server1 haproxy]# sysctl -a | grep file
fs.file-nr = 544 0 188465
fs.file-max = 188465 #此处内核所支持的最大连接数已满足
如果不满足需要修改配置文件:
vim /etc/sysctl.conf
7 net.ipv4.ip_forward = 1 #开启内核路由功能
系统层面:
vim /etc/security/limits.conf #最后一行添加
haproxy - nofile 65535
应用层面:
vim /etc/haproxy/haproxy.cfg
最大连接设置为65535
三.配置负载均衡
在配置文件中:
default_backend dynamic
# The static backend backend for 'Host: img', /img and /css.
backend dynamic
balance roundrobin
server web1 172.25.50.2:80 check inter 1000
server web2 172.25.50.3:80 check inter 1000
测试:
server2和server3上均开启apache服务:浏览器访问ip即可看到默认发布目录下的页面内容且以轮询的方式访问server2和server3!
在浏览器查看后端主机的情况并添加访问控制:
vim /etc/haproxy/haproxy.cfg
添加内容如下:
/etc/init.d/haproxy restart
在浏览器访问 172.25.50.1/admin/stats 可以看到需要用户名和密码登陆!
登陆后可以通过图形界面查看后端主机的健康状况。
四.日志配置
vim /etc/rsyslog.conf
13 $ModLoad imudp
14 $UDPServerRun 514
42*.info;mail.none;authpriv.none;cron.none;local0.none; /var/log/mes sages
62 local0.* /var/log/haproxy.log
/etc/init.d/rsyslog restart
日志查看:tail -f /var/log/haproxy.log
五.添加访问控制
vim /etc/haproxy.cfg
172.25.254.50主机在浏览器端就不能访问:172.25.50.1了
所以对限制访问的主机添加提示页面:错误访问时重定向:
如果遇见403的错误代码就重定向
[root@server1 haproxy]# vim /var/www/html/index.html
error
[root@server1 haproxy]# /etc/init.d/httpd start
测试:访问时会跳转到172.25.50.1:8080/index.html
或者直接重定向:
vim /etc/haproxy/haproxy.cfg
六.动静分离
[root@server1 haproxy]# vim haproxy.cfg
server2上:
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# ls
index.html
[root@server2 html]# cat index.html
sesrver2
server3上:
[root@server3 html]# ls
index.php
[root@server3 html]# cat index.php
<?php
phpinfo()
?>
测试:浏览器访问172.25.50.1 是自己写的静态页面;访问172.25.50.1/index.php 即php输出信息
七.上传下载分离
vim /etc/haproxy/haproxy.conf
配置文件修改如下:
在server2和server3上:
[root@server2 html]# ls #两者相同
index.php upload upload_file.php
测试:浏览器输入172.25.50.1/index.php 可以看到上传页面及其按钮,选择文件上传后输入172.25.50.1/upload_file.php
会看到上传文件信息
查看srevr2的upload目录下即可看到上传文件
即 使用server3上传图片(访问动态页面),却上传到server2上了(静态请求)