第一節
HAProxy 是一款提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理軟件 類似於nginx功能
官方網站:http://cbonte.github.io/haproxy-dconv/
HAproxy服務器ip:192.168.1.102(這里若隱藏后端服務器的ip,這需要設定兩個ip,一個公網,一個私網)
后端服務器:192.168.1.104 192.168.1.105
再 后端服務器安裝http服務
yum install http -y
設定一個網站:
# vim /var/www/html/index.html
<h1>server 1 </h1>
systemctl start httpd.service 啟動服務
2 在haproxy 端設置
安裝haproxy
yum install haproxy –y
rpm -ql haproxy 查看安裝后產生的一些目錄文件
配置文件:/etc/haproxy/haproxy.cfg
1 全局配置段 global (設置自己的特性)
進程及安全配置
性能參數配置
2 代理配置段 proxy 幾段配置段有
default: 提供默認配置
frented: 對前端服務器的配置
backend: 對后端服務器的配置
listen:設定兩者是一一對應的,這段同時擁有前端和后端的配置
日志:它本身沒有日志功能,日志需要rsyslog日志服務來配合
日志設定: log 127.0.0.1 local2 指定本地日志服務器local2
這需要在rsyslog配置文件中做配置
vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514 基於udp
local2.* /var/log/boot.log
重啟日志服務器:systemctl restart rsyslog.service
haproxy配置文件:
(:.,$s@^[^#]@#&@g )
啟動服務:systemctl start haproxy.service
curl http://192.168.1.102 訪問測試
負載均衡:
backend websrvs
balance roundrobin 輪詢
server srv1 192.168.1.104:80 check
server srv2 192.168.1.105:80 check
重啟服務: # systemctl restart haproxy.service
訪問: curl http://192.168.1.102
在global 設置參數
1 chroot: 與安全相關
2 ca-base 若基於ssh回話的ca認證相關
3 cpu-wap cpu綁定類似於nginx的worker進程與cpu的綁定
4 log 指定日志
5 maxconn 最大單進程並發連接數
6 maxconnrate 速率
7 noepoll 不使用epoll機制
第二節參數配置
1 bind :用於來指定監聽的地址和端口 配置在frontend 和listen段之中
監聽在80端口
bind :443 ssl crt /etc/haproxy/site.pem
2 balance 用於后端服務器的調度算法
幾種調度算法有:
1) roundrobin 輪詢是動態的,指這種算法支持權重的運行時調度,
同時支持man啟動(man啟動是指,當在后端輪詢的服務器中,再添加一個服務器,他會慢 慢的將前兩台服務器上的請求慢慢移到這台上,不會一下子一堆的請求,否則容易將服務器瞬 間壓死)
2) static-rr 是靜態輪詢調度,不支持權重運行時調度, 不支持man啟動
3)leastconn最小連接 加權最小連接,計算后端服務器連接數時,要先除以它的權重得到的最小數將處理下一次請求
4)first :請求會先請求第一台,把第一台服務器請求滿了,才會請求第二台
5)source 原地址哈希
3 hash-type 哈希類型有兩種
1 取模法 : 是指將后端服務器按照權重虛擬為多個節點,當請求的哈希值對應第幾個節點,就對應做映射
缺點:一但服務器的位置發生變動,它會影響全局的取模結果
2 一致性哈希:服務器變動只會影響局部
4 uri :是指不管前端的那個客戶端請求,只要訪問相同的uri就分發給同一台服務器上
5 uri_param 基於paraneter 綁定,將同一個key的值發往到同一個服務器上
6 hdr (<name>)將http首部的名稱做哈希計算,將相同的發往相同的服務器上
如 hdr(cookie) 是基於cookie做綁定
舉例:
1 基於first
backend websrvs
balance first
server srv1 192.168.1.104:80 check maxconn 3
server srv2 192.168.1.105:80 check
壓測:ab -c 10 -n 10000 http://192.168.1.102
for I in {1..10} ; do curl http://192.168.1.102; done
用 uri
backend websrvs
balance uri
server srv1 192.168.1.104:80 check
server srv2 192.168.1.105:80 check
hash-type consistent
7 compression 壓縮
compression algo gzip 壓縮算法
compression algo deflate
compression type <text/html> 只對那些類型做壓縮
8 server 用於backend 后端中指定后端主機,后面可以跟相應的參數
1) backup 指備用
2)check 健康檢測 默認是向服務器對應端口做健康檢查
檢查的方法有:
addr:檢測使用ip地址
port:針對端口檢測
inter <delay> 連續兩次的檢測之間的時間間隔默認為2000ms
rise <count> 連續檢測多少次,結果成功則服務器標記ok 默認2次
fall <count> 連續檢測多次,結果為失敗,則標記不可用默認3次
option httpchk 對http主頁進行檢測
option httpchk OPTIONS * HTTP/1.1 \r\nHost:\ www
查看日志:
tail -f /var/log/httpd/access.log
9 maxconn 最大並發連接數
10 maxqueue 隊列,:若一個服務器最大請求是3000 ,當有3500是將多的500暫存於隊列中
11 minconn 最小連接,當設定了最小連接,他的最大連接是動態計算得出的
12 no-error : 在后端服務器故障時的策略
fastinter :快速探測
fail-check: 故障檢測
sudden-death: 告知故障
mark-down:標記為不可用
13 no-mark-down: 標記為不可用的操作
shutdown-sessions: 將之前的該服務器上的所有請求切斷
14 no-mark-up: 當服務器標記為可用是操作
15 redir :重定向 訪問時轉接到百度
16 weight 權重
第三節統計接口啟用相關參數
stats enable 啟用統計頁
訪問http://192.168.1.102/haproxy?stats
stats值設定:
stats uri : /haproxy?stats
stats realm : haproxy 認證提示信息
stats auth : no authentication
stats scope: no restriction
stats admin 條件設定
mode 定義haproxy的工作模式
tcp:基於layer4實現代理代理mysql,ssh,ssl等協議
http:僅當http協議代理用
health: 工作健康狀態的響應模式,當連接請求到達時回應ok后即斷開連接
如:定義一個ssh協議的調度
ssh root@192.168.1.102 -P 22322
會話綁定機制:會話綁定幾種方法
session sticky:
1) hash :
source ip 原地址hash
cookie 基於cookie的綁定
uri 基於uri,相同的uri 訪問相同的服務器
2) 會話集群
3)會話服務器 memcached redis
haproxy 基於cookie的會話綁定,定義在backend listen 段中
鍵值對:在請求報文的cookie中插入建 在后對找到cookis對應的值進行綁定
rewrite:重寫cookie
insert: 插入值
errorfile :自定義錯誤頁面只能針對響應碼為(200 ,400,403,408 ,500,502 ,503 ,504)
如:errorfile 400 /etc/haproxy/errorfiles/400@badreq.http 本地一個路徑
errorloc :基於uri 定義 可以定義在frontend backend listen
如: errorloc 403 http://www.magedu.com/error_pagrs/403.html
reqadd 向請求報文中添加首部
reqadd x-proxy-By:\ haproxy
rspadd 向響應報文中添加首部
rspadd x-proxy-By:\ haproxy
reqdel 向請求報文中刪除
rspdel 響應報文中刪除
rspdel ^server: .* 刪除以server開頭的所有的
第四節參數配置
連接超時時長設定:
timeout client <timeout>: 客戶端的超時時間,這指tcp的連接
timeout server <timeout>:服務端的超時時長
timeout http-keep-alive <timeout> :持久連接的持久時長
timeout http-request <timeout> 請求報文的連接時長,
timeout connect <> 創建鏈接的超時時長,連接后端
timeout client-fin <> : 面向客戶端半關閉連接的超時時長
timeout server-fin <> : 面向服務端半關閉連接的超時時長
訪問控制匹配后操作:
use_backend <backend> [if | unless] <condtion>當符合條件使用指定的backen
block : 拒絕某些連接請求
1 基於7層的http訪問控制
http-request {allow | deny} [ {if | unless } <condition>]
2 基於4層的訪問控制
tcp-request connection {accept | reject } [ {if |unless } <condition>]
如:
acl invalid_src src 172.168.1.104 定義一個acl
blocl if invalid_src 將acl的定義拒絕
errorfile 403 /etc/fstab 給它一個錯誤頁
如:ssh的訪問控制:
listen ssh
bind :22022
balance leastconn
acl incalid_src src 192.168.1.104
tcp-request connection reject if incalid_src
mode tcp
server sshsrvs1 192.168.1.104:22 check
server sshsrvs2 192.168.1.105:22 check
acl 控制定義
acl <name> <criterion> [flags] [operation] [<value>]
criterion: 檢查內容條件:
dst: ip 目標ip
dst-conn 目標 主機上套接字連接數
dst_port 目標端口
src:ip 源ip地址
src_port 源端口
flags:
-i:忽略大小寫
-n 禁止ip地址反解
-u : acl名不能重復
operation:
eq ge gt le lt
value :
boolean:布爾值
ip address / network : ip地址
string : 字符串
integer or interger range 整數 或整數范圍
如:
acl allowstats src 192.168.1.104
http-request allow if allowstats
acl all src 0.0.0.0/0.0.0.0
http-request deny if all
path 基於path的匹配
path /imgs/logos/logo.jpg 精確匹配這個路徑
path_beg /imgs 以imgs 開頭的都匹配
path_end .jpg 以jpg結尾的都匹配
path_sub logos 子串匹配
path_dir logos/logo.jpg 子路徑匹配
path_req ^/imgs/.* 以正則匹配模式匹配
path_len 字符串長度匹配
如 acl statis path_end .jpg .png
http-request allow if statis
url 的配置與path類似但它包含的信息更多
hdr 匹配報文的某個首部
如: acl bad.browsers hdr_reg (user-agent) .*curl.* 當首部包含curl 以curl名訪問拒絕
block if bad.browers
haproxy example config 配置文檔實例