實驗環境:
物理機 用於測試訪問 172.25.254.67
haproxy服務器 172.25.254.1
後端 server2 172.25.254.2
後端 server3 172.25.254.3
haproxy的部署
rhel 7.6的系統中有自帶的haproxy,我們也可以去官網下載:
https://www.haproxy.org/
yum install haproxy -y
[root@server1 ~]# id haproxy
uid=188(haproxy) gid=188(haproxy) groups=188(haproxy)
會自動生成haproxy用戶。
它的配置文件在 /etc/haproxy/haproxy.cfg
大致有一下幾個模塊,global,defaults,frontend main *:5000,backend。
我們做一下更改:
將請求轉發給兩臺後端。
物理機測試訪問:
實現了反向代理和負載均衡。
haproxy的配置
查看狀態和監控;
訪問:
可以看到我們兩臺後端的狀態,相當於我們的後臺。
200OK 可以知道這個服務是正常的,用於監控。
後臺訪問權限控制
stats auth admin:westos 用戶認證,帳號爲admin 密碼爲westos
stats refresh 5s 頁面刷新間隔 5s
這樣的話就會需要輸入密碼才能登陸,且5s刷新一次。
日誌
每個應用都有自己的日誌.我們配置haproxy時它告訴我們要去配置系統的日誌。
vim /etc/
打開udp模式:
設置地址:
重啓rsyslog服務.
發現裏面已經記錄了訪問的信息,系統就會把haproxy的日誌信息記錄到 /var/log/haproxy.log 。
黑名單
可見我們的物理機被拒絕,用其他的ip地址訪問可以。
我們也可以把 block 替換爲 http-request deny,效果相同:
我們還可以將403錯誤頁面轉接至本機的8080端口:
安裝apache,修改配置文件端口爲8080端口,啓動httpd,並配置一個index.html頁面:
重啓haproxy,測試訪問:
剛纔的403頁面就變成了8080端口的頁面。
請求分發
設置一個動態頁面的資源組,上面的static爲靜態組:
vim /etc/haproxy/haproxy.cfg
當訪問以php結尾的頁面使用dynamic 資源組,默認使用static資源組.
在server3 主機安裝php,並配置一個php頁面
yum install php -y
測試訪問:
可見默認訪問到了server2上,當訪問以php結尾的頁面時訪問的時dynamic 的主機組,就是server3.
讀寫分離
給server2 頁安裝php。
在server2 和server3 的/var/ww/html 目錄下建立兩個php頁面.
upload 的權限爲777 不然 haproxy 用戶不可寫。
index.php:
upload_file.php:
index.php 會讀取upload_file.php的動作,會把上傳的文件上傳到 upload目錄下。
更改server1 的haproxy 配置:
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:80
acl read method HEAD
acl read method GET 定義讀的兩種方法
acl write method POST
acl write method PUT 定義寫的兩種方法,都可以。
# acl url_static path_beg -i /static /images /javascript /stylesheets
# acl url_static path_end -i .jpg .gif .png .css .js
#
# use_backend static if url_static
#acl blacklist src 172.25.254.99
#http-request deny if blacklist
#errorloc 403 http://172.25.254.1:8080/index.html
use_backend dynamic if write 寫的時候使用dynamic資源組
use_backend static if read 讀的時候使用static資源組
default_backend static
讀的時候讀的是 static 組。
我們可以測試該server2的index.php;
在測試訪問:
可見讀取的就是server2 主機。
我們選擇上傳daolian.jpg ,然後點擊submit提交,
這時 server3 的upload目錄下出現了圖片,而server2 沒有
這樣就實現了讀寫分離。