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:自定義的名稱可以隨便寫)
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代理服務器上操作)
添加下面的內容:
systemctl restart rsyslog ? (重新啟動日志服務功能)
ss -nult ? (查看514端口是否起來)
tail /var/log/haproxy.log? (再次查看日志已經有記錄了)
此時客戶端的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服務
static-rr:(靜態輪詢)
靜態算法:不支持權重的運行時調整及慢啟動;后端主機數量無上限;
leastconn:
推薦使用在具有較長會話的場景中,例如MySQL、LDAP,SSH等;(除非用戶斷開連接,自己不會主動斷開連接的)
first:
根據服務器在列表中的位置,自上而下進行調度;前面服務器的連接數達到上限,新請求才會分配給下一臺服務;(當列表中的第一個web服務器連接滿了之后,再去調度到下一個web服務器上)
source:
源地址hash算法;
a .將來自同一個的地址請求發往同一個的后端服務器。(靜態)
存在的缺點:當后臺服務器有一臺宕機了,源地址綁定就會無法訪問后臺的web服務了。無法實現高可用的效果。
b .還有一致性的哈希算法:同nginx的一致性哈希算法相同。(動態)
具體使用那種算法取決于第二個參數:hash-type
source map-based:除權取余法,哈希數據結構是靜態的數組;
source? consistent:一致性哈希,哈希數據結構是一個環。
uri? :對來自同一個url的請求就綁定到后臺同一個服務器上,不論請求來自哪一個IP地址。(提升緩存命中率,如果有緩存服務器,就需要使用這種算法)
對URI的左半部分做hash計算,并由服務器總權重相除以后派發至某挑出的服務器;
具體使用那種算法取決于第二個參數:hash-type
map-based:除權取余法,哈希數據結構是靜態的數組;
consistent:一致性哈希,哈希數據結構是一個環。
url_param:對用戶請求的uri的<params>部分中的參數的值作hash計算,并由服務器總權重相除以后派發至某挑出的服務器;通常用于追蹤用戶,以確保來自同一個用戶的請求始終發往同一個后臺服務器。
(當你登陸淘寶時,當打開多個頁面后,會出現一段長的字符和數字,其中就包含用戶名,然后就對用戶名相對應的那一串字符做哈希值計算)
把同一個用戶的請求始終發往后臺的某一個固定的服務器上??梢詫τ脩糇龇诸惢蛘咴诎l布新版的站點時,對某些不重要的客戶所對應的服務器首先更新做測試服務。
具體使用那種算法取決于第二個參數:hash-type
map-based:除權取余法,哈希數據結構是靜態的數組;
consistent:一致性哈希,哈希數據結構是一個環
hdr(<name>):對于每個http請求,此處由<name>指定的http首部將會被取出做hash計算; 并由服務器總權重相除以后派發至某挑出的服務器;沒有有效值的會被輪詢調度; 例如對瀏覽器進行區分,將PC端和移動端進行區分,代理到后臺指定的服務器上去。
具體使用那種算法取決于第二個參數:hash-type
map-based:除權取余法,哈希數據結構是靜態的數組;
consistent:一致性哈希,哈希數據結構是一個環
?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次
disabled:標記為不可用;做灰度發布時使用。
標記為disabled 服務器就下線了。
backup:設定當前server為備用服務器;
cookie <value>:為當前server指定其cookie值,用于實現基于cookie的會話黏性;
redir <prefix>:將發往此server的所有GET和HEAD類的請求重定向至指定的URL;
例如:server webser1 192.168.60.20 ? redir http://www.baidu.com
weight <weight>:權重,默認為1;
統計接口啟用相關的參數:
stats enable
啟用統計頁;基于默認的參數啟用stats page;
在配置文件里添加
在瀏覽器上輸入路徑:http://172.20.49.2/haproxy?stats (就可以查看了)
此狀態頁面包括信息較多,為了防止其他人看到可以采取以下方式來避免:
a .? 通過設定特別的端口號:(不使用默認的端口號)
在瀏覽器上輸入:http://172.20.49.2:9556/haproxy?stats (就可以查看了)
b . 通過設定用戶登陸的密碼和賬號來限制其他人的查看:
在瀏覽器上輸入:http://172.20.49.2:9556/haproxy?stats? 然后輸入用戶名和密碼就可以查看了。
c . 通過自定義的uri路徑別名來控制其他人的登陸:
在瀏覽器上輸入:http://172.20.49.2:9556/admin ? 就可以查看了。
開啟狀態頁面的修改參數的端口:
然后打開狀態頁面:
set stats to DRAIN? (排干模式):新的用戶請求不在接收,老的用戶請求繼續等待執行完畢。
health: disable checks? :禁止做健康狀態檢測
實驗:將后端服務器的ssh服務通過haproxy代理,互聯網通過haproxy來連接ssh服務。
添加配置到主配置文件里:
在客戶端連接代理服務器,通過代理服務的轉發,到后臺真實連接的主機上去。
ssh root@172.20.49.2 -p? 2222 ? ? (IP地址為代理服務器的外網地址,-p后面跟的是代理服務器代理的端口號,在配置文件里定義的)
小結:haproxy支持多種服務的代理轉發。
haproxy代理服務器后端的web服務器如何查看到客戶端訪問的具體的IP地址
編輯后端服務器的配置文件:
如后端安裝的是httpd服務:
vim /etc/httpd/conf/httpd.conf
systemctl restart httpd (重新啟動HTTP服務)
客戶端再次通過haproxy代理訪問后端服務器,就可以在后端服務器的日志信息里看到客戶端的IP地址了。
tail /var/log/httpd/access_log
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
在上述案例中定義的第一個組然后指定代理到的服務器上,實現了將靜態的圖片訪問只代理到后端的一臺服務器上去。
上述定義中的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