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
3.在實體機做通路解析:
4.在浏覽器測試頁測試
動态通路到server3的php頁面
靜态通路到server2的httpd預設釋出檔案
(二)修改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
2.重新開機日志服務
/etc/init.d/rsyslog restart
3.在浏覽器通路後,檢視日志内容
(三)通路控制
1.不允許172.25.1.250通路(實作對黑名單主機的通路)
在配置檔案的frontend public部分寫:
acl blacklist src 172.25.1.250
http-request deny if blacklist
172.25.1.250主機的浏覽器中通路出現下面情況:
而在别的主機中可以通路:
(1)出現錯誤403,不想将“拒絕”表現的這麼直接,可以重定向到某台主機,顯示錯誤提示頁面,比如,我們重定向到夲機的8080端口。
2.直接重定向
通路www.westos.org直接重定向到www.baidu.com
在實體機做解析 www.westos.org
(四)讀寫分離:
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伺服器叢集
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
上傳成功的圖檔儲存在server3中/var/www/html/upload中