Linux之HAProxy

互聯(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評(píng)論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評(píng)論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,644評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容

  • HAProxy簡介HAProxy配置ACL配置TCP轉(zhuǎn)發(fā)SSL轉(zhuǎn)發(fā) 一、HAProxy簡介: (一)HAProxy...
    哈嘍別樣閱讀 1,561評(píng)論 0 0
  • Haproxy是既可以工作在7層也能工作在4層的反代工具.Haproxy的功能: 路由HTTP請(qǐng)求到后端服務(wù)器,基...
    uangianlap閱讀 1,565評(píng)論 0 1
  • 目錄: HAProxy是什么 HAProxy的核心能力和關(guān)鍵特性 HAProxy的安裝和運(yùn)行 使用HAProxy搭...
    kelgon閱讀 79,963評(píng)論 9 159
  • 參考文檔: 1.haproxy:http://www.haproxy.org/ 本文涉及haproxy的安裝,并做...
    Netonline閱讀 2,437評(píng)論 1 51
  • 一.HAProxy介紹 HAProxy: 是法國人Willy Tarreau開發(fā)的一個(gè)開源軟件,是 一款應(yīng)對(duì)客戶端...
    楠人幫閱讀 1,126評(píng)論 0 2