天天看點

HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

HAProxy是一個使用C語言編寫的自由及開放源代碼軟體[1],其提供高可用性、負載均衡,以及基于TCP和HTTP的應用程式代理。

HAProxy特别适用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運作在目前的硬體上,完全可以支援數以萬計的并發連接配接。并且它的運作模式使得它可以很簡單安全的整合進您目前的架構中,同時可以保護你的web伺服器不被暴露到網絡上。

一.Haproxy實作負載均衡

配置過程及測試:

1.解壓haproxy壓縮包,安裝源碼編譯軟體,源碼編譯haproxy軟體

tar zxf haproxy-.tar.gz
yum install rpm-build -y
rpmbuild -tb haproxy-.tar.gz
           

2.找到haproxty的配置檔案

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

3.建立haproxy使用者群組。利用linux對haporxy使用者的通路控制實作對haporxy服務的控制

grep  /etc/passwd
groupadd -g  haproxy     # 建立一個haproxy組
useradd -u  -g  -M haproxy
id haproxy
           

4.修改配置檔案,添加後端真實伺服器和負載均衡算法

global    # 全局定義
        maxconn            # 最大連接配接數
        stats socket    /var/run/haproxy.stat mode  level admin
        log              local0   # 夲機日志
        uid                   # haproxy使用者的uid
        gid                   # haproxy使用者的gid
        chroot          /var/empty
        daemon
defaults     # 預設條件
        mode            http
        log             global
        option          httplog
        option          dontlognull
        monitor-uri     /monitoruri
        maxconn         
        timeout client  s

        stats uri       /admin/stats

        option prefer-last-server
        retries         
        option redispatch
        timeout connect s
        timeout server  s
# The public 'www' address in the DMZ
frontend public
        bind            *: name clear
        #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  static    # 預設使用static後端伺服器叢集

# The static backend backend for 'Host: img', /img and /css.
backend static
        balance         roundrobin  # 負載均衡算法rr
        server          statsrv1 : check inter  # 後端伺服器server2
        server          statsrv2 : check inter  # 後端伺服器servr3
           

5.打開server1的haproxy服務和後端伺服器的httpd服務:

/etc/init.d/haproxy start   ##打開服務
在server2和server3中分别打開httpd
/etc/init.d/httpd  start
           

測試結果:在浏覽器輸入172.25.1.1,出現server2與server3的輪調….

二.基于TCP和HTTP的應用程式代理

(一)動态頁面和靜态頁面的分離

1.在server1中的httpd預設釋出目錄寫index.html(server2)

在server3中的httpd預設釋出目錄寫index.php(php測試頁面)

寫完後重新開機httpd服務…

2.在haproxy的配置檔案中修改通路動态頁面和靜态頁面的路徑

frontend public
        bind            *:80 name clear
        #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   }     
        use_backend     static2 if { path_end -i .php   }  # 通路路徑以.php結尾,認為是動态頁面
        default_backend static1   # 靜态頁面,采用預設通路路徑

# The static backend backend for 'Host: img', /img and /css.
backend static1   # 靜态頁面的後端伺服器群組
        balance         roundrobin
        server          statsrv1 : check inter 
backend static2   # 動态頁面的後端伺服器群組
        balance         roundrobin
        server          statsrv2 : check inter
           
HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

3.在實體機做通路解析:

4.在浏覽器測試頁測試

動态通路到server3的php頁面

HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

靜态通路到server2的httpd預設釋出檔案

HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

(二)修改haproxy的日志路徑:

1.修改日志服務配置檔案進而修改日志存儲位置

*.info;mail.none;authpriv.none;cron.none;local0.none   #                 /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
local0.*                                                /var/log/haporxy.log  # local0的日志放在/var/log/haporxy.log
           
HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理
HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

2.重新開機日志服務

/etc/init.d/rsyslog restart
           

3.在浏覽器通路後,檢視日志内容

HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

(三)通路控制

1.不允許172.25.1.250通路(實作對黑名單主機的通路)

在配置檔案的frontend public部分寫:

acl blacklist src 172.25.1.250

http-request deny if blacklist

172.25.1.250主機的浏覽器中通路出現下面情況:

HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

而在别的主機中可以通路:

HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

(1)出現錯誤403,不想将“拒絕”表現的這麼直接,可以重定向到某台主機,顯示錯誤提示頁面,比如,我們重定向到夲機的8080端口。

HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

2.直接重定向

通路www.westos.org直接重定向到www.baidu.com
在實體機做解析     www.westos.org
           
HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

(四)讀寫分離:

1.修改配置檔案(截取改動部分)

acl write method POST   # POST是寫的動作
acl write method PUT    # PUT也是寫的動作
#http-request deny if blacklist   # 黑名單直接deny
#errorloc 403 http://172.25.1.1:8080  # 403報錯的拒絕重定向到夲機80端口

#redirect  location  http://www.baidu.com   # 直接重定向

#use_backend     static2 if { path_end -i .php   }  # 通路路徑是以i.php結尾直接去static2伺服器叢集
use_backend     static2 if write   # write部分中的兩種情況直接去static2的伺服器叢集
default_backend static1  # 預設去static伺服器叢集
           
HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

2.重新加載haproxy服務

/etc/init.d/haproxy reload
           

3.在server3中的httpd預設釋出目錄,放進去index.php(選擇圖檔的靜态頁面)和upload_file.php(上傳圖檔的動态頁面),存放上傳圖檔的目錄upload目錄。

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>
           
upload_file.php:
<?php
if ((($_FILES["file"]["type"] == "image/gif")  
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))  # 圖檔的三種格式(隻能上傳着三種)
&& ($_FILES["file"]["size"] < ))   # 上傳圖檔的大小(k為機關),可以自己調節大小
  {
  if ($_FILES["file"]["error"] > )
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {    # 上傳成功顯示的資訊(是以上傳圖檔是個動态的過程)
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / ) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    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";  # 不符合上傳條件顯示Invalid file
  }
?>
           

4.在浏覽器測試172.25.1.1

HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理
HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

上傳成功的圖檔儲存在server3中/var/www/html/upload中

HAproxy的負載均衡,以及基于TCP和HTTP的應用程式代理

繼續閱讀