使用HAproxy如何实现web站点的动静分离
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
HAProxy特别
适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的
运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限
制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space)
实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以
使每个CPU时间片(Cycle)做更多的工作。
--摘自百度百科
实现过程图:
第一步:安装httpd、php以及haproxy,这里我们直接用yum来安装即可,这里我们使用三台虚拟机来做测试,前端一台haproxy做调度,后端两台httpd服务器提供web服务,在做动静分离时时前端haproxy来判断动态和静态内容分别调度到哪台服务器上;
[root@node0 ~]# yum -y install httpd php haproxy
第二步:安装好之后给这三台虚拟配置好相关的网络设备以及提供相关的测试页面等,在eth1这张网卡上选择相同的一个通信通道,node0这台虚拟机上haproxy的主机,node1和node2是不同的两台后端提供web服务器的虚拟主机;
[root@node0 ~]# ifconfig eth1 192.168.27.10/24 up # 给eth1配置ip地址 [root@node0 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:B2:AD:BA inet addr:172.16.27.88 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:feb2:adba/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:11122303 errors:0 dropped:0 overruns:0 frame:0 TX packets:1193136 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:697850934 (665.5 MiB) TX bytes:74549101 (71.0 MiB) eth1 Link encap:Ethernet HWaddr 00:0C:29:B2:AD:C4 inet addr:192.168.27.10 Bcast:192.168.27.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:feb2:adc4/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 b) TX bytes:468 (468.0 b) [root@node0 ~]#
[root@node1 ~]# ifconfig eth0 192.168.27.18/24 up在node1和node2上设置好相关配置,选择虚拟机上的VMnet2与haproxy上的eth1的同一通信通道,再配置IP地址和默认网关接口,而后再提供不同的页面以便测试用;
[root@node1 ~]# route add defaulte gw 192.168.27.18 # 网关指向haproxy主机的eth1地址 [root@node1 ~]# ping 192.168.27.10 # ping一下haproxy的节点看是否ping通 [root@node1 ~]# vim /var/www/html/index.html <h1>node1.tanxw.com</h1> [root@node1 ~]# service httpd start # 配置好之后就把web服务启动起来,再访问测试一下,测试的连接改为桥接方式
[root@node2 ~]# ifconfig eth0 192.168.27.19/24 up [root@node2 ~]# route add defaulte gw 192.168.27.18 # 网关指向haproxy主机的eth1地址 [root@node2 ~]# ping 192.168.27.10 # ping一下haproxy的节点看是否ping通 [root@node2 ~]# vim /var/www/html/index.php <h1>node2.tanxw.com</h1> <?php phpinfo(); ?> [root@node2 ~]# service httpd start # 配置好之后就把web服务启动起来,再访问测试一下,测试的连接改为桥接方式
############## 以上的使用默认配置就可以了 ####################### frontend web *:80 # *表示haproxy监听所有地址,监听的端口为80 # 定义访问控制,表示以url以.css .js .html .php结尾的分别调度到哪台服务器上访问 acl url_static path_end -i .css .js .html acl url_dynamic path_end -i .php # usr_backend表示使用backend服务,if表示如果满足url_static这个条件就调度到这台服务器上 use_backend static if url_static default_backend dynamic backend static # 定义调用后端的静态页面的服务器上 server node1 192.168.27.18:80 check inter 3000 rise 2 fall 2 maxconn 5000 backend dynamic # 定义调用后端的动态页面的服务器上 server node2 192.168.27.19:80 check inter 3000 rise 2 fall 2 maxconn 5000 listen statspage # 定义监控管理接口的界面 bind *:8888 # 定义访问页面端口 stats enable # 启用管理界面 stats hide-version # 隐藏版本 stats uri /admin?stats # 访问路径 stats auth xiao:linux # 访问时需要验证登录 stats admin if TRUE # 如果登录成功就可以管理在线服务器
第三步:配置haproxy的相关配置信息;
第四步:登录到我们配置好的管理界面:
第五步:配置好相关的配置之后就可以测试一下了,
最后我们再分别对这两个页面的请求做一下压力测试看看:
总结:
HAProxy是一款比较轻量级的负载均衡服务器,特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在 当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到 网络上。