Haproxy

haproxy是一個代理服務器,他是將用戶的多個請求調度到後端服務器時,而不會因爲一個後端服務器的故障而導致面向客戶端的服務不可用,但是如果是haproxy自身故障了,服務依然不可用

haproxy是一個代理服務器,但是天然就是一個能在代理時做負載均衡調度的服務器

haproxy的特信有兩個反代和調度器

1.反代,支持兩種反代模式

1.如果工作在http模式下,這是一個七層反代

2.如果工作在tcp模式下,這是一個僞四層反代,之所以稱爲僞四層是因爲還有工作在七層,來模擬四層調度

四層反代和七層反代的區別

1.要根據用戶的請求的資源類型做分離調度,只有七層纔有這樣的功能

2.七層還可以做ssl/tls會話的卸載器。四層反代就無法實現這個功能

ssl/tls會話的卸載器就是,如果我們要構建一個ssl類型的應用,他可以實現客戶端與調度器後端的RS服務器二者之間實現ssl會話的建立,拆除等功能

如果我們要做七層調度的話ssl會話可以只在客戶端與調度器之間進行,調度器與反代服務器通常都是一個局域網之內的通信,而且是一個防範嚴密的局域網通信,因此他們之間的明文通常是沒有問題的

由於ipvs工作在四層而ssl或tls工作在七層模型中的會話層或應用層,使得他沒法卸載,這是七層反代時能獲取的功能

七層反代只針對http和https服務

2.調度器

調度器有衆多的調度算法

rr輪循 wrr加權輪循 lc最少連接 wlc加權最少連接

還支持七層模型中特有的調度算法,例如:URL

haproxy使用事件驅動模型單進程響應多請求的模式來工作,他也可以同時啓用多進程,每個進程響並處理一部分用戶請求,但是對haproxy不建議這麼做,他們強烈建議將haproxy運行在單進程上,足以處理較大併發數量的用戶請求,雖然他也能支持多進程的模式,但建議單進程,這樣更容易排查和定義問題

四層和七層調度的區別

四層調度僅僅是一個管道,如果和ipvs一樣僅僅工作在內核的話,ipvs不用監聽套接字,它只是打開了一個管道,他是把請求原封不動的發到後端服務器上

七層反代是自己要監聽在套接字上,所以客戶端請求的時候,我們的代理服務器就是服務器端,客戶端和代理服務器之間有一個完整的會話,代理服務器發現自己沒有對方請求內容,自己在起一個客戶端程序,然後向後端服務器發請求,這樣一來面向後端服務器的是代理服務器端

所以這是完全獨立的兩路連接,各自獨立

四層是不受套接字數量限制的

七層是受套接字數量限制的

timedatectl set-timezone Asia/Shanghai 更改時間區

haproxy的版本是1.5

haproxy 的配置主要分兩段

global 全局配置段,這些都要工作在默認配置下,因爲會動態調整

進程及安全配置相關的參數

性能調整相關參數

Debug參數

用戶列表

peers 同等端點的其他兄弟服務器彼此間通信

proxies 代理配置段

defaults:爲frontend ,backend,listen 提供默認配置

frontend前端 相當於nginx的server {}

backend 後端 相當於nginx的upstream {} 調度器

listen 相對frontend和backend的合體,但是隻能實現一對一

安裝haproxy

yum install haproxy -y

配置文件

vim /etc/haproxy/haproxy.cfg

global全局中配置

定義前端

frontend main *:80 #要監聽的端口

mode http #以http模型爲主導

default_backend websrvs #要使用哪個默認後端,websrvs後端的名字自己定義

定義後端

backend websrvs

balance roundrobin #調度算法,roundrobin加強輪循

server websrv1 192.168.63.131:80 check websrv1 代表第一個後端,check代表健康檢查

server websrv2 192.168.63.139:80 check websrv2 代表第一個後端,check代表健康檢查

clip_image002

啓動服務

systemctl restart haproxy

clip_image004

客戶端測試

for i in {1..10} ;do curl 192.168.63.140; done

更改調用的權重

frontend main *:80

mode http

default_backend websrvs

backend websrvs

balance roundrobin

server static1 192.168.63.131:80 check weight 2 注:weight 2代表權重改爲2

server static2 192.168.63.139:80 check

clip_image006

客戶端測試 192.168.63.140是代理服務器haproxy的ip

for i in {1..10} ;do curl 192.168.63.140; done

global是haproxy的全局配置

配置日誌文件

vim /etc/rsyslog.conf

在日誌文件中加入這一行

local2.* /var/log/haproxy.log

clip_image008

取消兩行註釋,使用UDP協議,因爲性能比較好

# Provides UDP syslog reception

$ModLoad imudp

$UDPServerRun 514

clip_image010

啓動日誌服務

systemctl restart rsyslog

用ss -unl查看udp協議的端口,查看514監聽端口是否啓用

clip_image012

查看日誌

tail /var/log/haproxy.log

nbproc 要啓動的haproxy的進程數量

默認是兩個

ps aux 查看

clip_image014

可以用 ulimit-n修改,不過不建議修改,haproxy主控進程會根據子進程所需要打開的描述符自動調整

進程及安全管理:chroot切根,daemon是否以守護進程方式運行, user group uid gid

代理配置階段

defaults <name>

frontend <name>

用來配置前端,就是接入客戶端請求的,監聽在某一個套接字上

backend <name>

後端有多少個服務器,我們把它規定成組,並配置調度算法,以便能被前端作爲調度或者轉 - 發請求目的端

listen <name>

listen包含frontend和backend的

可以的配置參數

bind:用來定義前端服務器用來接收用戶請求的套接字

例:

listen http

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文件

監聽兩個套接字只能用在frontend和listen代理中

clip_image016

uri算法

後端服務器調度到緩存服務器的時候要用到的

vim /etc/haproxy/haproxy.cfg

backend websrvs

balance uri #算法

hash-type consistent  # 用動態方式調度

server static1 192.168.63.131:80 check weight 2 #權重爲2,是2比1的調度

server static2 192.168.63.139:80 check

clip_image018

在後端服務器創建測試頁面

192.168.63.131 服務器

for i in {1..10};do echo "Test Page $i @Backend Server 1" >/var/www/html/test$i.html; done

192.168.63.139 服務器

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

hdr(User-Agent)算法

把來自同一客戶端的請求,始終綁到同一服務器上

vim /etc/haproxy/haproxy.cfg

backend websrvs

balance hdr(User-Agent)

hash-type consistent

server static1 192.168.63.131:80 check weight 2

server static2 192.168.63.139:80 check

將一臺服務器標記爲backup

下架一臺服務器

vim /etc/haproxy/haproxy.cfg

backend websrvs

balance roundrobin

server static1 192.168.63.131:80 check backup

server static2 192.168.63.139:80 check

clip_image020

修改默認檢測邏輯

backend websrvs

balance roundrobin

server static1 192.168.63.131:80 check inter 1000 rise 1 fall 2 1秒鐘檢測一次,上架只要一次,下架要兩次

server static2 192.168.63.139:80 check

redir 只要訪問這個服務器都調度到其他服務器

如果這個服務器有問題。當客戶端訪問的時候我嗎可以將這條服務器調度到其他可以用的服務器上

backend websrvs

balance roundrobin

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/

如果訪問的是static2服務器就調度到baidu網站

clip_image022

在客戶端瀏覽器測試

172.20.127.233 ip是haproxy的服務器外網ip

maxconn 定義最大併發連接數

backend websrvs

balance roundrobin

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

clip_image024

cookie 做會話綁定

當有請求報文的時候,進程請求報文,發現上一次已經例如到過static1服務器,就將這個報文調度到第一個服務器上

backend websrvs

balance roundrobin

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

clip_image026

在客戶端瀏覽器測試

172.20.127.233 ip是haproxy的服務器外網ip

httpchk http的七層狀態安全檢測

vim /etc/haproxy/haproxy.cfg

backend websrvs

balance roundrobin

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網站,如果沒有故障兩個都調度,如果一個故障,就只調度一個服務器

clip_image028

統計接口的參數

顯示web界面

在前端加入 stats enable

vim /etc/haproxy/haproxy.cfg

frontend main

bind :80,:8080

mode http

default_backend websrvs

stats enable

clip_image030

啓動服務

systemctl restart haproxy

瀏覽器測試

http://172.20.127.233/haproxy?stats

clip_image032

clip_image034

我們打開的web界面沒有安全裝置非常的不安全。我們可以做以下幾種安全設置

1.讓web界面特定的端口打開,我的可以單獨定義

listen stats *:9527 #端口是9527

stats enable

clip_image036

啓動服務

systemctl restart haproxy

在客戶端訪問的時候要加端口

http://172.20.127.233:9527/haproxy?stats

2.輸入用戶名密碼

listen stats *:9527

stats enable

stats realm "HAProxy Stats" #提示用戶輸入用戶名密碼

stats auth admin:admin #用戶名和密碼是admin

clip_image038

啓動服務

systemctl restart haproxy

客戶端測試

http://172.20.127.233:9527/haproxy?stats

clip_image040

3. 更改URL

vim /etc/haproxy/haproxy.cfg

listen stats *:9527

stats enable

stats uri /admin?mystats

stats realm "HAProxy Stats"

stats auth admin:admin

clip_image042

重新啓動服務

systemctl restart haproxy

客戶端測試

http://172.20.127.233:9527/admin?mystats

4.打開內建管理接口

vim /etc/haproxy/haproxy.cfg

listen stats *:9527

stats enable

stats uri /admin?mystats

stats realm "HAProxy Stats"

stats auth admin:admin

stats admin if TRUE

clip_image044

啓動服務

systemctl restart haproxy

客戶端測試

http://172.20.127.233:9527/admin?mystats

clip_image046

選擇要在已檢查的服務器上執行的操作

例將static1 設置爲DRAIN

clip_image048

maxconn的參數

不建議打開

將ssh端口發佈到互聯網,這樣互聯網的客戶端也可以訪問

listen ssh

bind :22222

mode tcp

balance leastconn

server srv1 192.168.63.131 check

server srv2 192.168.63.139 check

option forwardfor 加入這個選項能獲取到客戶端的真實地址

1. 在haproxy服務器端加入選項

vim /etc/haproxy/haproxy.cfg

backend websrvs

balance roundrobin

option httpchk GET /test8.html

option forwardfor

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

clip_image050

啓動服務

systemctl restart haproxy

2.在後端服務器修改httpd的配置

vim /etc/httpd/conf/httpd.conf

找到 LogFormat所在的行

在第一行開頭把%h修改爲 LogFormat "%{X-Forwarded-For}i

clip_image052

啓動服務

systemctl start httpd

3 在日誌文件中查看

tail /var/log/httpd/access_log

clip_image054

errorfile 錯誤頁面

服務器有內建的錯誤頁面,可以自定義。注:代理服務不能自定義錯誤頁面404

但是能指定200, 400, 403, 408, 500, 502, 503, and 504.

errorloc

rspdel刪除服務器端的一些信息 rspadd是添加信息

在響應報文可以看到server暴露了http的版本信息,非常危險,我們可以刪除這個選項

clip_image056

刪除server的首部

vim /etc/haproxy/haproxy.cfg

frontend main

bind :80,:8080

mode http

default_backend websrvs

rspidel ^Server:.*

clip_image058

我也可以自己定義一個server的首部

vim /etc/haproxy/haproxy.cfg

frontend main

bind :80,:8080

mode http

default_backend websrvs

rspidel ^Server:.*

rspadd Server:\ Feige

clip_image060

在客戶端測試

clip_image062

和facl相關的選項

block 在滿足條件的時候拒絕

定義某一個地址拒絕

frontend main

bind :80,:8080

mode http

default_backend websrvs

rspidel ^Server:.*

rspadd Server:\ Feige

acl bad_guys src 192.168.63.137 #拒絕ip

block if bad_guys #如果是bad_guys就拒絕

errorfile 403 /etc/haproxy/errorfiles/403.html  #自定義返回一個錯誤403,訪問指定的文件信息

clip_image064

創建指定的目錄

mkdir -p /etc/haproxy/errorfiles/

vim /etc/haproxy/errorfiles/403.html

<h1>403 Forbidden</h1>

客戶端瀏覽器測試

http://172.20.127.233/

clip_image066

http-request 進行精確的訪問控制,那些人可以訪問,那些人不可以訪問

frontend main

bind :80,:8080

mode http

default_backend websrvs

rspidel ^Server:.*

rspadd Server:\ Feige

acl mynet src 172.20.0.0/16 #定義一個網段

http-request allow if mynet #只要是mynet就可以訪問

clip_image068

tcp-request 在三次握手的時候就拒絕掉

use_backend 當滿足條件時使用指定的客戶端,否則默認

ACL

path_beg 路徑的前綴,以什麼開頭

path_end 以什麼結尾的

path_reg ^/images.*\.jpeg$ 如果以/images開頭,後面跟任何內容,以\.jpeg結尾

path_sub image 搜索字串,包含image

path_dir jpegs 子路徑匹配包含 jpegs

path_dom ilinux 只要包含ilinux的字串,就符合條件

-i 不區分字符大小寫

-m 使用特點的模式 ,一般不用

-n禁止DNS做用,域名解析

-u 要acl必須使用唯一的名稱

多個ACL可以用同一個名字,通常用來做或邏輯

如果有多個ACL,當標準不一樣

frontend main *:5000

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

default_backend app

backend static #只要滿足url_static這些條件就調度到static

balance roundrobin

server static 127.0.0.1:4331 check

clip_image070

進行動態和具體的分離調用

vim /etc/haproxy/haproxy.cfg

frontend main

bind :80,:8080

mode http

acl url_img path_beg /images #以/images開頭的文件夾,這個文件夾下面放的是圖片

acl url_img path_end .jpg .png .jpeg .gif #以這些格式結尾

use_backend imgsrvs if url_img #如果訪問的是圖片就訪問這個服務器

default_backend websrvs

rspidel ^Server:.*

clip_image072

backend imgsrvs #如果訪問的是圖片就訪問這個服務器

balance roundrobin 輪循算法

server imgsrv1 192.168.63.139:80 check 注:check 健康檢測

backend websrvs

balance roundrobin

option httpchk GET /test8.html

option forwardfor

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

clip_image074

在後端192.168.63.139服務器查找圖片

find /usr/share -iname "*.jpg" -exec cp {} ./ \; 查找圖片並拷貝到當前目錄

find /usr/share -iname "*.png" -exec cp {} ./ \; 查找圖片並拷貝到當前目錄

通過首部報文控制

frontend main

bind :80,:8080

mode http

acl bad_agent hdr_sub(User-Agent) -i curl wget # 用hdr_sub做字串匹配,如果對User-Agen去檢測的時候 -i不區分大小寫 ,發現curl和wget

block if bad_agent #如果匹配就拒絕訪問

default_backend websrvs

rspidel ^Server:.*

後端服務器測試

顯示無法訪問

[root@RS1 ~]# curl http://172.20.127.233/test1.html

<html><body><h1>403 Forbidden</h1>

Request forbidden by administrative rules.

</body></html>

[root@RS1 ~]# wget -O - -q http://172.20.127.233/test1.html

連接超時時長

timeout client 面向客戶端的超時時長

timeout server 面向服務端的超時時長,建立連接以後要多少時間斷開的時長

timeout http-keep-alive 持久連接的持久時長

timeout http-request http客戶端請求報文傳完的時長

timeout connect 客戶端發起連接請求時的超時時長

timeout client-fin 在客戶端設置半關閉連接的非活動超時

timeout server-fin 在服務器端設置半關閉連接的非活動超時

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章