Haproxy配置文件詳解

轉帖: http://docs.google.com/Doc?docid=0ActkiVDkvyOuZGhiNHI2cGhfNjNjbTVkczlncg&hl=zh_CN
摘要:HAProxy - 可靠、高性能的TCP/HTTP 負載均衡器. 這個是必學的.
 
++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++
簡介:

  軟件負載均衡通常經過兩種方式來實現:基於操做系統的軟負載實現和基於第三方應用的軟負載實現。LVS就是基於Linux操做系統實現的一種軟負載,HAProxy就是開源的而且基於第三應用實現的軟負載。css

  HAProxy相比LVS的使用要簡單不少,功能方面也很豐富。當前,HAProxy支持兩種主要的代理模式:"tcp"也即4層(大多用於郵件服務器、內部協議通訊服務器等),和7層(HTTP)。在4層模式下,HAproxy僅在客戶端和服務器之間轉發雙向流量。7層模式下,HAProxy會分析協議,而且能經過容許、拒絕、交換、增長、修改或者刪除請求(request)或者回應(response)裏指定內容來控制協議,這種操做要基於特定規則。html

  詳情能夠在HAProxy官方網站(http://haproxy.1wt.eu)能夠下載配置說明文檔(configuration.txt)和架構文件(architecture.txt)做爲參考。前端

1. HAProxy的安裝

  在「http://haproxy.1wt.eu/#down」下載HAProxy的源碼包。這裏以1.3.20版本,安裝在目錄/home/admin/haproxy爲例linux

解壓下載的源碼包

  tar -xzvf haproxy-1.3.20.tar.gz正則表達式

2.編譯安裝

  進入解壓後的源碼目錄redis

  make TARGET=linux26 PREFIX=/home/admin/haproxy install後端

  (注意,TARGET後面根據本機操做系統內核版原本填寫,PREFIX是要安裝到的目錄)api

  安裝完成後會在安裝目錄下生成doc ,sbin ,share三個文件夾。解壓的源碼文件也能夠刪除掉。瀏覽器

3.建立配置文件

在安裝目錄下創建配置文件目錄服務器

mkdir conf

在新建立的目錄下建立配置文件

vi haproxy.cfg

在建立的haproxy.cfg文件中填入

global

log 127.0.0.1 local0 info #[err warning info debug]
maxconn 4096
user admin
group admin
daemon
nbproc 1
pidfile /home/admin/haproxy/logs/haproxy.pid
defaults

maxconn 2000

contimeout 5000

clitimeout 30000

srvtimeout 30000

listen admin_stats

bind 0.0.0.0:1080

mode http

log 127.0.0.1 local0 err

stats uri /admin?stats

這個配置是能讓HAProxy工做起來的最小配置

4.啓動HAProxy

進入安裝目錄下的sbin目錄

啓動HAProxy

./haproxy -f ../conf/haproxy.cfg

經過瀏覽器訪問「http://xxx.xxx.xxx.xxx:1080/admin?stats「(xxx爲IP),看到管理頁面

5.修改haproxy啓動文件權限

(若是你是用ROOT用戶啓動HAProxy,這步能夠省略,這個步驟是爲了能讓非ROOT用戶也能經過HAProxy監聽80端口,由於LIUNX的80端口必定要使用ROOT帳戶啓動)

使用root帳戶進入sbin目錄

更改haproxy的全部者爲root

chown root:root haproxy

給haproxy增長S權限

chmod u+s haproxy

6.配置日誌

建立日誌目錄

使用非root帳戶這裏是admin帳戶建立日誌文件

mkdir /home/admin/haproxy/logs

修改操做系統的日誌配置

HAProxy能夠收集本機及其餘後端服務器日誌,可是須要在HAProxy和操做系統上做一些配置。

使用root帳戶首先修改/etc/sysconfig/syslog文件,將SYSLOGD_OPTIONS="-m 0」 修改成SYSLOGD_OPTIONS="-m 0 -r -x",支持收集遠程服務器日誌。

而後修改/etc/syslog.conf,增長以下語句:

local0.* /home/admin/haproxy/logs/haproxy.log // haproxy.log地址表明了須要存儲日誌的地址,其中local0這個級別要和haproxy.cfg配置的log級別同樣

執行service syslog restart,從新啓動系統日誌器

更改日誌文件用戶

chown admin:admin /home/admin/haproxy/logs/haproxy.log

7.建立啓動/中止腳本(若是你認爲如今的啓動腳本已經夠方便了,這步能夠省略)

爲了方便之後啓動或中止,因此編寫一個啓動腳本

在sbin目錄下建立hactl.sh

vi hactl.sh

填入一下內容

#!/bin/sh#

cd `dirname $0`/..

BASE_DIR="`pwd`"

ARGV="$@"

start()

{

echo "START HAPoxy SERVERS"

$BASE_DIR/sbin/haproxy -f $BASE_DIR/conf/haproxy.cfg

}

stop()

{

#haproxy.pid的路徑是haproxy.cfg文件中配置的

echo "STOP HAPoxy Listen"

kill -TTOU $(cat $BASE_DIR/logs/haproxy.pid)

echo "STOP HAPoxy process"

kill -USR1 $(cat $BASE_DIR/logs/haproxy.pid)

}

case $ARGV in

start)

start

ERROR=$?

;;

stop)

stop

ERROR=$?

;;

restart)

stop

start

ERROR=$?

;;

*)

echo "hactl.sh [start|restart|stop]"

esac

exit $ERROR

保存後,給hactl.sh增長可執行權限

chmod 755 hactl.sh

這樣就可使用./ hactl.sh [start|restart|stop] 的方式啓動,關閉,重啓了,若是你使用的目錄和例子中不同的話,須要本身對應的修改下以上腳本的目錄地址

通過以上1-6步驟之後HAProxy的安裝已經結束,以後就是詳細的配置下haproxy.cfg文件了

2. HAProxy的配置

HAProxy配置中分紅五部份內容,固然這些組件不是必選的,能夠根據須要選擇部分做爲配置。

global:參數是進程級的,一般和操做系統(OS)相關。這些參數通常只設置一次,若是配置無誤,就不須要再次配置進行修改

defaults:配置默認參數的,這些參數能夠被利用配置到frontend,backend,listen組件

frontend:接收請求的前端虛擬節點,Frontend能夠根據規則直接指定具體使用後端的 backend(可動態選擇)。

backend:後端服務集羣的配置,是真實的服務器,一個Backend對應一個或者多個實體服務器。

listen:Frontend和Backend的組合體。

下面是HAProxy的一些經常使用的配置,這個配置是用來講明HAProxy的一些經常使用功能的配置,具體詳細配置請查看安裝目錄下的doc目錄下的文檔文件,或者到」 http://cn.haproxy.org/」

下載中文配置說明文檔

配置文件例子:

global

#全局的日誌配置 其中日誌級別是[err warning info debug]

#local0 是日誌設備,必須爲以下24種標準syslog設備的一種:

#kern user mail daemon auth syslog lpr news

#uucp cron auth2 ftp ntp audit alert cron2

#local0 local1 local2 local3 local4 local5 local6 local7

#可是以前在/etc/syslog.conf文件中定義的是local0因此

#這裏也是用local0

log 127.0.0.1 local0 info #[err warning info debug]

#最大鏈接數

maxconn 4096

#用戶

user admin

#組

group admin

#使HAProxy進程進入後臺運行。這是推薦的運行模式

daemon

#建立4個進程進入deamon模式運行。此參數要求將運行模式設置爲"daemon"

nbproc 4

#將全部進程的pid寫入文件 啓動進程的用戶必須有權限訪問此文件。

pidfile /home/admin/haproxy/logs/haproxy.pid

defaults

#默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK

mode http

#採用http日誌格式

option httplog

#三次鏈接失敗就認爲是服務器不可用,也能夠經過後面設置

retries 3

若是cookie寫入了serverId而客戶端不會刷新cookie,

#當serverId對應的服務器掛掉後,強制定向到其餘健康的服務器

option redispatch

#當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接

option abortonclose

#默認的最大鏈接數

maxconn 4096

#鏈接超時

contimeout 5000

#客戶端超時

clitimeout 30000

#服務器超時

srvtimeout 30000

#=心跳檢測超時

timeout check 2000

#注:一些參數值爲時間,好比說timeout。時間值一般單位爲毫秒(ms),可是也能夠經過加#後綴,來使用其餘的單位。

#- us : microseconds. 1 microsecond = 1/1000000 second

#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.

#- s : seconds. 1s = 1000ms

#- m : minutes. 1m = 60s = 60000ms

#- h : hours. 1h = 60m = 3600s = 3600000ms

#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms

########統計頁面配置############

listen admin_stats

#監聽端口

bind 0.0.0.0:1080

#http的7層模式

mode http

#日誌設置

log 127.0.0.1 local0 err #[err warning info debug]

#統計頁面自動刷新時間

stats refresh 30s

#統計頁面url

stats uri /admin?stats

#統計頁面密碼框上提示文本

stats realm Gemini\ Haproxy

#統計頁面用戶名和密碼設置

stats auth admin:admin

stats auth admin1:admin1

#隱藏統計頁面上HAProxy的版本信息

stats hide-version

#######網站檢測listen定義############

listen site_status

bind 0.0.0.0:1081

mode http

log 127.0.0.1 local0 err #[err warning info debug]

#網站健康檢測URL,用來檢測HAProxy管理的網站是否能夠用,正常返回200,不正常返回500

monitor-uri /site_status

#定義網站down時的策略

#當掛在負載均衡上的指定backend的中有效機器數小於1臺時返回true

acl site_dead nbsrv(denali_server) lt 1

acl site_dead nbsrv(tm_server) lt 1

acl site_dead nbsrv(mms_server) lt 1

#當知足策略的時候返回500

monitor fail if site_dead

#若是192.168.0.252或者192.168.0.31這兩天機器掛了

#認爲網站掛了,這時候返回500,判斷標準是若是mode是

#http返回200認爲是正常的,若是mode是tcp認爲端口暢通是好的

monitor-net 192.168.0.252/31

 

########frontend配置############

frontend http_80_in

#監聽端口

bind 0.0.0.0:80

#http的7層模式

mode http

#應用全局的日誌配置

log global

#啓用http的log

option httplog

#每次請求完畢後主動關閉http通道,HA-Proxy不支持keep-alive模式

option httpclose

#若是後端服務器須要得到客戶端的真實IP須要配置次參數,將能夠從Http Header中

#得到客戶端IP

option forwardfor

###########HAProxy的日誌記錄內容配置##########

capture request header Host len 40

capture request header Content-Length len 10

capture request header Referer len 200

capture response header Server len 40

capture response header Content-Length len 10

capture response header Cache-Control len 8

 

####################acl策略定義#########################

#若是請求的域名知足正則表達式返回true -i是忽略大小寫

acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$

#若是請求域名知足trade.gemini.taobao.net 返回 true -i是忽略大小寫

acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net

##在請求url中包含sip_apiname=,則此控制策略返回true,不然爲false

acl invalid_req url_sub -i sip_apiname=

##在請求url中存在timetask做爲部分地址路徑,則此控制策略返回true,不然返回false

acl timetask_req url_dir -i timetask

#當請求的header中Content-length等於0時返回 true

acl missing_cl hdr_cnt(Content-length) eq 0

 

######################acl策略匹配相應###################

##當請求中header中Content-length等於0 阻止請求返回403

block if missing_cl

##block表示阻止請求,返回403錯誤,當前表示若是不知足策略invalid_req,或者知足策略timetask_req,則阻止請求。

block if !invalid_req || timetask_req

#當知足denali_policy的策略時使用denali_server的backend

use_backend denali_server if denali_policy

#當知足tm_policy的策略時使用tm_server的backend

use_backend tm_server if tm_policy

#reqisetbe關鍵字定義,根據定義的關鍵字選擇backend

reqisetbe ^Host:\ img dynamic

reqisetbe ^[^\ ]*\ /(img|css)/ dynamic

reqisetbe ^[^\ ]*\ /admin/stats stats

#以上都不知足的時候使用默認mms_server的backend

default_backend mms_server

#HAProxy錯誤頁面設置

errorfile 400 /home/admin/haproxy/errorfiles/400.http

errorfile 403 /home/admin/haproxy/errorfiles/403.http

errorfile 408 /home/admin/haproxy/errorfiles/408.http

errorfile 500 /home/admin/haproxy/errorfiles/500.http

errorfile 502 /home/admin/haproxy/errorfiles/502.http

errorfile 503 /home/admin/haproxy/errorfiles/503.http

errorfile 504 /home/admin/haproxy/errorfiles/504.http

##########backend的設置##############

backend mms_server

#http的7層模式

mode http

#負載均衡的方式,roundrobin平均方式

balance roundrobin

#容許插入serverid到cookie中,serverid後面能夠定義

cookie SERVERID

#心跳檢測的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳檢測HTTP的版本,XXX爲檢測時請求

#服務器的request中的域名是什麼,這個在應用的檢測URL對應的功能有對域名依賴的話須要設置

option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net

#服務器定義,cookie 1表示serverid爲1,check inter 1500 是檢測心跳頻率

#rise 3是3次正確認爲服務器可用,fall 3是3次失敗認爲服務器不可用,weight表明權重

server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1

server mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2

backend denali_server

mode http

#負載均衡的方式,source根據客戶端IP進行哈希的方式

balance source

#但設置了backup的時候,默認第一個backup會優先,設置option allbackups後

#全部備份服務器權重同樣

option allbackups

#心跳檢測URL設置

option httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net

#能夠根據機器的性能不一樣,不使用默認的鏈接數配置而使用本身的特殊的鏈接數配置

#如minconn 10 maxconn 20

server denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 3

server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3

#備份機器配置,正常狀況下備機不會使用,當主機的所有服務器都down的時候備備機會啓用

server dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3

server dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3

backend tm_server

mode http

#負載均衡的方式,leastconn根據服務器當前的請求數,取當前請求數最少的服務器

balance leastconn

option httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne

server tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3

server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3

######reqisetbe自定義關鍵字匹配backend部分#######################

backend dynamic

mode http

balance source

option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net

server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 3

server denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 3

backend stats

mode http

balance source

option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net

server denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3

server denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3

3. HA-Proxy的壓力測試結果

簡單的壓力測試採用Apache ab,500併發用戶,10w的請求總數。

總耗時(s)

TPS(#/sec)

HA-2Node

21.387

4675.61

HA-5Node

27.371

3653.37

HA-2Node爲配置了兩個節點做爲後段的服務節點,HA-5Node爲配置了5個節點做爲後端的服務處理節點。上面結果看到2個節點的HA比5個節點的速度來的快。能夠肯定的是

HAProxy的性能是跟隨backend的數量增長而降低,因此當backend節點過多時能夠考慮經過拆分到多臺HAProxy來提升性能。

相關文章
相關標籤/搜索