HAProxy反向代理

HAProxy的簡單配置實現反向代理服務器的功能:(有自動的健康性檢查的功能)

程序環境:
主程序:/usr/sbin/haproxy
主配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service

官網文檔:

http://cbonte.github.io/haproxy-dconv/

 

實驗簡單實現haproxy的代理服務:

1 .在代理服務器上:(有內網和外網兩塊網卡)

yum install haproxy? (安裝包)

修改配置文件:(添加的內容)

frontend main *:80
default_backend websers ? (websers :默認代理的后端服務器組名,自定義的)

backend websers ? ? ? ? (定義后端的代理服務器)
balance roundrobin ? ? ?? (調用調度算法:roundrobin:輪詢)
server webser1 192.168.60.20:80 ? (被代理的后端服務器的IP地址及代理服務的端口號)
server webser2 192.168.60.21:80 ? ? ? (webser2:自定義的名稱可以隨便寫)

QQ截圖20180709201320

systemctl start haproxy (重啟服務)

ss -nult ? (查看監聽的端口號應該已經打開了)

2 . 在后端web服務器上:(只有內網網卡)

RS1

yum install httpd ?? (安裝包)

echo RS1 > /var/www/html/index.html ? (生成測試的主頁面文件)

systemctl start httpd ? (啟動服務)

RS2
yum install httpd (安裝包)
echo RS2 > /var/www/html/index.html (生成測試的主頁面文件)
systemctl start httpd (啟動服務)

3 . 在客戶端訪問:curl? 172.20.20.2 ? (此為haproxy的外網的IP地址)

這樣就實現了簡單的代理服務器的功能,下面為具體的介紹各個配置參數及其功能和用法。

 

global:全局參數配置 ?

1 .log (日志)

log:定義全局的syslog服務器;最多可以定義兩個;

格式:log <address> [len <length>] <facility> [max level [min level]]

在haproxy中啟用日志記錄功能:

vim /etc/rsyslog.conf ? (編輯日志的配置文件;在haproxy代理服務器上操作)

添加下面的內容:

QQ截圖20180709210059

QQ截圖20180709210609

systemctl restart rsyslog ? (重新啟動日志服務功能)

ss -nult ? (查看514端口是否起來)

tail /var/log/haproxy.log? (再次查看日志已經有記錄了)

QQ截圖20180709211753

此時客戶端的IP和調度到后臺的哪一臺web服務器也有了。

2 .?nbproc <number>:

要啟動的haproxy的進程數量;(系統默認的是啟用兩個進程數)

nbproc 4? (在全局配置里添加)

3 . ulimit-n <number>:(在命令行查看ulimit? -n )

每個haproxy進程可打開的最大文件數;(不建議修改,系統的主控進程會根據訪問量的大小來自動調節每個子進程haproxy進程打開的文件數)

4 .性能調整:

maxconn <number>:設定每個haproxy進程所能接受的最大并發連接數

nbproc * maxconn:總體的并發連接數(單個進程連接數*開啟的進程數)

maxconnrate <number>:每個進程每秒種所能創建的最大連接數量;
maxsessrate <number>:每個進程每秒所能創建的會話速率。
maxsslconn <number>:? 設定每個haproxy進程所能接受的ssl的最大并發連接數;
spread-checks <0..50, in percent>

5 .代理配置段:

– defaults <name>? (默認配置段)
– frontend <name> ? ()
– backend <name> ? (配置后端的web服務器組)
– listen <name>

bind:(配置監聽端口)

frontend main
bind :80,:8080
default_backend websers

backend websers
balance roundrobin
server webser1 192.168.60.20
server webser2 192.168.60.21 weight 3

 

balance:后端服務器組內的服務器調度算法

算法:(在配置文件里不能簡寫;寫在balance后面)

roundrobin ?? (輪詢調度)只要給后臺的服務器添加權重就能實現加權輪詢的調度。

動態算法:支持權重的運行時調整,支持慢啟動;每個后端中最多支持4095個server;

一般短連接無狀態的服務下使用:例如http服務

QQ截圖20180710105938

static-rr:(靜態輪詢)
靜態算法:不支持權重的運行時調整及慢啟動;后端主機數量無上限;

leastconn:
推薦使用在具有較長會話的場景中,例如MySQL、LDAP,SSH等;(除非用戶斷開連接,自己不會主動斷開連接的)

first:
根據服務器在列表中的位置,自上而下進行調度;前面服務器的連接數達到上限,新請求才會分配給下一臺服務;(當列表中的第一個web服務器連接滿了之后,再去調度到下一個web服務器上)

source:

源地址hash算法;
a .將來自同一個的地址請求發往同一個的后端服務器。(靜態)

存在的缺點:當后臺服務器有一臺宕機了,源地址綁定就會無法訪問后臺的web服務了。無法實現高可用的效果。

b .還有一致性的哈希算法:同nginx的一致性哈希算法相同。(動態)

具體使用那種算法取決于第二個參數:hash-type

source map-based:除權取余法,哈希數據結構是靜態的數組;
source? consistent:一致性哈希,哈希數據結構是一個環。

QQ截圖20180710144117

uri? :對來自同一個url的請求就綁定到后臺同一個服務器上,不論請求來自哪一個IP地址。(提升緩存命中率,如果有緩存服務器,就需要使用這種算法)

對URI的左半部分做hash計算,并由服務器總權重相除以后派發至某挑出的服務器;

具體使用那種算法取決于第二個參數:hash-type

map-based:除權取余法,哈希數據結構是靜態的數組;

consistent:一致性哈希,哈希數據結構是一個環。

QQ截圖20180710143604

url_param:對用戶請求的uri的<params>部分中的參數的值作hash計算,并由服務器總權重相除以后派發至某挑出的服務器;通常用于追蹤用戶,以確保來自同一個用戶的請求始終發往同一個后臺服務器。

(當你登陸淘寶時,當打開多個頁面后,會出現一段長的字符和數字,其中就包含用戶名,然后就對用戶名相對應的那一串字符做哈希值計算)

把同一個用戶的請求始終發往后臺的某一個固定的服務器上??梢詫τ脩糇龇诸惢蛘咴诎l布新版的站點時,對某些不重要的客戶所對應的服務器首先更新做測試服務。

具體使用那種算法取決于第二個參數:hash-type
map-based:除權取余法,哈希數據結構是靜態的數組;
consistent:一致性哈希,哈希數據結構是一個環

hdr(<name>):對于每個http請求,此處由<name>指定的http首部將會被取出做hash計算; 并由服務器總權重相除以后派發至某挑出的服務器;沒有有效值的會被輪詢調度; 例如對瀏覽器進行區分,將PC端和移動端進行區分,代理到后臺指定的服務器上去。

具體使用那種算法取決于第二個參數:hash-type
map-based:除權取余法,哈希數據結構是靜態的數組;
consistent:一致性哈希,哈希數據結構是一個環

QQ截圖20180710144653

?default_backend <backend>
設定默認的backend,用于frontend中;

用于設定后端的服務器的IP地址的設置。

server <name> <address>[:[port]] [param*]
定義后端主機的各服務器及其選項;后面添加的參數選線:

maxconn <maxconn>:當前server的最大并發連接數;

maxcon 4444
backlog <backlog>:當前server的連接數達到上限后的后援隊列長度;

backlog 3333
check:對當前server做健康狀態檢測 (下面為check可以添加的參數)

addr :檢測時使用的IP地址;(當有多個網卡時,可以使用另外一個網卡作為檢測端口)
port :針對此端口進行檢測;
inter <delay>:連續兩次檢測之間的時間間隔,默認為2000ms;
rise <count>:連續多少次檢測結果為“成功”才標記服務器為可用;默認為2次
fall <count>:連續多少次檢測結果為“失敗”才標記服務器為不可用;默認為3次

QQ截圖20180710153825

QQ截圖20180710154004

 

disabled:標記為不可用;做灰度發布時使用。

標記為disabled 服務器就下線了。

backup:設定當前server為備用服務器;

QQ截圖20180710153427

cookie <value>:為當前server指定其cookie值,用于實現基于cookie的會話黏性;

redir <prefix>:將發往此server的所有GET和HEAD類的請求重定向至指定的URL;

例如:server webser1 192.168.60.20 ? redir http://www.baidu.com

QQ截圖20180710154806

weight <weight>:權重,默認為1;

 

統計接口啟用相關的參數:

stats enable
啟用統計頁;基于默認的參數啟用stats page;

在配置文件里添加

QQ截圖20180710161935

在瀏覽器上輸入路徑:http://172.20.49.2/haproxy?stats (就可以查看了)

此狀態頁面包括信息較多,為了防止其他人看到可以采取以下方式來避免:

a .? 通過設定特別的端口號:(不使用默認的端口號)

QQ截圖20180710164218

在瀏覽器上輸入:http://172.20.49.2:9556/haproxy?stats (就可以查看了)

b . 通過設定用戶登陸的密碼和賬號來限制其他人的查看:

QQ截圖20180710165209

在瀏覽器上輸入:http://172.20.49.2:9556/haproxy?stats? 然后輸入用戶名和密碼就可以查看了。

c . 通過自定義的uri路徑別名來控制其他人的登陸:

QQ截圖20180710170008

在瀏覽器上輸入:http://172.20.49.2:9556/admin ? 就可以查看了。

 

開啟狀態頁面的修改參數的端口:

QQ截圖20180710170612

然后打開狀態頁面:

QQ截圖20180710170521

set stats to DRAIN? (排干模式):新的用戶請求不在接收,老的用戶請求繼續等待執行完畢。

health: disable checks? :禁止做健康狀態檢測

 

實驗:將后端服務器的ssh服務通過haproxy代理,互聯網通過haproxy來連接ssh服務。

添加配置到主配置文件里:

QQ截圖20180710174807

在客戶端連接代理服務器,通過代理服務的轉發,到后臺真實連接的主機上去。

ssh root@172.20.49.2 -p? 2222 ? ? (IP地址為代理服務器的外網地址,-p后面跟的是代理服務器代理的端口號,在配置文件里定義的)

小結:haproxy支持多種服務的代理轉發。

 

haproxy代理服務器后端的web服務器如何查看到客戶端訪問的具體的IP地址

編輯后端服務器的配置文件:

如后端安裝的是httpd服務:

vim /etc/httpd/conf/httpd.conf

QQ截圖20180710191643

systemctl restart httpd (重新啟動HTTP服務)

客戶端再次通過haproxy代理訪問后端服務器,就可以在后端服務器的日志信息里看到客戶端的IP地址了。

tail /var/log/httpd/access_log

QQ截圖20180710191527

 

errorfile <code> <file> (代理服務器定義錯誤界面的文件選擇)

它能夠代理的錯誤界面的代碼:

403, 408, 500, 502, 503, and 504.

示例:
errorfile 400 /etc/haproxy/errorfiles/400badreq.http
errorfile 408 /dev/null # workaround Chrome pre-connect bug
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503 /etc/haproxy/errorfiles/503sorry.http

 

haproxy代理服務器的訪問控制列表

block { if | unless } <condition> ? (可作用于7層連接)

bolck if? (拒絕的意思)

block unless? (除了的意思)

例如: acl invalid_src src 172.16.200.2 ?? (定義源地址及別稱;別稱可以自定義的)
block if invalid_src ? ? ? ? ?? (如果是定義的源地址)
errorfile 403 /etc/fstab ?? (則返回403代碼,轉到 /etc/fstab文件下)

精確的訪問控制

http-request { allow | deny } [ { if | unless } <condition> ] (可作用于7層應用)

http-request allow if (如果是定義的源的IP則允許)

http-request allow unless (除了是定義的源的IP都允許)

http-request deny? (拒絕)

http-request deny if? (如果是定義的源的IP地址就拒絕)

http-request deny unless? (除了是定義源的IP都拒絕)

tcp-request connection {accept|reject} [{if | unless} <condition>] (可作用于4層應用)

tcp-request connection accept (允許)

tcp-request connection accept if(如果是定義的源的IP則允許)

tcp-request connection accept unless(除了是定義的源的IP都允許)

tcp-request connection? rejiect? (拒絕)

tcp-request connection rejiect if(如果是定義的源的IP地址就拒絕)

tcp-request connection rejiect unless(除了是定義源的IP都拒絕)

src? IP 源地址可以是地址段

示例:
listen ssh
bind :22022? (代理端口號)
balance? leastconn ? (調度算法)
acl invalid_src src 172.16.200.2? (定義cal的源IP地址;及別稱名,別成名可以自定義)
tcp-request connection reject if invalid_src? (如果是上面定義的源IP地址就拒絕tcp的請求連接)
mode tcp ? (使用的協議類型)
server sshsrv1 172.16.100.6:22 check? (后端服務器)
server sshsrv2 172.16.100.7:22 check backup ? (后端服務器)

示例:

frontend main
bind :80,:8080
default_backend websers
acl dddd src 172.20.49.1 ? (dddd自定義的源的別稱名)
block if dddd ? ? ? ? ? ? ? ? ?? (如果是來自ddddIP地址的訪問就給于拒絕并返回錯誤代碼,轉向錯誤界面)
errorfile 403 /data/test.html ? ? ? ? ? ? (此錯誤界面為自定義的)

示例:

frontend main
bind :80
default_backend websers
acl mmmm src 172.20.0.0/16 ?? (定義源的別名和IP地址)
http-request allow if mmmm? (如果是mmmm的源的話就都允許)
http-request deny if all ? ? ? (如果是其他的all所有就都拒絕訪問)

 

acl作為條件時的邏輯關系

如果定義了兩個acl條件:

acl? hhhsrc 172.20.0.0/16
acl? mmm 1:102 ? (定義的端口1-102的范圍)

if hhh mmm ? (或的關系)
if hhh || mmm ? (與的關系)
if ! hhh mmm (!是取反,只對第一個條件hhh取反然后再對第二個條件或)

 

通過acl條件實現動靜分離:

frontend main ?? (定義的第一個組并且有限定條件)
bind :80
default_backend hhh
acl url_img path_beg /images
acl url_img path_end .jpg .png .jpeg

frontend main ? (定義第二個組)
bind :80
default_backend websers

backend hhh ? ? ? ? ? (引用第一個組)
balance roundrobin
server web1 182.168.60.21:80

backend websers ? (引用第二個組)
balance roundrobin
server webser1 192.168.60.20
server webser1 192.168.60.20

在上述案例中定義的第一個組然后指定代理到的服務器上,實現了將靜態的圖片訪問只代理到后端的一臺服務器上去。

QQ截圖20180710212147

 

上述定義中的path的含義

path_beg :? 前綴匹配
path_dir :? 字串的匹配
path_dom :? 子域名匹配
path_end : 路徑的后綴匹配
path_len : 路徑的長度匹配
path_reg : 路徑的正則表達式匹配
path_sub :? 字串的匹配

示例:

path_beg /images/
path_end .jpg .jpeg .png .gif
path_reg ^/images.*\.jpeg$
path_sub image
path_dir jpegs
path_dom ilinux
/images/jpegs/20180312/logo.jpg

 

 

 

 

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/102520

(0)
無所謂無所謂
上一篇 2018-07-09
下一篇 2018-07-10

相關推薦

  • nginx

    nginx(web server,web reverse proxy) http事務:request <—-> response request: <method> <URL> <version> <HEADERS> … <body> response: <…

    2018-06-29
  • lamp

    1.phpmyadmin 需要phpadmin包組和yum安裝lamp 創建phpadmin配置文件 安裝字符集包組 開啟mysql服務 創建測試賬號 編寫測試phpmysql 最后開啟httpd服務 測試成功 進行phpmyadmin 設置數據庫賬號 密碼 登陸成功 測試成功 2.搭建wordpress 在phpmyadmin實驗上進行 在phpmyadm…

    Linux筆記 2018-06-25
  • SElinux簡介

    本文主要介紹:SELinux概念、配置SELinux、管理文件安全標簽、管理端口標簽、管理SELinux布爾值開關、管理日志、查看SELinux幫助以及SElinux操作示例(遷移httpd服務默認目錄)

    2018-05-17
  • sed相關參數及用法

    sed 行編輯器 -n:靜默模式,不再默認顯示模式空間中的內容 -i :直接修改原文件 -e SCRIPT -e SCRIPT :可以同時執行多個腳本 -f /file路徑 可以執行filescript處理文件 -r 表示可以使用擴展正則表達式 sed /模式配置/ startline,endline 比如: 1,100 /正則表達式/ /^root/ 精確…

    Linux筆記 2018-04-15
  • 使用until和while分別實現

    使用until和while分別實現192.168.0.0/24
    網段內,地址是否能夠ping通,弱ping通則輸出”success!”,若ping不通則輸出”fail!”

    Linux筆記 2018-06-15
  • 正則表達式

      文本處理三劍客 grep:文本過濾 grep,egrep(支持擴展正則表達式),fgrep(不支持正則表達式) grep ?需要查找的字符串 查找的目標文件 -v #取反 -i #忽略大小寫 -n #顯示目標字符串的行號 -c #顯示匹配到的次數 -p #靜默模式 -o #僅顯示匹配到的字符串 -A# #顯示包含關鍵字的后續幾行 -B# #顯示…

    2018-04-06
欧美性久久久久