標籤:haproxy 設定檔
HAProxy的設定檔分為兩個部份,第一部份為全域配置段(Global setting),第二部份為代理配置段(Proxies)。 全域配置段設定haproxy運行工作的一些特性,這一部份主要有與進程管理和安全相關的指令,與效能調整的指令和與調試相關的指令。而代理配置段又可以分為四個部份,一是"defaults <name>",這一部份設定的指令代表公用配置,即如果在後邊的配置中沒有顯式的指定某個參數及值時,預設時就採用defaults中設定的值;二是"frontend <name>",這是定義一個面向用戶端的配置,定義一系列監聽的通訊端,這些通訊端可接受用戶端請求並與之建立串連;三是"backednd <name>",這是定義上遊伺服器組,定義一系列“後端”伺服器,代理將會將對應用戶端的請求轉寄至這些伺服器;四是"listen <name>",通過關聯“前端”和“後端”定義了一個完整的代理,通常只對TCP流量有用,這是一個可以替代frontend和backend的指令,即可以把前端與後端都定義在一個listen中。所有代理的名稱只能使用大寫字母、小寫字母、數字、-(中線)、_(底線)、.(點號)和:(冒號),此外,ACL名稱會區分字母大小寫。
下面對全域配置段中的部份指令作一個簡單介紹:
與進程管理和安全相關的指令:
chroot <jail dir>
修改haproxy的工作目錄至指定的目錄並在放棄許可權之前執行chroot()操作,可以提升haproxy的安全層級,不過需要注意的是要確保指定的目錄為空白目錄且任何使用者均不能有寫入權限;
daemon
讓haproxy以守護進程的方式工作於後台,其等同於“-D”選項的功能,當然,也可以在命令列中以“-db”選項將其禁用;
gid <number>
以指定的GID運行haproxy,建議使用專用於運行haproxy的GID,以免因許可權問題帶來風險;
group <group name>
同gid,不過指定的組名;
log <address> <facility> [max level [min level]]
定義全域的syslog伺服器,最多可以定義兩個;
log-send-hostname [<string>]
在syslog資訊的首部添加當前主機名稱,可以為“string”指定的名稱,也可以預設使用當前主機名稱;
nbproc <number>
指定啟動的haproxy進程個數,只能用於守護進程模式的haproxy;預設只啟動一個進程,鑒於調試困難等多方面的原因,一般只在單進程僅能開啟少數檔案描述符的情境中才使用多進程模式;
pidfile <pidfile>
pid檔案路徑;
uid <number>
以指定的UID身份運行haproxy進程;
user <user name>
同uid <number>,只是這裡指定的是使用者名稱稱;
ulimit-n <number>
設定每進程所能夠開啟的最大檔案描述符數目,預設情況下其會自動進行計算,因此不推薦修改此選項;
stats socket <path>
定義統計資訊儲存位置
node <name>
定義當前節點的名稱,用於HA情境中多haproxy進程共用同一個IP地址時;
description <text>
當前執行個體的描述資訊。
這些與進程管理與安全相關的指令大多都不用指定,只作瞭解即可。
與效能調整相關的指令:
maxconn <number>
設定每個haproxy進程所接受的最大並發串連數,其等同於命令列選項“-n”,在“進程管理與安全相關的指令”中的"“ulimit-n”的值會根據maxconn自動調整;
maxpipes <number>
haproxy使用pipe完成基於核心的tcp報文重組,此選項則用於設定每進程所允許使用的最大pipe個數;每個pipe會開啟兩個檔案描述符,因此,“ulimit -n”自動計算時會根據需要調大此值;預設為maxconn/4,其通常會顯得過大;
noepoll
在Linux系統上禁用epoll機制;
nokqueue
在BSE系統上禁用kqueue機制;
nopoll
禁用poll機制;
nosepoll
在Linux禁用啟發學習法epoll機制;
nosplice
禁止在Linux通訊端上使用核心tcp重組,這會導致更多的recv/send系統調用;不過,在Linux 2.6.25-28系列的核心上,tcp重組功能有bug存在;
spread-checks <0..50, in percent>
在haproxy後端有著眾多伺服器的情境中,在精確的時間間隔後統一對眾伺服器進行健康情況檢查可能會帶來意外問題;此選項用於將其檢查的時間間隔長度上增加或減小一定的隨機時間長度,這是對健康檢測的一種最佳化;
tune.bufsize <number>
設定buffer的大小,同樣的記憶體條件小,較小的值可以讓haproxy有能力接受更多的並發串連,較大的值可以讓某些應用程式使用較大的cookie資訊;預設為16384,其可以在編譯時間修改,不過強烈建議使用預設值;
tune.chksize <number>
設定檢查緩衝區的大小,單位為位元組;更大的值有助於在較大的頁面中完成基於字串或模式的文本尋找,但也會佔用更多的系統資源;不建議修改;
tune.maxaccept <number>
設定haproxy進程核心調度運行時一次性可以接受的串連的個數,較大的值可以帶來較大的吞吐率,預設在單進程模式下為100,多進程模式下為8,設定為-1可以禁止此限制,一般不建議修改;
tune.maxpollevents <number>
設定一次系統調用可以處理的事件最大數,預設值取決於OS;其值小於200時可節約頻寬,但會略微增大網路延遲,而大於200時會降低延遲,但會稍稍增加網路頻寬的佔用量;
tune.maxrewrite <number>
設定為首部重寫或追加而預留的緩衝空間,建議使用1024左右的大小;在需要使用更大的空間時,haproxy會自動增加其值;
tune.rcvbuf.client <number>
定義在用戶端核心通訊端接收緩衝區的大小,單位為位元組,建議不要調整此值;
tune.rcvbuf.server <number>
設定核心通訊端中服務端接收緩衝的大小,單位為位元組;強烈推薦使用預設值;
tune.sndbuf.client
定義在用戶端核心通訊端發送緩衝區的大小,單位為位元組,建議不要調整此值;
tune.sndbuf.server:
定義在服務端核心通訊端發送緩衝區的大小,單位為位元組,建議不要調整此值;
上邊的這些指令大多也是作為瞭解即可,在實際中並不常會調整這些參數。
與調試相關的指令:
debug
在調度haproxy時可以啟用此參數,但在生產環境不應該啟用;
quiet
haproxy啟動後不會顯示任何相關資訊,這與在命令列啟動haproxy時加上參數“-q”相同
與代理相關的配置涉及太多,官方文檔中用了一個章節來介紹,在各代理配置段的各個部份都有相應的可用指令,請參考http://cbonte.github.io/haproxy-dconv/configuration-1.4.html#4,這裡我以一個設定檔執行個體來簡單介紹。
[[email protected] haproxy]# cat haproxy.cfg#---------------------------------------------------------------------# Example configuration for a possible web application. See the# full configuration options online.## http://haproxy.1wt.eu/download/1.4/doc/configuration.txt##---------------------------------------------------------------------#---------------------------------------------------------------------# 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 ##設定把haproxy的日誌發往本地的rsyslog服務 log 127.0.0.1 local2#把haproxy進程限定在chroot指定的目錄運行,此目錄許可權需要設定為除了haproxy使用者有寫入權限限外其他的使用者沒有,並且是一個空目錄 chroot /var/lib/haproxy#pid檔案的路徑 pidfile /var/run/haproxy.pid#設定proxy允許的最大並發串連數,如果在backend中沒有指定server的maxconn的值,則可繼承此值 maxconn 4000#運行haproxy的使用者 user haproxy#運行haproxy的組 group haproxy#讓haproxy以守護進程運行在後台 daemon # turn on stats unix socket#定義統計資訊儲存的位置 stats socket /var/lib/haproxy/stats#---------------------------------------------------------------------# common defaults that all the ‘listen‘ and ‘backend‘ sections will# use if not designated in their block#---------------------------------------------------------------------#預設設定defaults#設定haproxy的運行模式,有三種{http|tcp|health} mode http#設定日誌繼承全域配置段的設定 log global#表示開始開啟記錄http請求的日誌功能,詳細的應查看官方文檔的的關鍵字矩陣部分 option httplog#如果產生了一個空串連,那這個空串連的日誌將不會記錄 option dontlognull#開啟http協議中伺服器端關閉功能,使得支援長串連,使得會話可以被重用,使得每一個日誌記錄都會被記錄 option http-server-close#如果上遊伺服器上的應用程式想記錄發起請求的用戶端的IP地址,HAProxy會把用戶端的IP資訊發送給上遊伺服器,在HTTP請求中添加"X-Forwarded-For"欄位,但當是haproxy自身的健康檢測機制去訪問上遊伺服器時是不應該把這樣的訪問日誌記錄到日誌中的,所以用except來排除127.0.0.0,即haproxy身。 option forwardfor except 127.0.0.0/8#當與上遊伺服器的會話失敗(伺服器故障或其他原因)時,把會話重新分發到其他健康的伺服器上,當原來故障的伺服器恢複時,會話又被定向到已恢複的伺服器上。還可以用"retries"關鍵字來設定在判定會話失敗時的嘗試串連的次數, option redispatch#當haproxy負載很高時,自動結束掉當前隊列處理比較久的連結 option abortonclose#向上遊伺服器嘗試串連的最大次數,超過此值就認為後端伺服器不可用 retries 3#用戶端發送http請求的逾時時間 timeout http-request 10s#當上遊伺服器在高負載響應haproxy時,會把haproxy發送來的請求放進一個隊列中,timeout queue定義放入這個隊列的逾時時間。 timeout queue 1m#haproxy與後端伺服器連線逾時時間,如果在同一個區域網路可設定較小的時間 timeout connect 5s#定義用戶端與haproxy串連後,資料轉送完畢,不再有資料轉送,即非活動串連的逾時時間 timeout client 1m#定義haproxy與上遊伺服器非活動串連的逾時時間 timeout server 1m#設定新的http請求串連建立的最大逾時時間,時間較短時可以儘快釋放出資源,節約資源 timeout http-keep-alive 10s#健康檢測的時間的最大逾時時間 timeout check 10s#最大並發串連數 maxconn 3000#---------------------------------------------------------------------# main frontend which proxys to the backends#---------------------------------------------------------------------#frontend main *:5000# acl url_static path_beg -i /static /images /javascript /stylesheets# acl url_static path_end -i .jpg .gif .png .css .js## use_backend static if url_static# default_backend app#######監控統計版面設定############listen stats#監聽連接埠 bind 0.0.0.0:1088#日誌設定,層級有[emerg alert crit err warning notice info debug] log 127.0.0.1 local3 err#啟用統計報告,是一個預設的參數 stats enable#隱藏統計頁面上haproxy的版本資訊 stats hide-version#統計頁面重新整理時間 stats refresh 10s#進入統計頁面密碼框上的提示文字 stats realm Haproxy\ Stats#進入統計頁面輸入的使用者名稱及密碼 stats auth admin:admin#統計頁面的登陸uri地址 stats uri /admin?admin#當統計頁面開啟後再開啟對後端伺服器的管理功能 stats admin if TRUE####frontend配置######frontend server1_80_in#綁定任何地址的80連接埠 bind *:80#haproxy以http的方式運行 mode http#定義兩個能實現匹配靜態檔案的acl acl is_static path_beg -i /static /image /javascript acl is_static path_end -i .html .png .jpg .gif .jpeg .css .js#定義當匹配到is_static的acl後轉寄到static_servers這個後端伺服器組 use_backend static_servers if is_static#預設的轉寄規則 default_backend app_servers####backend配置#######backend static_servers#靜態伺服器組採用roundrobin演算法 balance roundrobin#定義上遊伺服器及各個屬性,對伺服器每隔1500毫秒進行一次健康檢測,如果連續3次無法連絡伺服器那就認為此伺服器故障,如果串連連續檢測到2次務都線上,那就認為此服務可用 server nod2_static_192.168.0.202 192.168.0.202:80 minconn 10 maxconn 2000 check inter 1500 fastinter 1000 downinter 1000 rise 2 fall 3 weight 1backend app_servers#定義動態伺服器的調度演算法為source,並提供了hash-type參數,使source成為一個動態演算法 balance source hash-type consistent server nod1_appserver_192.168.0.201 192.168.0.201:80 minconn 10 maxconn 200 check inter 1500 rise 3 fall 3 weight 1
這個設定檔實現了簡單的動靜分離的效果,各個配置行的意義都在設定檔中給出了注釋。
參考資料:
馬哥課堂筆記
http://cbonte.github.io/haproxy-dconv/configuration-1.4.html
本文出自 “專註營運,與Linux共舞” 部落格,請務必保留此出處http://zhaochj.blog.51cto.com/368705/1659610
HAProxy設定檔詳解