linux进阶之haproxy实现负载均衡和健康检查

前言:

环境介绍:rhel6.5 selinux and iptables disable
172.25.14.1   haproxy
172.25.14.2   web1
172.25.14.3   web2

一、haproxy介绍

1. 关于haproxy

haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。haproxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。

2. haproxy和nginx的区别:

对于做软负载,我们都知道主流的方案有LVS、Haproxy、Nginx!那么对于Haproxy和Nginx,我们如何选择呢?回答这个问题之前,我根据个人使用经验来讲下它们的特点!
Haproxy特点
1.支持TCP与Http协议,工作在网络4层和7层
2.支持Session共享、Cookies引导
3.支持通过URL健康检测
4.支持8种负载均衡策略
5.支持心跳检测

Nginx特点
1.支持Http协议,工作在网络7层
2.支持通过端口健康检测
3.支持强大的正则匹配规则
4.支持WebSocket协议
5.支持Http Cache
说明:对于Http协议,Haproxy处理效率比Nginx高。所以,没有特殊要求的时候或者一般场景,建议使用Haproxy来做Http协议负载!但如果是Web,那么建议使用Nginx!总之,大家可以结合各自使用场景的特点来进行合理地选择!


二、haproxy的安装配置

1. haproxy的安装

1)使用rpm-build创建rpm的二进制软件包和源码软件包
这里写图片描述
2)rpmbuild -tb haproxy-1.6.11.tar.gz ##创建haproxy的rpm包
这里写图片描述
3)rpmbuild会在用户的家目录里自动创建rpmbuild目录,在rpmbuild/RPMS/x86_64/目录下有创建的haproxy的rpm包
这里写图片描述

2. haproxy的配置

1)vim /etc/haproxy/haproxy.cfg ##haproxy的配置文件

把静态后端和动态后端都使用的一些参数放在全局变量的位置
这里写图片描述

2)创建haproxy的用户和用户组
[root@server1 ~]# groupadd -g 200 haproxy
[root@server1 ~]# useradd -u 200 -g 200 haproxy
[root@server1 ~]# id haproxy
uid=200(haproxy) gid=200(haproxy) groups=200(haproxy)
3)静态的负载均衡配置
bind             *:80 name clear # 监听端口为80
default_backend static #默认使用静态后端

这里写图片描述

4)测试:curl 172.25.14.1 轮询访问后端

这里写图片描述

5)监控以及用户认证

这里写图片描述

stats uri       /admin/stats  #监控的访问方式
stats auth      admin:sunshine  #用户:密码

访问监控:http://172.25.23.1/admin/stats
密码认证:
这里写图片描述
页面显示:
这里写图片描述
当down掉web1:
这里写图片描述
访问测试,可自动对后端进行健康检查功能:
这里写图片描述

6)日志的分离

vim /etc/rsyslog.conf ##系统日志的配置文件

# 打开提供UDP日志的接收
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

这里写图片描述

haproxy.none    ##haproxy的日志不在/var/log/messages里面记录

这里写图片描述

local0.*                           /var/log/haproxy.log                          ##haproxy的日志文件

这里写图片描述

# 重启rsyslog
[root@server1 ~]# /etc/init.d/rsyslog restart
# 重启haproxy,日志记录到/var/log/haproxy.log
[root@server1 ~]# /etc/init.d/haproxy restart

这里写图片描述

7)重定向的两种方式

方式一:

acl blacklist src 172.25.14.250
http-request deny if blacklist
errorloc 403 http://172.25.14.1:8080/index.html   ##请求的IP来源是在用户访问限制的名单里的172.25.14.250,就重定向到haproxy的apache8080端口(因为haproxy是80端口,避免冲突)

这里写图片描述
方式二:

acl blacklist src 172.25.14.250   ##重定向
redirect location http://172.25.14.1:8080/index.html  if blacklist

这里写图片描述
测试:访问172.25.14.1,自动传到其8080端口
这里写图片描述

8)动静分离
use_backend dynamic if { path_end .php }   ##如果是以.php结尾的文件就去访问动态的后端

这里写图片描述
在web2上面装php插件,php支持动态页面:
这里写图片描述
测试: 172.25.14.1/index.php
这里写图片描述

9)读写分离
acl read method GET
acl read method HEAD  ##读的两种方式

acl write method POST
acl write method PUT    ##写的两种方式
use_backend dynamic if write     ##如果是上传数据访问dynamic(动态)

这里写图片描述
web1和web2都需要安装php插件,默认发布目录里面出 index.html 外,内容相同
这里写图片描述

# 注:index.php 和 upload_file.php内容见附录

测试:
这里写图片描述
这里写图片描述
图片成功上传到web2动态后端的/var/www/html/upload
这里写图片描述

附录:

[root@server3 html]# cat index.php 
<html>
<body>

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
form>

body>
html>
[root@server3 html]# cat upload_file.php 

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 2000000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "
"
; } else { echo "Upload: " . $_FILES["file"]["name"] . "
"
; echo "Type: " . $_FILES["file"]["type"] . "
"
; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
"
; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
"
; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; } ?>

你可能感兴趣的:(linux项目实践)