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
在BSD系統上禁用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,這裏我以一個配置文件實例來簡單介紹。
[root@nod0 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 1 backend 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