全局區域裡的參數是進程級別的,經常跟操作系統相關。他們一次性設置且不需要再變動。
其中一些具有命令行等價。
下面的關鍵詞可以在global區域中存在。
* Process管理和安全
- chroot-à設置global.chroot->然後執行chroot(global.chroot),用來切換進程的根目錄。
- daemon-àglobal.mode |= MODE_DAEMON->以後台方式啟動
- gid---à設置global.gid->然後執行setgid(global.gid),修改進程的組ID
- group-à通過參數獲取組的信息,ha_group = getgrnam(args[1])->進而影響global.gid = (int)ha_group->gr_gid
- log----à設置日志服務器->發送日志就發送到這些服務器
- log-send-hostname-à設置global.log_send_hostname->用於發送日志消息logmsg嵌入在裡面
- nbprocà設置global.nbproc->在daemon下執行多個進程,但是貌似文檔說不鼓勵用多個進程。
如果確實使用了多個進程,則parent退出,剩下nbproc個子進程,多個proxy會分散到這nbproc個child進程。
- pid
file-à設置global.pidfile-》用於記錄pid的文件。
- uid-----》設置global.uid-----》通過setuid(global.uid)來修改進程的uid
- ulimit-n->設置global.rlimit_nofile—》setrlimit(RLIMIT_NOFILE, &limit來設置進程的最大文件描述符數量。
- user---》設置getpwnam(args[1])進而設置global.uid-----》通過setuid(global.uid)來修改進程的uid
- statsà較復雜,略。
- node->設置global.node-》全局的一個字符串標志。
- description-》global.desc-》一段文字,無其它意義。
* Performance tuning
- maxconn---》設置global.maxconn---》規定了一個proxy最多可建立的maxconn個連接,也就是accept的次數。
- maxpipes—》設置global.maxpipes—》不詳,略。
- noepoll—》global.tune.options &= ~GTUNE_USE_EPOLL—》通過disablepoller函數禁止某個IO復用。
- nokqueue-》global.tune.options &= ~GTUNE_USE_KQUEUE—》通過disablepoller函數禁止某個IO復用。
- nopoll—》global.tune.options &= ~GTUNE_USE_POLL—》通過disablepoller函數禁止某個IO復用。
- nosepoll-》global.tune.options &= ~GTUNE_USE_SEPOLL-》通過disablepoller函數禁止某個IO復用。
- nosplice-》global.tune.options &= ~GTUNE_USE_SPLICE—》通過disablepoller禁止某個模塊。
- spread-checks-》設置global.spread_checks-》用在process_chk,服務器check函數中,具體不詳。
- tune.bufsize—》設置global.tune.bufsize-》session裡的請求體和響應體緩沖區都占用這麼大的長度。
- tune.chksize->設置global.tune.chksize—》為srv->check_data分配這麼大的緩沖區-》用於存儲check results
- tune.maxaccept-》設置global.tune.maxaccept-》event_accept中一次性最多接受maxaccept個連接。
- tune.maxpollevents-》設置global.tune.maxpollevents---》貌似是事件處理的次數限制。
- tune.maxrewrite-》設置global.tune.maxrewrite-》略
- tune.rcvbuf.client-》設置global.tune.client_rcvbuf-》event_accept時設置client端socket的接收緩沖區大小setsockopt(cfd, SOL_SOCKET, SO_RCVBUF
- tune.rcvbuf.server-》設置global.tune.server_rcvbuf-》連接服務器時設置socket的接收緩沖區大小setsockopt(fd, SOL_SOCKET, SO_RCVBUF
- tune.sndbuf.client-》設置global.tune. client_sndbuf-> event_accept時設置client端socket的發送緩沖區大小setsockopt(cfd, SOL_SOCKET, SO_SNDBUF
- tune.sndbuf.server-》不解釋,很容易理解!
* Debugging
- debugàglobal.mode |= MODE_DEBUGàdebug模式
- quiet-》global.mode |= MODE_QUIET-》略。
3.1. 進程管理和安全
chroot <jail dir>
切換當前目錄到參數,在丟棄權利前執行一個chroot()。
這個操作提升安全級別,僅僅當進程以超級用戶特權啟動才生效。
必須保證目錄是空的且任何用戶都不可寫。
daemon
使得進程已後台模式啟動,建議的模式,也可以用-D參數,可以被-db禁用。
gid <number>
改變進程的組ID,建議:組ID分配給了HAPROXY或者一些類似的後台用戶們。
HAProxy必須被屬於這個組的一個用戶啟動,或者以超級用戶啟動。
需要注意的是:略
group <group name>
與gid類似,但是使用名字從/etc/group獲取GID.
log <address> <facility> [max level [min level]]
添加一組全局syslog服務器,最多2個全局服務器可以設置。
它們將接收啟動和退出的日志,以及代理的所有日志(與log_global設置有關)。
地址可以是:
- 一個IPV4地址,UDP端口可選,如果沒有設置端口,514為默認端口(標准syslog端口)。
- 一個文件系統路徑到一個UNIX域的socket,需要注意的是:chroot,要確保路徑可訪問,
並且uid/gid可對路徑進行寫操作.
<facility> 必須是下列的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
Level可選,來過濾發出的消息,默認,所有的消息會被發送。
如果最大level被設置,僅僅當前級別的消息可以被發送。
可選的最小級別也可以設定,如果被設置,更多級別的消息???
這是為了避免發送emerg消息。
8個級別的消息:
emerg alert crit err warning notice info debug
log-send-hostname [<string>]
設置hostname字段,用於syslog頭部,如果string參數設置了,
頭部就會使用string的值,否則使用系統的hostname.
總的來說,當不是通過一個中間的syslog服務器傳遞日志時使用,或者
就是為了定制hostname.
log-tag <string>
設置global.log_tag,設置syslog裡的tag字段為此string.
默認為progname。通常就是”haproxy”,
有時,用於區分同一個主機上運行的多個進程。
nbproc <number>
創建多個進程,前提是後台模式。
默認情況下,僅僅一個進程被創建,這也是推薦的模式。
因為系統會限制每個進程的打開文件描述符的個數,
需要創建多個後台進程,使用多個後台進程難以調試,
並且確實不被鼓勵!!!
pidfile <pidfile>
寫入所有後台進程的pids到此文件,與命令行裡的”-p”等價。
文件必須可訪問。
stats socket <path> [{uid | user} <uid>] [{gid | group} <gid>] [mode <mode>]
[level <level>]
創建一個UNIX套接字,流模式,在地址path.
任何先前存在的socket將備份然後替換掉。
連接到此socket的連接會返回各種統計輸出,設置可以接收一些命令。
請咨詢9.2節。
一個可選的level參數可以用來設定可以接收的命令。
- "user" 是最低權限級別,僅僅不敏感的統計結果可以讀,不容許修改。
當不容易限制對此socket的訪問時有作用。
- "operator"是默認級別,滿足大多數使用場景,所有的數據可以被讀,僅僅非敏感的修改被
容許,比如clear max counters.
- "admin" 需要小心使用,任何操作都可以,比如clear all counters.
在支持它的平台上,可以限制對此socket的訪問,通過在uid和gid後指定數字。
或者user和group後面的參數。
也可以限制訪問(通過傳遞八進制的數值,在mode之後,類似於
chmod),
對這個socket的訪問權將從上級目錄獲取,或者從user.
stats timeout <timeout, in milliseconds>
此socket上,默認的超時時間是10秒,可以通過此選項修改。
這個值必須以毫秒單位傳遞,或者以後綴{ us, ms, s, m, h, d }.
stats maxconn <connections>
默認,統計socket被限制在10個並發,可以修改。
uid <number>
修改進程的UID。建議:UID給予了haproxy,或者給一些類似的後台用戶。
HAPROXY必須以超級用戶啟動來切換到其他UID.
ulimit-n <number>
設置每個進程的最大文件句柄數,默認,會自動計算,所以建議不要使用此選項。
user <user name>
與UID類似,只是通過查找/etc/passwd獲取UID
node <name>
當兩個或者更多進程或者server共享同一個IP地址,
通過設置不同的node名字,可以區分server.
description <text>
添加一段描述,注意,一些字符會被轉移,比如#
這段文本會被插入到HTML頁面,所以你必須避免使用
"<" and ">" 字符。
3.2. 性能相關
maxconn <number>
設置每個進程最大並發連接數為參數number.與-n等價。
Proxy將會停止接受連接當限制達到。Ulimit-n參數會根據此參數
自動調整。
maxpipes <number>
設置每個進程最大的管道數為number,管道只用於內核基礎上的tcp splice.
也就是內核級別的direct IO.
管道包含兩個文件描述符,ulimit-n值會自動增加.
默認的值是max/4,這個值看起來可以滿足大部分場景。
代碼會動態分配及釋放管道,也可以退回到標准拷貝。
所以設置此值太低的話會影響性能。
noepoll
禁止epoll,等價於-de,那麼剩下的可用事件處理系統通常是poll.
nokqueue
禁止kqueue,等價於-dk,下一個可用事件處理系統通常是poll.
nopoll
禁止poll,等價於-dp,下一個可用的是select.
應該永遠不要進制poll,因為poll總是可用的。
nosepoll
禁止sepoll,等價於-ds,下一個可用的是epoll
nosplice
禁止使用內核級的socket tcp 拷貝,等價於"-dS".
則數據將使用傳統方式和更輕便的recv/send 函數來拷貝。
內核級別的TCP拷貝在內核2.6+可用,大多數介於2.6.25 和2.6.28
有問題,並且將轉發破壞了的數據,所以,它們不應該被使用,
這個選項可以在不確定時輕松的禁止內核拷貝。
"option splice-auto", "option splice-request" 和
"option splice-response".
spread-checks <0..50, in percent>
有時,要避免以精確的同樣的間隔發送健康checks給服務器
比如,當一些服務器在同一個物理機器上,
通過這個參數,可以增加一些隨機性到check間隔裡(between 0 and +/- 50%)
值在【2,5】看起來不錯,默認值是0.
tune.bufsize <number>
設置緩沖區大小為這個值,單位字節。
較小的值可以容納更多的會話並存(同樣容量的內存)。
較大的值容許更大的cookie存在。
默認值是16384字節,並且可以build時修改。
強烈建議,不要修改此值,因為非常低的值將破壞一些服務比如統計。
較大的值將提高內存使用,可能引起系統內存不夠用。
所以如果這個值被提高,global maxconn應該降低。
tune.chksize <number>
設置check緩沖區大小為這個值,較高的值可以幫助找到字符串
或者正則表達式,通過這個可能imply更多的內存是CPU利用率。
默認值是16384,可以build時修改,不建議修改此值
tune.maxaccept <number>
進程一次最多可同時accept的最大請求數。
高的值可以提高較高的連接率,低值會偏向於已經建立的連接。
在單進程模式下,最大值為100.
盡管如此,多進程模式下,默認為8,目的是:
當一個進程被喚醒時,不會接收所有的進來的連接,而是留一部分給其它進程。
設置為-1則完全消除此限制,正常情形下,沒有必要修改此值。
tune.maxpollevents <number>
設置事件系統最多一次可處理的事件數,
默認值依賴於操作系統,200以下的話,
會輕微降低延遲(消耗網絡帶寬),200以上會提高網絡帶寬(以延遲為代價)。
tune.maxrewrite <number>
設置保留的緩沖區空間大小,單位字節,這個空間用於header重寫或者追加。
第一次讀操作永遠不會填充超過bufsize-maxrewrite大小的空間,
默認是bufsize的一半,盡管沒有太大意義,因為很少有大的header需要添加。
設置為太大的值,可以避免處理很大的報文,太小避免額外的新header到
已經很大的請求體或者POST請求體???,
一般來說,設置為1024比較明智,會自動調整到bufsize的一半如果比一半大。
所以不用擔心。
tune.rcvbuf.client <number>
tune.rcvbuf.server <number>
強制修改內核的socket接收緩沖區大小(client)/(server).
這個值適用於所有的TCP/HTTP frontends和 backends.
正常不應該被設置,默認值0可以讓內核自動調整這個值(依賴於可用的內存)
盡管如此,有時會幫助設置為很小的值比如4096,這是為了保留內核的內存(阻止緩存大量的接收的數據)
較低的值可以顯著提高CPU使用率。
tune.sndbuf.client <number>
tune.sndbuf.server <number>
強制內核socket發送緩沖區大小(client)|(server).
對所有的TCP/HTTP frontends和backends都適用. 正常情況下永遠不要設置,
默認值0可以讓內核自動調整這個值(依賴於可用的內存)
盡管如此,有時會幫助設置為很小的值比如4096,這是為了保留內核的內存(阻止緩存大量的接收的數據)
較低的值可以顯著提高CPU使用率。
另外一個可用的場景是:防止寫超時???
3.3. 調試
debug
啟用debug模式,會輸出所有的改變。並且禁止進入後台模式。
等價於-d,在生產環境中不應該使用,因為可以防止系統重啟。
quiet
啟動時不顯示任何消息,等價於-q.
3.4. Userlists
可以控制對frontend/backend/listen的訪問權,或者對http統計信息
這是通過容許僅僅認證過的用戶,為了實現這個,需要創建至少一個userlist並且定義users.
userlist <listname>
創建一份新的userlist,名字為listname.
一些獨立的用戶列表可以使用來存儲認證數據。
group <groupname> [users <user>,<user>,(...)]
添加 group <groupname> 到當前的 userlist.
可以添加users到這個group,通過逗號隔開。之前加上users關鍵詞。
user <username> [password|insecure-password <password>]
[groups <group>,<group>,(...)]
添加user <username> 到當前的userlist.
加密數據和非加密密碼都可以。加密的密碼使用crypt(3)(依賴於系統的能力)
不同的算法也支持,比如現在的libc支持MD5, SHA-256, SHA-512 以及經典的DES-based
方法。
userlist L1
group G1 users tiger,scott
group G2 users xdb,scott
user tiger password $6$k6y3o.eP$JlKBx9za9667qe4(...)xHSwRv6J.C0/D7cV91
user scott insecure-password elgato
user xdb insecure-password hello
userlist L2
group G1
group G2
user tiger password $6$k6y3o.eP$JlKBx(...)xHSwRv6J.C0/D7cV91 groups G1
user scott insecure-password elgato groups G1,G2
user xdb insecure-password hello groups G2
翻譯 理解
1 ok ok
2 ok ok
last for 2 days!