haproxy是一個代理服務器,他是將用戶的多個請求調度到後端服務器時,而不會因爲一個後端服務器的故障而導致面向客戶端的服務不可用,但是如果是haproxy自身故障了,服務依然不可用
haproxy是一個代理服務器,但是天然就是一個能在代理時做負載均衡調度的服務器
2.如果工作在tcp模式下,這是一個僞四層反代,之所以稱爲僞四層是因爲還有工作在七層,來模擬四層調度
1.要根據用戶的請求的資源類型做分離調度,只有七層纔有這樣的功能
2.七層還可以做ssl/tls會話的卸載器。四層反代就無法實現這個功能
ssl/tls會話的卸載器就是,如果我們要構建一個ssl類型的應用,他可以實現客戶端與調度器後端的RS服務器二者之間實現ssl會話的建立,拆除等功能
如果我們要做七層調度的話ssl會話可以只在客戶端與調度器之間進行,調度器與反代服務器通常都是一個局域網之內的通信,而且是一個防範嚴密的局域網通信,因此他們之間的明文通常是沒有問題的
由於ipvs工作在四層而ssl或tls工作在七層模型中的會話層或應用層,使得他沒法卸載,這是七層反代時能獲取的功能
haproxy使用事件驅動模型單進程響應多請求的模式來工作,他也可以同時啓用多進程,每個進程響並處理一部分用戶請求,但是對haproxy不建議這麼做,他們強烈建議將haproxy運行在單進程上,足以處理較大併發數量的用戶請求,雖然他也能支持多進程的模式,但建議單進程,這樣更容易排查和定義問題
四層調度僅僅是一個管道,如果和ipvs一樣僅僅工作在內核的話,ipvs不用監聽套接字,它只是打開了一個管道,他是把請求原封不動的發到後端服務器上
七層反代是自己要監聽在套接字上,所以客戶端請求的時候,我們的代理服務器就是服務器端,客戶端和代理服務器之間有一個完整的會話,代理服務器發現自己沒有對方請求內容,自己在起一個客戶端程序,然後向後端服務器發請求,這樣一來面向後端服務器的是代理服務器端
timedatectl set-timezone Asia/Shanghai 更改時間區
global 全局配置段,這些都要工作在默認配置下,因爲會動態調整
defaults:爲frontend ,backend,listen 提供默認配置
backend 後端 相當於nginx的upstream {} 調度器
listen 相對frontend和backend的合體,但是隻能實現一對一
default_backend websrvs #要使用哪個默認後端,websrvs後端的名字自己定義
balance roundrobin #調度算法,roundrobin加強輪循
server websrv1 192.168.63.131:80 check websrv1 代表第一個後端,check代表健康檢查
server websrv2 192.168.63.139:80 check websrv2 代表第一個後端,check代表健康檢查
for i in {1..10} ;do curl 192.168.63.140; done
server static1 192.168.63.131:80 check weight 2 注:weight 2代表權重改爲2
server static2 192.168.63.139:80 check
客戶端測試 192.168.63.140是代理服務器haproxy的ip
for i in {1..10} ;do curl 192.168.63.140; done
# Provides UDP syslog reception
用ss -unl查看udp協議的端口,查看514監聽端口是否啓用
可以用 ulimit-n修改,不過不建議修改,haproxy主控進程會根據子進程所需要打開的描述符自動調整
進程及安全管理:chroot切根,daemon是否以守護進程方式運行, user group uid gid
後端有多少個服務器,我們把它規定成組,並配置調度算法,以便能被前端作爲調度或者轉 - 發請求目的端
bind :80,:443 #可以監聽兩個套接字80,443 只能用在frontend和listen代理中
bind 10.0.0.:1080,10.0.0.1:10443 #也可以用ip加端口的格式
bind /var/run.ssl-frontend.sock user root mode 600 accept-proxy #亦可以說sock文件
hash-type consistent # 用動態方式調度
server static1 192.168.63.131:80 check weight 2 #權重爲2,是2比1的調度
server static2 192.168.63.139:80 check
for i in {1..10};do echo "Test Page $i @Backend Server 1" >/var/www/html/test$i.html; done
for i in {1..10};do echo "Test Page $i @Backend Server 1" >/var/www/html/test$i.html; done
for i in {1..10};do curl http://192.168.63.140/test9.html; done
server static1 192.168.63.131:80 check weight 2
server static2 192.168.63.139:80 check
server static1 192.168.63.131:80 check backup
server static2 192.168.63.139:80 check
server static1 192.168.63.131:80 check inter 1000 rise 1 fall 2 1秒鐘檢測一次,上架只要一次,下架要兩次
server static2 192.168.63.139:80 check
如果這個服務器有問題。當客戶端訪問的時候我嗎可以將這條服務器調度到其他可以用的服務器上
server static1 192.168.63.131:80 check inter 1000 rise 1 fall 2
server static2 192.168.63.139:80 check redir https://www.baidu.com/
172.20.127.233 ip是haproxy的服務器外網ip
server static1 192.168.63.131:80 check inter 1000 rise 1 fall 2 maxconn 2000
server static2 192.168.63.139:80 check redir maxconn 1500
當有請求報文的時候,進程請求報文,發現上一次已經例如到過static1服務器,就將這個報文調度到第一個服務器上
cookie WEBSRV insert nocache indirect 注: WEBSRV名字隨便指定,以insert的方式插入已有的cookie中,後面兩是補充,nocache 非緩存響應的,以及indirect重定向的
server static1 192.168.63.131:80 check inter 1000 rise 1 fall 2 maxconn 2000 cookie static1
server static2 192.168.63.139:80 check maxconn 1500 cookie static2
172.20.127.233 ip是haproxy的服務器外網ip
option httpchk GET /test9.html #GET是方法,test9.html是URL
server static1 192.168.63.131:80 check inter 1000 rise 1 fall 2 maxconn 2000
server static2 192.168.63.139:80 check maxconn 1500
檢測test9.html網站,如果沒有故障兩個都調度,如果一個故障,就只調度一個服務器
http://172.20.127.233/haproxy?stats
我們打開的web界面沒有安全裝置非常的不安全。我們可以做以下幾種安全設置
http://172.20.127.233:9527/haproxy?stats
stats realm "HAProxy Stats" #提示用戶輸入用戶名密碼
stats auth admin:admin #用戶名和密碼是admin
http://172.20.127.233:9527/haproxy?stats
http://172.20.127.233:9527/admin?mystats
http://172.20.127.233:9527/admin?mystats
server srv1 192.168.63.131 check
server srv2 192.168.63.139 check
option forwardfor 加入這個選項能獲取到客戶端的真實地址
option httpchk GET /test8.html
server static1 192.168.63.131:80 check inter 1000 rise 1 fall 2 maxconn 2000
server static2 192.168.63.139:80 check maxconn 1500
vim /etc/httpd/conf/httpd.conf
在第一行開頭把%h修改爲 LogFormat "%{X-Forwarded-For}i
tail /var/log/httpd/access_log
服務器有內建的錯誤頁面,可以自定義。注:代理服務不能自定義錯誤頁面404
但是能指定200, 400, 403, 408, 500, 502, 503, and 504.
在響應報文可以看到server暴露了http的版本信息,非常危險,我們可以刪除這個選項
acl bad_guys src 192.168.63.137 #拒絕ip
block if bad_guys #如果是bad_guys就拒絕
errorfile 403 /etc/haproxy/errorfiles/403.html #自定義返回一個錯誤403,訪問指定的文件信息
mkdir -p /etc/haproxy/errorfiles/
vim /etc/haproxy/errorfiles/403.html
http-request 進行精確的訪問控制,那些人可以訪問,那些人不可以訪問
acl mynet src 172.20.0.0/16 #定義一個網段
http-request allow if mynet #只要是mynet就可以訪問
use_backend 當滿足條件時使用指定的客戶端,否則默認
path_reg ^/images.*\.jpeg$ 如果以/images開頭,後面跟任何內容,以\.jpeg結尾
path_dom ilinux 只要包含ilinux的字串,就符合條件
acl url_static path_beg -i /static /images /javascript /stylesheets #只要是這些開頭>的都歸類爲url_static
acl url_static path_end -i .jpg .gif .png .css .js #以這些結尾的都歸類爲url_static
use_backend static if url_static #只要滿足url_static這些條件就調度到static
backend static #只要滿足url_static這些條件就調度到static
server static 127.0.0.1:4331 check
acl url_img path_beg /images #以/images開頭的文件夾,這個文件夾下面放的是圖片
acl url_img path_end .jpg .png .jpeg .gif #以這些格式結尾
use_backend imgsrvs if url_img #如果訪問的是圖片就訪問這個服務器
backend imgsrvs #如果訪問的是圖片就訪問這個服務器
server imgsrv1 192.168.63.139:80 check 注:check 健康檢測
option httpchk GET /test8.html
server static1 192.168.63.131:80 check inter 1000 rise 1 fall 2 maxconn 2000
server static2 192.168.63.139:80 check maxconn 1500
find /usr/share -iname "*.jpg" -exec cp {} ./ \; 查找圖片並拷貝到當前目錄
find /usr/share -iname "*.png" -exec cp {} ./ \; 查找圖片並拷貝到當前目錄
acl bad_agent hdr_sub(User-Agent) -i curl wget # 用hdr_sub做字串匹配,如果對User-Agen去檢測的時候 -i不區分大小寫 ,發現curl和wget
[root@RS1 ~]# curl http://172.20.127.233/test1.html
<html><body><h1>403 Forbidden</h1>
Request forbidden by administrative rules.
[root@RS1 ~]# wget -O - -q http://172.20.127.233/test1.html
timeout server 面向服務端的超時時長,建立連接以後要多少時間斷開的時長
timeout http-keep-alive 持久連接的持久時長
timeout http-request http客戶端請求報文傳完的時長
timeout connect 客戶端發起連接請求時的超時時長
timeout client-fin 在客戶端設置半關閉連接的非活動超時