一.Haproxy簡介
HAProxy是一個使用C語言編寫的自由及開放源代碼軟件[1],其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。
HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。
HAProxy實現了一種事件驅動,單一進程模型,此模型支持非常大的併發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。事件驅動模型因爲在有更好的資源和時間管理的用戶空間(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以使每個CPU時間片(Cycle)做更多的工作。 包括 GitHub、Bitbucket[3]、StackOverflow、Reddit、Tumblr、Twitter和 Tuenti在內的知名網站,及亞馬遜網絡服務系統都使用了HAProxy。
二.HAProxy實驗
實驗環境:rhel7.5
主機名 | 作用 |
---|---|
server1(172.25.16.1) | Haproxy |
server2(172.25.16.2) | 後端httpd |
server3(172.25.16.3) | 後端httpd |
1.haproxy實現反向代理
1.server1安裝haproxy
yum install -y haproxy.x86_64
rpm -qa | grep haproxy
haproxy-1.5.18-7.el7.x86_64
rpm -ql haproxy-1.5.18-7.el7.x86_64 ##查看相關文件
2.修改haproxy的配置文件
vim /etc/haproxy/haproxy.cfg
3.在server2和server3上安裝httpd,並編寫測試文件
yum install httpd -y
vim /var/www/html/index.html
systemctl start httpd
curl localhost
4.開啓server1的haproxy的服務
5.在物理機上測試:
訪問server1實現輪詢訪問
6.爲haproxy添加訪問日誌
vim /etc/rsyslog.conf
systemctl restart rsyslog.service
7.再次在物理機上測試:訪問server1
發現生成日誌
8.配置文件中添加下面參數,可以實現web監控,和返回狀態碼。
返回狀態碼:
9.haproxy設置黑名單,實現訪問控制。
yum install httpd -y
vim /var/www/html/index.html
systemctl restart haproxy
vim /etc/http/conf/http.conf
systemctl start httpd
systemctl restart httpd
測試:
2.haproxy實現動靜分離
- 在server3上安裝php,編輯動態頁面,完成後重啓服務
2.編輯haproxy的配置文件
測試:
靜態訪問
動態訪問
3.讀寫分離
sever1的配置:
vim /etc/haproxy/haproxy.cfg ##修改配置文件
systemctl restart haproxy.service ##重啓服務
server2和server3的配置:
yum install php -y ##安裝php圖形化服務
systemctl restart httpd ##重啓服務
mkdir /var/www/html/upload ##建立一個目錄用來寫入文件
chmod 777 /var/www/html/upload ##給這個存儲目錄可寫的權限
再編寫兩個文件,一個用配置讀頁面,一個用來設置存儲路徑
vim index.html ##配置頁面的讀取設置
##加上各自的主機名來區分讀的頁面到底是哪個服務器的
vim upload_file.php ##存儲路徑設置
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000000)) ##文件大小設置
{
if ($_FILES["file"]["error"] > 0)
{
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"] / 1024) . " 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";
}
?>
測試:在瀏覽器輸入172.25.16.1/index.php來查看