haproxy

HAProxy

HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,
同时可以保护你的web服务器不被暴露到网络上。

安装

tar zxf haproxy-1.6.11.tar.gz

find -name *.spec(若存在说明可以将其打为二进制包进行安装)
haproxy_第1张图片

安装rpmbuild命令被用于创建rpm的二进制软件包和源码软件包

yum install -y rpm-build

打包并安装

rpmbuild -tb haproxy-1.6.11.tar.gz
cd rpmbuild/RPMS/x86_64/
rpm -qlp haproxy-1.6.11-1.x86_64.rpm      #查看安装文件
rpm -ivh haproxy-1.6.11-1.x86_64.rpm

拷贝配置文件到指定目录

cp haproxy-1.6.11/examples/content-sw-sample.cfg /etc/haproxy/haproxy.cfg

创建haproxy指定用户

groupadd -g 200 haproxy
useradd -u 200 -g 200 haproxy

添加最大限制文件数

vim /etc/security/limits.conf
    haproxy - nofile 65535

sysctl -a | grep file 可查看系统最大文件数

修改配置文件,实现负载均衡

vim /etc/haproxy/haproxy.cfg
    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
        #use_backend     static if { hdr_beg(host) -i img }
        #use_backend     static if { path_beg /img /css   }
    default_backend static
........................................................
# The static backend backend for 'Host: img', /img and /css.
backend static
        balance         roundrobin
        server          web1 172.25.40.2:80 check inter 1000
    server          web2 172.25.40.3:80 check inter 1000

开启server2 server3http服务 端口80
测试:1.物理机 curl 172.25.40.1,实现负载均衡
2.浏览器输入网址:172.25.40.1/admin/stats/ ,可查看其stats状态页

haproxy_第2张图片

自定义用户密码(编辑配置文件)

haproxy_第3张图片

创建指定日志文件

vim /etc/rsyslog.conf 
    # Provides UDP syslog reception(使UDP端口接收生效)
    $ModLoad imudp
    $UDPServerRun 514
    *.info;mail.none;authpriv.none;cron.none;local0.none                /var/log/messages (/var/log/messages下不保存)
    local0.*    /var/log/haproxy.log                                       

/etc/init.d/rsyslog restart  #重启日志

acl列表(编辑haproxy配置文件)

1).建立acl黑名单,指定ip

acl blacklist src 172.25.40.250
http-request deny if blacklist

测试403报错

2).错误重定向,这里更改配置文件将错误重定向到本机的apache服务默认发布目录里的写入内容(记得将httpd的端口改为8080避免和haproxy服务冲突将403报错给客户没实际作用)

acl blacklist src 172.25.40.250
http-request deny if blacklist
errorloc 403 http://172.25.40.1:8080/index.html

3)指定ip重定向

acl blacklist src 172.25.40.4
redirect location http://172.25.40.1:8080/index.html if blacklist

测试:
haproxy_第4张图片

实现动静分离

server3安装php 编辑动态页面 完成后restart httpd服务

vim index.php
    
    phpinfo()
    ?>

编辑haproxy配置文件

use_backend dynamic if { path_end .php }
..........................................................
# The static backend backend for 'Host: img', /img and /css.
backend static
        balance         roundrobin
        #balance        source
        server          web1 172.25.40.2:80 check inter 1000

#the application servers go here
backend dynamic
        balance         roundrobin
        #balance        source
        server          web2 172.25.40.3:80 check inter 1000

动态访问server3,静态访问server2

实现读写分离

server2 server3 编写php文件如下

cd /var/www/html/
cd upload/
mv * ..
chmod 777 upload
vim upload_file.php

if ((($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 2000000000))
  {
  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"; } ?>

修改haproxy配置文件

    acl read method GET
        acl read method HEAD
        acl write method POST
        acl write method PUT

    use_backend dynamic if write

测试:

haproxy_第5张图片

haproxy_第6张图片

server3实现写 图片实际保存在server3上 读的时候访问的是server2;server3查看可以看到图片保存在server3上;实现读写分离

haproxy_第7张图片

paceaker

你可能感兴趣的:(haproxy)