互聯(lián)網(wǎng)架構(gòu)基礎(chǔ)知識(shí)
一、網(wǎng)站常見架構(gòu)
-
負(fù)載層
-
頁面緩存層
-
web層
-
數(shù)據(jù)層
二、運(yùn)維法則
-
緩存為王
-
盡量在前端(緩存層)響應(yīng)完成
-
應(yīng)用和服務(wù)解耦
三、網(wǎng)站灰度發(fā)布的步驟
-
先下線需要下線的服務(wù)器(markdown)
-
停止服務(wù)(需要等待keepalive的時(shí)長后)
-
關(guān)閉監(jiān)控(以免監(jiān)控大量的報(bào)警)
-
替換程序(全量、增量)
- 一般情況下將多個(gè)版本軟鏈至指定的目錄,必要是可以回滾操作
-
啟動(dòng)服務(wù)
-
warmingup(預(yù)熱)
- 對(duì)頁面進(jìn)行訪問請(qǐng)求,進(jìn)行緩存數(shù)據(jù)環(huán)節(jié),以免大流量打跨服務(wù)器,冷數(shù)據(jù)的服務(wù)上線會(huì)導(dǎo)致雪崩(可能需要依賴一此程序進(jìn)行訪問預(yù)熱)
-
測試
- 進(jìn)行測試操作,以免有未發(fā)現(xiàn)的bug
-
加監(jiān)控
-
上線
-
review
- 檢查復(fù)審,查看日志
四、web常見術(shù)語
-
UV : User view
-
PV : Page view
衡量一個(gè)網(wǎng)站的穩(wěn)定性和承載能力,一般比較好的網(wǎng)站每個(gè)UV平均15個(gè)PV
-
活動(dòng)連接數(shù)
連接狀態(tài)為Established,一般情況下,使用日PV/18(小時(shí)),可以計(jì)算一個(gè)粗略的活動(dòng)連接數(shù),在短鏈的情況下,活動(dòng)連接數(shù)與QPS比較接近
-
QPS(并發(fā))
連接狀態(tài)為:time_wait close_wait,是NEW的請(qǐng)求
-
并發(fā)峰值
測量一個(gè)網(wǎng)站的重要指標(biāo),架構(gòu)設(shè)計(jì)承載需要是最高并發(fā)峰值的5到10倍
代理的基礎(chǔ)知識(shí)
代理的作用
-
1、web緩存
以提供加速
-
2、反向代理
以提高安全性和流量分發(fā)
-
3、內(nèi)容路由
根據(jù)流量及內(nèi)容類型等將請(qǐng)求轉(zhuǎn)發(fā)至特定服務(wù)器
-
4、轉(zhuǎn)碼器
后端到代理服務(wù)器沒有壓縮,代理到客戶端進(jìn)行壓縮
代理的重要性能指標(biāo)
-
會(huì)話率
每秒建立新的連接速率
-
會(huì)話并發(fā)能力
-
數(shù)據(jù)率
數(shù)據(jù)傳輸率
LB實(shí)現(xiàn)方式
-
TCP層
- LVS
- haproxy
- nginx
-
應(yīng)用層
- haproxy
- nginx
- ats
- apache
KV數(shù)據(jù)的常用算法
-
取模法
對(duì)K進(jìn)行hash計(jì)算,有幾臺(tái)cache服務(wù)器就取模多少數(shù)值,可以將每次的請(qǐng)求分散至不同的服務(wù)器
* 缺點(diǎn)
添加和刪除服務(wù)器,都會(huì)帶來全部緩存失效
-
一致性hash算法
事先虛擬一個(gè)環(huán),環(huán)上從零開始計(jì)數(shù),到232個(gè)數(shù)值結(jié)束,其使用32位二進(jìn)制表示,把每個(gè)服務(wù)器按照特定的方式計(jì)算(如IP地址進(jìn)行hash計(jì)算),其hash的結(jié)果一定會(huì)在環(huán)上的0到232之間,服務(wù)器計(jì)算的結(jié)果就分散在此環(huán)之上。緩存數(shù)據(jù)時(shí),對(duì)key進(jìn)行hash計(jì)算,按順時(shí)針找到離的最近的一個(gè)節(jié)點(diǎn)存放數(shù)據(jù)。如果其中一臺(tái)cache server檔機(jī),只會(huì)影響此服務(wù)器上緩存的數(shù)據(jù),不會(huì)讓緩存全部失效
* 缺點(diǎn):
hash環(huán)的偏斜(多個(gè)節(jié)點(diǎn)計(jì)算后,節(jié)點(diǎn)都在環(huán)上較近位置且在環(huán)的一側(cè)位置),可以使用虛擬服務(wù)器方法解決(將一個(gè)節(jié)點(diǎn)虛擬成多個(gè)節(jié)點(diǎn),再分散到環(huán)上)
Linux之HAProxy
一、HAProxy簡介
HAProxy提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理 ,支持虛擬機(jī),它是免費(fèi)、快速并且可靠的一種解決方案。HAProxy特別適用于高負(fù)載且需要持久連接或7層處理機(jī)制的web站點(diǎn),這些站點(diǎn)通常又要會(huì)話保持或七層處理,HAProxy運(yùn)行在時(shí)下的硬件上,完全可以支持?jǐn)?shù)以萬計(jì)的并發(fā)連接,并且它的運(yùn)行模式使得它可以很簡單安全的融合進(jìn)你當(dāng)前的架構(gòu)中,同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。
HAProxy實(shí)現(xiàn)了一種事件驅(qū)動(dòng)、單一進(jìn)行模型,此模型支持非常大的并發(fā)連接數(shù),多進(jìn)行或多線程模型受內(nèi)存限制、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制,很少處理數(shù)千并發(fā)連接。事件驅(qū)動(dòng)模型因?yàn)樵谟懈玫馁Y源和時(shí)間管理的用戶端(user-space)實(shí)現(xiàn)所有這些任務(wù),所以沒有這些問題。 此模型的弊端是,在多核系統(tǒng)上,這些程序通常擴(kuò)展性較差,這就是為什么它們必須進(jìn)行優(yōu)化以使每次個(gè)CPU時(shí)間片(Cycle)做更多的工作。
二、HAProxy主要版本:
1.4版本
其衍生于1.2版本,并提供額外的新特性,其中大多數(shù)是期待已久的
- 1、客戶端側(cè)的長連接(Client-side keep-alive)
- 2、TCP加速(TCP speedups)
- 3、響應(yīng)池(response buffering)
- 4、RDP協(xié)議(remote desktop protocol)
- 5、基于源的粘性(Source-based stickiness)
- 6、更好的數(shù)據(jù)統(tǒng)計(jì)接口(a much better stats interfaces)
- 7、更詳細(xì)的健康狀態(tài)檢測機(jī)制(more verbose health checks)
- 8、基于流量的健康評(píng)估機(jī)制(traffic-based health)
- 9、支持http認(rèn)證
- 10、服務(wù)器管理命令行接口(server management from the CLI)
- 11、基于ACL的持久性(ACL-based persistence)
- 12、日志分析器
1.3版本
其衍生于1.2版本,并提供了額外的新特性
- 1、內(nèi)容交換(Content switching):基于任何請(qǐng)求標(biāo)準(zhǔn)挑選服務(wù)器池
- 2、ACL:編寫內(nèi)容交換規(guī)則
- 3、負(fù)載均衡算法(load-balancing algorithms):更多的算法支持
- 4、內(nèi)容檢測(Content ipspection):阻止非授權(quán)協(xié)議
- 5、透明代理(transparent proxy):在Linux系統(tǒng)上允許使用客戶端IP地址連入服務(wù)器
- 6、內(nèi)核TCP拼接(kernel TCP splicing):無copy方式在客戶端和服務(wù)端之間的轉(zhuǎn)發(fā)數(shù)據(jù)以實(shí)現(xiàn)G級(jí)別的數(shù)據(jù)速率
- 7、分層設(shè)計(jì)(layered design):分別實(shí)現(xiàn)套接字、TCP、HTTP處理以提供更好的健壯性,更好的處理機(jī)制及便捷的演進(jìn)能力
- 8、快速、公平調(diào)度器(fast and fair scheduler):為某些任務(wù)指定優(yōu)先級(jí)可實(shí)現(xiàn)更好的Qos
- 9、會(huì)話速率限制(session rate limiting):適用于托管環(huán)境
三、支持的平臺(tái)及OS
- x86、x86_64、Alpha、SPARC、MIPS及PARISC平臺(tái)上的Linux 2.4
- x86、x86_64、ARM (ixp425)及PPC64平臺(tái)上的Linux2.6
- UltraSPARC 2和3上的Sloaris 8/9
- Opteron和UltraSPARC平臺(tái)上的Solaris 10
- x86平臺(tái)上的FreeBSD 4.1-8
- 386, amd64, macppc, alpha, sparc64和VAX平臺(tái)上的OpenBSD 3.1-current
若要獲得最高性能,需要在Linux2.6或打了epoll補(bǔ)丁的Linux2.4上運(yùn)行haproxy 1.2.5以上的版本,haproxy1.1l默認(rèn)使用了polling系統(tǒng)為select(),其處理的文件數(shù)達(dá)數(shù)千個(gè)時(shí)性能便會(huì)急劇下降,1.2和1.3版本默認(rèn)為poll(),在有些操作系統(tǒng)上可能會(huì)有性能方面的問題,但在Solaris上表現(xiàn)相當(dāng)不錯(cuò),HAProxy1.3在Linux2.6及打了epoll補(bǔ)丁的Linux 2.4上默認(rèn)使用了epoll,在FreeBSD上使用Kqueue,這兩種機(jī)制在任何負(fù)載上都能提供恒定的性能表現(xiàn),在較新版本的Linux2.6(>=2.6.27.19)上,HAProxy還能夠使用splice()系統(tǒng)調(diào)用在接口間無復(fù)制地轉(zhuǎn)發(fā)任何數(shù)據(jù),這甚至可達(dá)到10Gbps性能
HAProxy常規(guī)版本選擇建議
- Linux 2.6.32及之后版本上運(yùn)行HAProxy1.4
- 打了epoll補(bǔ)丁的Linux 2.4上運(yùn)行HAProxy1.4
- FreeBSD上運(yùn)行HAProxy1.4
- Solaris 10上運(yùn)行Haproxy 1.4
四、HAProxy實(shí)現(xiàn)高性能的方法
-
1、單進(jìn)程、事件驅(qū)動(dòng)模型
顯著降低了上下文切換的開銷及內(nèi)存占用
-
2、O(1)事件檢查器(event checker)
允許其在高并發(fā)連接中對(duì)任何連接的任何事件實(shí)現(xiàn)即時(shí)探測
-
3、單緩沖(single buffering)機(jī)制
以不復(fù)制任何數(shù)據(jù)的方式完成讀寫操作,這會(huì)節(jié)約大量的CPU時(shí)鐘周期及內(nèi)存帶寬
-
4、splice()系統(tǒng)調(diào)用機(jī)制
在2.6(>=2.6.27.19)Haproxy可以實(shí)現(xiàn)零復(fù)制轉(zhuǎn)發(fā)(zero-copy forwarding),在Linux3.5及以上的OS中還可以實(shí)現(xiàn)零復(fù)制啟動(dòng)(zero-starting)
-
5、優(yōu)秀的內(nèi)存分配器
內(nèi)存分配器在固定大小的內(nèi)存池中實(shí)現(xiàn)即時(shí)內(nèi)存分配,能夠顯著減少創(chuàng)建一個(gè)會(huì)話的時(shí)長
-
6、樹形存儲(chǔ)
側(cè)重于使用作者多年前開發(fā)的彈性二叉樹算法,實(shí)現(xiàn)了以O(shè)(log(N))的低開銷來保持啟動(dòng)計(jì)時(shí)器命令、保持運(yùn)行隊(duì)列命令及管理輪詢及最少連接隊(duì)列
-
7、優(yōu)化的HTTP首部分析機(jī)制
優(yōu)化的首部分析功能避免了HTTP首部分析過程中重讀任何區(qū)域
-
8、精心地降低了昂貴的系統(tǒng)調(diào)用
大部分工作在用戶空間完成,如時(shí)間讀取、緩沖聚合及文件描述符的啟用和禁用等
所有的這些細(xì)微之處的優(yōu)化實(shí)現(xiàn)了在中等規(guī)模負(fù)載之上依然有著相當(dāng)?shù)偷腃PU負(fù)載,甚至于在非常高的負(fù)載場景中,5%的用戶空間占用率和95%的系統(tǒng)空間占用率也是非常普遍的現(xiàn)象,這意味著HAProxy進(jìn)程消耗比系統(tǒng)空間消耗低20倍以上。因此,對(duì)OS進(jìn)行性能調(diào)優(yōu)是非常重要的。即使用戶空間的占用率提高一倍,其CPU占用率也僅為10%,這也解釋了為何7層處理對(duì)性能影響有限這一現(xiàn)象。由此,在高端系統(tǒng)上HAProxy的7層性能可輕易超過硬件負(fù)載均衡設(shè)備。
在生產(chǎn)環(huán)境中,在7層處理上使用HAProxy作為昂貴的高端硬件負(fù)載均衡設(shè)備故障故障時(shí)的緊急解決方案也時(shí)長可見。硬件負(fù)載均衡設(shè)備在“報(bào)文”級(jí)別處理請(qǐng)求,這在支持跨報(bào)文請(qǐng)求(request across multiple packets)有著較高的難度,并且它們不緩沖任何數(shù)據(jù),因此有著較長的響應(yīng)時(shí)間。對(duì)應(yīng)地,軟件負(fù)載均衡設(shè)備使用TCP緩沖,可建立極長的請(qǐng)求,且有著較大的響應(yīng)時(shí)間。
配置HAProxy
安裝haproxy
- yum install haproxy
配置程序及配置文件
/etc/haproxy/haproxy.cfg
/usr/sbin/haproxy
/etc/haproxy/haproxy.cfg
配置文件格式
-
global配置段
用于設(shè)定全局配置參數(shù)
-
proxy相關(guān)配置段
如defaults,listen,frontend和backend
時(shí)間格式
一此包含了值的參數(shù)表示時(shí)間,如超時(shí)時(shí)長,這些值一般以毫秒為單位,但也可以使用其它的時(shí)間單位后綴
-
us
: 微秒(microseconds),即1/1000000秒 -
ms
: 毫秒(milliseconds),即1/1000秒 -
s
: 秒(seconds) -
m
: 分鐘(minutes) -
h
: 小時(shí)(hours) -
d
: 天(days)
示例:
global
daemon
maxconn 25600
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend servers
backend servers
server server1 127.0.0.1:8080 maxconn 32
配置了一個(gè)監(jiān)聽在所有接口的80端口上HTTP proxy服務(wù),它轉(zhuǎn)發(fā)所有的請(qǐng)求至后端監(jiān)聽在127.0.0.1:8000上的"server"
全局配置
global配置中的參數(shù)為進(jìn)程級(jí)別的參數(shù),且通常與運(yùn)行的OS相關(guān)
-
進(jìn)程管理及安全相關(guān)的參數(shù)
-
chroot <jail dir>
- 修改haproxy的工作目錄至指定的目錄并在放棄權(quán)限之前執(zhí)行chroot()操作,可以提升haproxy的安全級(jí)別,不過需要注意的是要確保指定的目錄為空目錄且任何用戶均不能有寫權(quán)限
-
daemon
- 讓Haproxy以守護(hù)進(jìn)程的方式工作于后臺(tái)
-
gid <number>
- 以指定的GID運(yùn)行haproxy
-
group <group name>
- 同GID,不過指定的是組名
-
log <address <facility> [max level [min level]]
- 定義全局的syslog服務(wù)器,最多可定義兩個(gè)
-
log-send-hostname [string]
- 在syslog信息的首部添加當(dāng)前主機(jī)名,默認(rèn)是使用當(dāng)前主機(jī)名
-
nbporc <number>
- 指定啟動(dòng)的haproxy進(jìn)程個(gè)數(shù),默認(rèn)只啟動(dòng)一個(gè),一般只在單進(jìn)程僅能打開少數(shù)文件描述符的場景才使用多進(jìn)程模式
-
pidfile <file>
- pid文件
-
uid
- 以指定的UID身份運(yùn)行進(jìn)程
-
unlimit -n
- 設(shè)定每進(jìn)程能夠打開的最大文件描述符數(shù)據(jù),默認(rèn)情況下其會(huì)自動(dòng)進(jìn)行計(jì)算,不推薦修改此項(xiàng)
-
user
- 同UID,但使用用戶名
-
stats socket /var/lib/haproxy/status
- 訪問stats時(shí),使用socket調(diào)用的文件
-
node
- 定義當(dāng)前節(jié)點(diǎn)的名稱,用于HA場景中多haproxy進(jìn)程共享同一個(gè)IP地址時(shí)使用
-
description
- 當(dāng)前實(shí)例的描述信息
-
-
性能調(diào)整相關(guān)的參數(shù)
-
maxconn <number>
- 設(shè)定每個(gè)haproxy進(jìn)程所接受的最大并發(fā)連接數(shù),等同于ulimit -n
-
maxpipes <number>
- haproxy使用Pipe完成基于內(nèi)核的TCP報(bào)文重組,用于設(shè)定每進(jìn)行所允許使用的最大Pipe個(gè)數(shù),每個(gè)pipe使用兩個(gè)文件描述符
-
noepoll
- 在linux系統(tǒng)上禁用epoll機(jī)制
-
nokqueue
- 在BSD系統(tǒng)上禁用kqueue機(jī)制
-
nopoll
- 禁用poll機(jī)制
-
nosepoll
- 在linux禁用啟發(fā)式epoll機(jī)制
-
nosplice
- 禁止在Linux套按字上使用內(nèi)核tcp重組,這會(huì)導(dǎo)致更多的recv/send系統(tǒng)調(diào)用,不過在2.6.25-28系統(tǒng)的內(nèi)核上,tcp重組功能有bug
-
spread-checks <0..50,in percent>
- 在haproxy后端有著眾多服務(wù)器的場景中,在精確的時(shí)間間隔后統(tǒng)一對(duì)眾服務(wù)器進(jìn)行健康狀況檢查可能會(huì)帶來意外問題;此選項(xiàng)用于將其檢查的時(shí)間間隔長度上增加或減小一定的隨機(jī)時(shí)長
-
tune.bufsize <number>
- 設(shè)定buffer的大小,同樣的內(nèi)存條件下,較小的值可以讓haproxy有能力接受更多的并發(fā)連接,較大的值可以讓某些應(yīng)用程序使用較大的cookie信息;默認(rèn)為16384,其可以在編譯時(shí)修改,不過強(qiáng)烈建議使用默認(rèn)值
-
tune.chksize <number>
- 檢查緩沖的大小,專用檢測用戶的請(qǐng)求首部信息,建議默認(rèn)值
-
tune.maxaccept <number>
- 一次性一次交由多少個(gè)請(qǐng)求給進(jìn)程
-
tune.maxpollevents <number>
- 設(shè)定一次系統(tǒng)調(diào)用可以處理的事件最大數(shù),默認(rèn)值取決于OS;其值小于200時(shí)可節(jié)約帶寬,但會(huì)略微增大網(wǎng)絡(luò)延遲,而大于200時(shí)會(huì)降低延遲,但會(huì)稍稍增加網(wǎng)絡(luò)帶寬的占用量;
-
tune.maxrewrite <number>
- 設(shè)定首部重寫或追加而預(yù)留的緩沖空間,建議使用1024左右的大小,在需要使用更大的空間時(shí),haproxy全自動(dòng)增加其值
debug
: 調(diào)度模式quiet
: 靜默模式
-
代理
代理相關(guān)的配置可以有如下配置段
-
defaults <name>
- 用于為所有其它配置段提供默認(rèn)參數(shù),這配置默認(rèn)配置參數(shù)可由下一個(gè)defaults所重新設(shè)定
-
frontend <name>
- 用于定義一系列監(jiān)聽的套拼字,這些套按字可接受客戶端請(qǐng)求并與之建立連接
-
backend <name>
- 用于定義一系列“后端”服務(wù)器,代理將會(huì)將對(duì)應(yīng)客戶端的請(qǐng)求轉(zhuǎn)發(fā)至這些服務(wù)器
-
listen <name>
- 通過關(guān)聯(lián)“前端”和“后端”定義了一個(gè)完整的代理 ,通常只對(duì)TCP流量有效
所有代理的名稱只能使用大寫字母、小寫字母、數(shù)字、-(中線)、_(下劃線)、.(點(diǎn)號(hào))和:(冒號(hào))。此外,ACL名稱會(huì)區(qū)分字母大小寫。
配置文件中的關(guān)鍵字參考
1、balance
- 用法
balance <algorithm> [arguments]
balance url_param <param> [check_post [<max_wait>]]
- 功能
- 定義負(fù)載算法,可用于defaults,listen,backend段
支持的算法類型:
- 動(dòng)態(tài):權(quán)重可動(dòng)態(tài)調(diào)整,服務(wù)器自己調(diào)整
- 靜態(tài):調(diào)整權(quán)重不會(huì)實(shí)時(shí)生效,只有重啟才會(huì)生效
調(diào)度算法
-
roundrobin
基于權(quán)重進(jìn)行輪叫,在服務(wù)器的處理時(shí)間保持均勻分布時(shí),這是最平衡、最公平的算法。此算法是動(dòng)態(tài)的,這表示其權(quán)重可以在運(yùn)行時(shí)進(jìn)行調(diào)整,不過,在設(shè)計(jì)上,每個(gè)后端服務(wù)器僅能最多接受4128個(gè)連接
-
static-rr
基于權(quán)重進(jìn)行輪叫,與roundrobin類似,但是為靜態(tài)方法,在運(yùn)行時(shí)調(diào)整其服務(wù)器權(quán)重不會(huì)生效;不過,其在后端服務(wù)器連接數(shù)上沒有限制
-
leastconn
新的連接請(qǐng)求被派發(fā)至具有最少連接數(shù)目的后端服務(wù)器;在有著較長時(shí)間會(huì)話的場景中推薦使用此算法,如LDAP、SQL等,其并不太適用于較短會(huì)話的應(yīng)用層協(xié)議,如HTTP;此算法是動(dòng)態(tài)的,可以在運(yùn)行時(shí)調(diào)整其權(quán)重
-
source
將請(qǐng)求的源地址進(jìn)行hash運(yùn)算,并由后端服務(wù)器的權(quán)重總數(shù)相除后派發(fā)至某匹配的服務(wù)器;這可以使得同一個(gè)客戶端IP的請(qǐng)求始終被派發(fā)至某特定的服務(wù)器;不過,當(dāng)服務(wù)器權(quán)重總數(shù)發(fā)生變化時(shí),如某服務(wù)器宕機(jī)或添加了新的服務(wù)器,許多客戶端的請(qǐng)求可能會(huì)被派發(fā)至與此前請(qǐng)求不同的服務(wù)器;常用于負(fù)載均衡無cookie功能的基于TCP的協(xié)議;其默認(rèn)為靜態(tài),不過也可以使用hash-type修改此特性
-
uri
對(duì)URI的左半部分(“問題”標(biāo)記之前的部分)或整個(gè)URI進(jìn)行hash運(yùn)算,并由服務(wù)器的總權(quán)重相除后派發(fā)至某匹配的服務(wù)器;這可以使得對(duì)同一個(gè)URI的請(qǐng)求總是被派發(fā)至某特定的服務(wù)器,除非服務(wù)器的權(quán)重總數(shù)發(fā)生了變化;此算法常用于代理緩存或反病毒代理以提高緩存的命中率;需要注意的是,此算法僅應(yīng)用于HTTP后端服務(wù)器場景;其默認(rèn)為靜態(tài)算法,不過也可以使用hash-type修改此特性
-
uri-param
通過<argument>為URL指定的參數(shù)在每個(gè)HTTP GET請(qǐng)求中將會(huì)被檢索;如果找到了指定的參數(shù)且其通過等于號(hào)“=”被賦予了一個(gè)值,那么此值將被執(zhí)行hash運(yùn)算并被服務(wù)器的總權(quán)重相除后派發(fā)至某匹配的服務(wù)器;此算法可以通過追蹤請(qǐng)求中的用戶標(biāo)識(shí)進(jìn)而確保同一個(gè)用戶ID的請(qǐng)求將被送往同一個(gè)特定的服務(wù)器,除非服務(wù)器的總權(quán)重發(fā)生了變化;如果某請(qǐng)求中沒有出現(xiàn)指定的參數(shù)或其沒有有效值,則使用輪叫算法對(duì)相應(yīng)請(qǐng)求進(jìn)行調(diào)度;此算法默認(rèn)為靜態(tài)的,不過其也可以使用hash-type修改此特性
-
hdr(name)
對(duì)于每個(gè)HTTP請(qǐng)求,通過<name>指定的HTTP首部將會(huì)被檢索;如果相應(yīng)的首部沒有出現(xiàn)或其沒有有效值,則使用輪叫算法對(duì)相應(yīng)請(qǐng)求進(jìn)行調(diào)度;其有一個(gè)可選選項(xiàng)“use_domain_only”,可在指定檢索類似Host類的首部時(shí)僅計(jì)算域名部分(比如通過www.magedu.com來說,僅計(jì)算magedu字符串的hash值)以降低hash算法的運(yùn)算量;此算法默認(rèn)為靜態(tài)的,不過其也可以使用hash-type修改此特性
rdp-cookie
rdp-cookie(name)
示例1:
backend app
balance hdr(User-Agent)
server srv1 172.16.36.70:80 check
server srv2 172.16.36.71:80 check
server srv3 172.16.36.60:80 check
server srv4 172.16.36.61:80 check
示例2:
backend app
balance uri
hash-type consistent
server srv1 172.16.36.70:80 check
2、bind
-
用法
bind [<address>]:<port-range> [,...]
bind [<address>]:<port_range> [, ...] interface <interface>
-
功能
- 此指令僅能用于frontend和listen區(qū)段,用于定義一個(gè)或幾個(gè)監(jiān)聽的套接字
frontend main
bind *:80
bind *:8080
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
3、mode
-
用法
mode {tcp|http|health}
-
功能
- 設(shè)定實(shí)例的運(yùn)行模式或協(xié)議。當(dāng)實(shí)現(xiàn)內(nèi)容交換時(shí),前端和后端必須工作于同一種模式(一般說來都是HTTP模式),否則將無法啟動(dòng)實(shí)例
tcp:實(shí)例運(yùn)行于純TCP模式,在客戶端和服務(wù)器端之間將建立一個(gè)全雙工的連接,且不會(huì)對(duì)7層報(bào)文做任何類型的檢查;此為默認(rèn)模式,通常用于SSL、SSH、SMTP等應(yīng)用;
http:實(shí)例運(yùn)行于HTTP模式,客戶端請(qǐng)求在轉(zhuǎn)發(fā)至后端服務(wù)器之前將被深度分析,所有不與RFC格式兼容的請(qǐng)求都會(huì)被拒絕;
health:實(shí)例工作于health模式,其對(duì)入站請(qǐng)求僅響應(yīng)“OK”信息并關(guān)閉連接,且不會(huì)記錄任何日志信息;此模式將用于響應(yīng)外部組件的健康狀態(tài)檢查請(qǐng)求;目前業(yè)講,此模式已經(jīng)廢棄,因?yàn)閠cp或http模式中的monitor關(guān)鍵字可完成類似功能
4、hash-type
- 用法
hash-type <method>
- 功能
- 定義用于將hash碼映射至后端服務(wù)器的方法;其不能用于frontend區(qū)段;可用方法有map-based和consistent,在大多數(shù)場景下推薦使用默認(rèn)的map-based方法
map-based:hash表是一個(gè)包含了所有在線服務(wù)器的靜態(tài)數(shù)組。其hash值將會(huì)非常平滑,會(huì)將權(quán)重考慮在列,但其為靜態(tài)方法,對(duì)在線服務(wù)器的權(quán)重進(jìn)行調(diào)整將不會(huì)生效,這意味著其不支持慢速啟動(dòng)。此外,挑選服務(wù)器是根據(jù)其在數(shù)組中的位置進(jìn)行的,因此,當(dāng)一臺(tái)服務(wù)器宕機(jī)或添加了一臺(tái)新的服務(wù)器時(shí),大多數(shù)連接將會(huì)被重新派發(fā)至一個(gè)與此前不同的服務(wù)器上,對(duì)于緩存服務(wù)器的工作場景來說,此方法不甚適用。
consistent:hash表是一個(gè)由各服務(wù)器填充而成的樹狀結(jié)構(gòu);基于hash鍵在hash樹中查找相應(yīng)的服務(wù)器時(shí),最近的服務(wù)器將被選中。此方法是動(dòng)態(tài)的,支持在運(yùn)行時(shí)修改服務(wù)器權(quán)重,因此兼容慢速啟動(dòng)的特性。添加一個(gè)新的服務(wù)器時(shí),僅會(huì)對(duì)一小部分請(qǐng)求產(chǎn)生影響,因此,尤其適用于后端服務(wù)器為cache的場景。不過,此算法不甚平滑,派發(fā)至各服務(wù)器的請(qǐng)求未必能達(dá)到理想的均衡效果,因此,可能需要不時(shí)的調(diào)整服務(wù)器的權(quán)重以獲得更好的均衡性。
backend app
balance uri
hash-type consistent
server srv1 172.16.36.70:80 check
server srv2 172.16.36.71:80 check
server srv3 172.16.36.60:80 check
server srv4 172.16.36.61:80 check
-
5、log
- 用法
log global
log <address> <facility> [<level>][<minlevel>]
- 功能
- 為每個(gè)實(shí)例啟用事件和流量日志,因此可用于所有區(qū)段。每個(gè)實(shí)例最多可以指定兩個(gè)log參數(shù),不過,如果使用了“l(fā)og global”且"global"段已經(jīng)定了兩個(gè)log參數(shù)時(shí),多余了log參數(shù)將被忽略
- 用法
-
6、maxconn
- 用法
maxconn <conns>
- 功能
- 設(shè)定一個(gè)前端的最大并發(fā)連接數(shù),因此,其不能用于backend區(qū)段。對(duì)于大型站點(diǎn)來說,可以盡可能提高此值以便讓haproxy管理連接隊(duì)列,從而避免無法應(yīng)答用戶請(qǐng)求。當(dāng)然,此最大值不能超出“global”段中的定義。此外,需要留心的是,haproxy會(huì)為每個(gè)連接維持兩個(gè)緩沖,每個(gè)緩沖的大小為8KB,再加上其它的數(shù)據(jù),每個(gè)連接將大約占用17KB的RAM空間。這意味著經(jīng)過適當(dāng)優(yōu)化后,有著1GB的可用RAM空間時(shí)將能維護(hù)40000-50000并發(fā)連接。如果為<conns>指定了一個(gè)過大值,極端場景下,其最終占據(jù)的空間可能會(huì)超出當(dāng)前主機(jī)的可用內(nèi)存,這可能會(huì)帶來意想不到的結(jié)果;因此,將其設(shè)定了一個(gè)可接受值方為明智決定。其默認(rèn)為2000
- 用法
-
7、default_backend
- 用法
maxconn <conns>
- 功能
- 在沒有匹配的"use_backend"規(guī)則時(shí)為實(shí)例指定使用的默認(rèn)后端,因此,其不可應(yīng)用于backend區(qū)段。在"frontend"和"backend"之間進(jìn)行內(nèi)容交換時(shí),通常使用"use-backend"定義其匹配規(guī)則;而沒有被規(guī)則匹配到的請(qǐng)求將由此參數(shù)指定的后端接收。
- 用法
frontend main *:80
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -j .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
-
8、server
-
用法:
server <name> <address>[:port][param*]
-
功能:
- 為后端聲明一個(gè)server,因此不能用于defaults和frontend區(qū)段
-
服務(wù)器或默認(rèn)服務(wù)器參數(shù)
- backup : 設(shè)定為備用服務(wù)器,即sorry server
- check : 健康狀態(tài)檢測
- inter <delay> : 設(shè)定健康狀態(tài)檢測時(shí)的時(shí)間,默認(rèn)為2000,單位為ms
- fall <number> : 從up-->down(soft state-->hard state),默認(rèn)為3次
- rise <number> : 從down-->up的次數(shù)
- cookie <value> : 為server設(shè)定個(gè)cookie值,會(huì)話級(jí)別的cookie,基于cookie的原綁定方式,會(huì)在響應(yīng)報(bào)文中的cookie頭后添加相應(yīng)的cookie值
- maxconn :此服務(wù)器接受的并發(fā)連接最大數(shù)值
- maxqueue : 請(qǐng)求隊(duì)列的最大長度
- observer <mode> : 通過流量判斷后端服務(wù)器的狀態(tài),默認(rèn)為禁用,其支持4層和7層
- weight <number> : 默認(rèn)為1,最大為256,0表示不被調(diào)用
- redir <prefix> : 啟用重定向功能,所有發(fā)往此服務(wù)器的GET和HEAD請(qǐng)求,均以302響應(yīng),在prefix最后不能加/,且不能使用相對(duì)地址
server srv1 172.16.100.6:80 redir http://imageserver.zhenping.me check
-
-
9、opttion check
-
用法:
option httpchk
option httpchk <uri>
option httpchk <method> <uri>
-
option httpchk <mothod> <uri> <version>
:不能用于frontend段
-
功能
- 健康狀態(tài)檢測方法定義
-
backend https_relay
mode tcp
option check OPTIONS * HTTP/1.1\r\nHost:\ www.zhenping.me
server apache1 172.16.36.70 check prot 80
對(duì)server172.16.36.70使用option check定義的方法進(jìn)行檢測,但可以使用80端口進(jìn)行健康狀態(tài)檢測
-
10、capture request header
- 用法:
capture request header <name> len <length>
- 功能:
- 捕獲并記錄指定的請(qǐng)求首部最近 一次出現(xiàn)時(shí)的第一個(gè)值,僅能用于“frontend”和“l(fā)isten”區(qū)段。捕獲的首部值使用花括號(hào){}括起來后添加進(jìn)日志中。如果需要捕獲多個(gè)首部值,它們將以指定的次序出現(xiàn)在日志文件中,并以豎線“|”作為分隔符。不存在的首部記錄為空字符串,最常需要捕獲的首部包括在虛擬主機(jī)環(huán)境中使用的“Host”、上傳請(qǐng)求首部中的“Content-length”、快速區(qū)別真實(shí)用戶和網(wǎng)絡(luò)機(jī)器人的“User-agent”,以及代理環(huán)境中記錄真實(shí)請(qǐng)求來源的“X-Forward-For”。可以捕獲的請(qǐng)求首部的個(gè)數(shù)沒有限制,但每個(gè)捕獲最多只能記錄64個(gè)字符。為了保證同一個(gè)frontend中日志格式的統(tǒng)一性,首部捕獲僅能在frontend中定義。
- 用法:
-
11、capture response header
- 用法
capture response header <name> len <length>
- 功能
- 捕獲并記錄響應(yīng)首部,其格式和要點(diǎn)同請(qǐng)求首部
- 用法
-
11、stats enable
- 用法
stats enable
- 功能
- 啟用基于程序編譯時(shí)默認(rèn)設(shè)置的統(tǒng)計(jì)報(bào)告,不能用于frontend段,
listen statistics #定義listen區(qū)段名稱 bind *:9090 #定義監(jiān)聽端口 stats enable #啟用stats stats hide-version #隱藏版本 stats refresh 10s #刷新時(shí)間 stats uri /haproxyadmin?stats #stats的URI地址 stats realm "HAProxy\ statistics" #stats的登陸提示信息 stats auth zhenping:123321 # 定義用戶名和密碼 stats admin if TRUE #如果用戶驗(yàn)證成功,就給予admin權(quán)限
- 用法
-
12、option httplog
- 用法
option httplog [clf]
- 功能
- 啟用記錄HTTP請(qǐng)求,會(huì)話狀態(tài)和計(jì)時(shí)器的功能,默認(rèn)情況下,日志輸入格式非常簡陋,因?yàn)槠鋬H包括源地址、目標(biāo)地址和實(shí)例名稱,而“option httplog”參數(shù)將會(huì)使得日志格式變得豐富許多,其通常包括但不限于HTTP請(qǐng)求、連接計(jì)時(shí)器、會(huì)話狀態(tài)、連接數(shù)、捕獲的首部及cookie、“frontend”、“backend”及服務(wù)器名稱,當(dāng)然也包括源地址和端口號(hào)等
- 用法
-
13 option logasap
-
14 no option logasap
- 功能:
啟用或禁用提前將http請(qǐng)求記入日志,不能用于frontend段
listen http_proxy 0.0.0.0:80 mode http option httplog option logasap log 172.16.100.9 local2
- 功能:
-
15、option forwardfor
- 用法:
option forwardfor [except <network>][header <name>][if-none]
- 功能
允許在發(fā)往服務(wù)器的請(qǐng)求首部中插入“X-Forwarded-For”首部,些參數(shù)定義后,需要在后端服務(wù)器的記錄日志格式修改為記錄X-Forwarded-For的信息,方可記錄下客戶端IP地址
if-none: 僅在此首部不存在時(shí)才將其添加至請(qǐng)求報(bào)文中。
frontend www mode http option forwardfor except 127.0.0.1/8
- 用法:
-
16、errorfile
- 用法:
errorfile <code> <file>
- 功能
- 在用戶請(qǐng)求不存的頁面時(shí),返回一個(gè)頁面文件給客戶端而非由haproxy生成的錯(cuò)誤代碼;可用于所有段中
- <code> : 指定對(duì)HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有200、400、403、408、500、502、503和504
- <file>:指定用于響應(yīng)的頁面文件
errorfile 400 /etc/haproxy/errorpages/400badreq.http errorfile 403 /etc/haproxy/errorpages/403forbid.http errorfile 503 /etc/haproxy/errorpages/503sorry.http
- 用法:
-
17、errorloc和errorloc302
- 用法:
errorloc <code> <url>
errorloc302 <code> <url>
- 功能
- 請(qǐng)求錯(cuò)誤時(shí),返回一個(gè)HTTP重定向至某URL的信息;可用于所有配置段中。
- <code>:指定對(duì)HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有200、400、403、408、500、502、503和504;
- <url>:Location首部中指定的頁面位置的具體路徑,可以是在當(dāng)前服務(wù)器上的頁面的相對(duì)路徑,也可以使用絕對(duì)路徑;需要注意的是,如果URI自身錯(cuò)誤時(shí)產(chǎn)生某特定狀態(tài)碼信息的話,有可能會(huì)導(dǎo)致循環(huán)定向
- 用法:
需要留意的是,這兩個(gè)關(guān)鍵字都會(huì)返回302狀態(tài)碼,這將使得客戶端使用同樣的HTTP方法獲取指定的URL,對(duì)于非GET方法的場景(如POST)來說會(huì)產(chǎn)生問題,因?yàn)榉祷乜蛻舻腢RL是不允許使用GET以外的其它方法的。如果的確有這種問題,可以使用errorloc303來返回303狀態(tài)碼給客戶端
-
18、errorloc303
- 用法:
errorloc303 <code> <url>
- 功能
- 請(qǐng)求錯(cuò)誤時(shí),返回一個(gè)HTTP重定向至某URL的信息給客戶端,可用于所有配置段中
- <code>:指定對(duì)HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有400、403、408、500、502、503和504;
- <url>:Location首部中指定的頁面位置的具體路徑,可以是在當(dāng)前服務(wù)器上的頁面的相對(duì)路徑,也可以使用絕對(duì)路徑;需要注意的是,如果URI自身錯(cuò)誤時(shí)產(chǎn)生某特定狀態(tài)碼信息的話,有可能會(huì)導(dǎo)致循環(huán)定向
- 用法:
backend webserver
server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie serv01
server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie serv02
errorfile 403 /etc/haproxy/errorpages/sorry.htm
errorfile 503 /etc/haproxy/errorpages/sorry.htm
-
19、option http-server-close
-
20、no option http-server-close
- 功能:由客戶端到服務(wù)端的連接設(shè)定,當(dāng)HAProxy的保持連接開啟的時(shí)候,需要把這項(xiàng)開起來,服務(wù)器主動(dòng)斷開連接,其是向報(bào)文中添加connection:close的頭信息,客戶端收到后,將發(fā)出斷開連接請(qǐng)求
-
21、option http-pretend-keepalive
- 功能:當(dāng)啟用http-server-close或option forceclose代理服務(wù)器添加一個(gè)connect:close(就是短連接模式)的頭部信息,轉(zhuǎn)發(fā)至后端server,當(dāng)后端的server收到報(bào)文后,無法識(shí)別或拒絕響應(yīng)。所以需要代理 服務(wù)器就需要假裝是保持連接模式,而不發(fā)送connection:close的信息頭部,在使用了option forceclose,http-server-close的選項(xiàng)時(shí),就應(yīng)該啟用http-pretend-keepalive選項(xiàng)
-
22 option httpclose
-
23 no option httpcolse
- 功能:啟用或禁用被動(dòng)http連接功能,是否允許服務(wù)端斷開連接,跟http-server-close一樣
-
24、option redispatch
-
25、no option redispatch
- 是否允許做重新調(diào)度,如果做了保持功能的情況下,被訪問的主機(jī)壞了,是不是允許把請(qǐng)求調(diào)到其它主機(jī)
-
26、redirect
- 功能:做重定向
acl clear dst_port 80 acl secure dst_port 80 acl login_page url_beg /login acl logout url_beg /logout acl uid_given url_reg /login?userid=[^&]+ acl cookie_set hdr_sub(cookie) SEEN=1 redirect prefix https://zhenping.me set-cookie SEEN=1 if !cookie_set redirect prefix https://zhenping.me if login_page !secure redirect location http://www.zhenping.me if !login_page secure redirect location / clear-cookie USERID= if logout
-
27、reqadd
- 功能:向請(qǐng)求報(bào)文添加首部
acl is-ssl dst_port 81 reqadd X-Proto:\ SSL if is-ssl 如果是通過81訪問的請(qǐng)求,就向請(qǐng)求首部添加X-Proto: SSL的首部信息
-
28、rspadd
- 向響應(yīng)報(bào)文添加首部
rspadd Via:\ node1.zhenping.me
-
29、timeout http-keep-alive
- 用法:
timeout http-keep-alive 10s
- 功能:
- 開啟haproxy的保持連接功能
- 用法:
-
30、option dontlognull
- 功能:不記錄自己的健康狀態(tài)檢查的日志
配置案例
http服務(wù)器配置示例
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 30000
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
frontend http-in
bind *:80
mode http
log global
option httpclose
option logasap
option dontlognull
capture request header Host len 20
capture request header Referer len 60
default_backend servers
frontend healthcheck
bind :1099
mode http
option httpclose
option forwardfor
default_backend servers
backend servers
balance roundrobin
server websrv1 192.168.10.11:80 check maxconn 2000
server websrv2 192.168.10.12:80 check maxconn 2000
負(fù)載均衡MySQL服務(wù)的配置示例
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode tcp
log global
option httplog
option dontlognull
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 600
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
frontend mysql
bind *:3306
mode tcp
log global
default_backend mysqlservers
backend mysqlservers
balance leastconn
server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
ACL
Haproxy的ACL用于實(shí)現(xiàn)基于請(qǐng)求報(bào)文的首部、響應(yīng)報(bào)文的內(nèi)容或其它的環(huán)境狀態(tài)信息做出轉(zhuǎn)發(fā)決策,這大大增加了其配置彈性,其配置法則通常分為兩步,首先先定義ACL,即定義一個(gè)測試條件,而后在條件得到滿足時(shí)執(zhí)行特定的動(dòng)作,如阻止請(qǐng)求或轉(zhuǎn)發(fā)至某特定的后端
-
定義ACL的語法格式
-
acl <aclname> <criterion> [flags] [operator] <value> ....
-
<aclname>
: ACL名稱,區(qū)分字符大小寫,且其只能包含大小寫字母、數(shù)字、-(連接線)、_(下劃線)、.(點(diǎn)號(hào))和:(冒號(hào));haproxy中,acl可以重名,這可以把多個(gè)測試條件定義為一個(gè)共同的acl -
<criterion>
: 測試標(biāo)準(zhǔn),即對(duì)什么信息發(fā)起測試;測試方式可以由[flags]指定的標(biāo)志進(jìn)行調(diào)整;而有些測試標(biāo)準(zhǔn)也可以需要為其在<value>之前指定一個(gè)操作符[operator] -
[flags]
: 目前haproxy的acl支持的標(biāo)志位有3個(gè)-
-i
: 不區(qū)分<value>中模式字符的大小寫 -
-f
: 從指定的文件中加載模式 -
--
: 標(biāo)志符的強(qiáng)制結(jié)束符,在模式中的字符串像標(biāo)記符時(shí)使用
-
-
<value>
: acl測試條件支持的值有以下四類- 整數(shù)或整數(shù)范圍:如1024:65535表示從1024至65535;僅支持使用正整數(shù)(如果出現(xiàn)類似小數(shù)的標(biāo)識(shí),其為通常為版本測試),且支持使用的操作符有5個(gè),分別為eq、ge、gt、le和lt;
- 字符串:支持使用“-i”以忽略字符大小寫,支持使用“\”進(jìn)行轉(zhuǎn)義;如果在模式首部出現(xiàn)了-i,可以在其之前使用“--”標(biāo)志位;
- 正則表達(dá)式:其機(jī)制類同字符串匹配;
- IP地址及網(wǎng)絡(luò)地址
-
-
同一個(gè)acl中可以指定多個(gè)測試條件,這些測試條件需要由邏輯操作符指定其關(guān)系。條件間的組合測試關(guān)系有三種:“與”(默認(rèn)即為與操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)
-
常用的測試標(biāo)準(zhǔn)(criteria)
-
be_sess_rate <integer>
用于測試指定的backend上會(huì)話創(chuàng)建的速率(即每秒創(chuàng)建的會(huì)話數(shù))是否滿足指定的條件;常用于在指定backend上的會(huì)話速率過高時(shí)將用戶請(qǐng)求轉(zhuǎn)發(fā)至另外的backend,或用于阻止攻擊行為。例如:
backend dynamic mode http acl being_scanned be_sess_rate gt 50 redirect location /error_pages/denied.html if being_scanned
-
fe_sess_rate <integer>
用于測試指定的frontend(或當(dāng)前frontend)上的會(huì)話創(chuàng)建速率是否滿足指定的條件;常用于為frontend指定一個(gè)合理的會(huì)話創(chuàng)建速率的上限以防止服務(wù)被濫用。例如下面的例子限定入站郵件速率不能大于50封/秒,所有在此指定范圍之外的請(qǐng)求都將被延時(shí)50毫秒
frontend mail bind :25 mode tcp maxconn 500 acl too_fast fe_sess_rate ge 50 tcp-request inspect-delay 500ms tcp-request content accept if ! too_fast tcp-request content accept if WAIT_END
-
hdr(header) <string>
用于測試請(qǐng)求報(bào)文中的所有首部或指定首部是否滿足指定的條件;指定首部時(shí),其名稱不區(qū)分大小寫,且在括號(hào)“()”中不能有任何多余的空白字符。測試服務(wù)器端的響應(yīng)報(bào)文時(shí)可以使用shdr()。例如下面的例子用于測試首部Connection的值是否為close
hdr(Connection) -i close
-
method <string>
測試HTTP請(qǐng)求報(bào)文中使用的方法
-
path_beg <string>
用于測試請(qǐng)求的URL是否以<string>指定的模式開頭。下面的例子用于測試URL是否以/static、/images、/javascript或/stylesheets頭
acl url_static path_beg -i /static /images /javascript /stylesheets
-
path_end <string>
用于測試請(qǐng)求的URL是否以<string>指定的模式結(jié)尾。例如,下面的例子用戶測試URL是否以jpg、gif、png、css或js結(jié)尾
acl url_static path_end -i .jpg .gif .png .css .js
-
hdr_beg <string>
用于測試請(qǐng)求報(bào)文的指定首部的開頭部分是否符合<string>指定的模式。例如,下面的例子用記測試請(qǐng)求是否為提供靜態(tài)內(nèi)容的主機(jī)img、video、download或ftp
acl host_static hdr_beg(host) -i img. video. download. ftp.
-
hdr_end <string>
用于測試請(qǐng)求報(bào)文的指定首部的結(jié)尾部分是否符合<string>指定的模式
url_beg
url_end
path_reg
url_reg
-
總結(jié)
balance的算法:
- roundrobin
- static-rr
- leastconn
- source
- uri
- url_param
- hdr(HEADER)
acl creterion的方法
- path
- path_beg
- path_end
- src
- src_port
- dst
- dst_port
- url_beg
- url_end
- url_reg
- path_reg
- hdr(Header)
動(dòng)靜分離示例:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 30000
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
frontend http-in
bind *:80
mode http
log global
option httpclose
option logasap
option dontlognull
capture request header Host len 20
capture request header Referer len 60
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .jpeg .gif .png .css .js
use_backend static_servers if url_static
default_backend dynamic_servers
backend static_servers
balance roundrobin
server imgsrv1 172.16.200.7:80 check maxconn 6000
server imgsrv2 172.16.200.8:80 check maxconn 6000
backend dynamic_servers
cookie srv insert nocache
balance roundrobin
server websrv1 172.16.200.7:80 check maxconn 1000 cookie websrv1
server websrv2 172.16.200.8:80 check maxconn 1000 cookie websrv2
server websrv3 172.16.200.9:80 check maxconn 1000 cookie websrv3