haproxy的配置文件大概可以分兩段;第一段配置上global配置段即全局配置段,主要是針對haproxy的進程和安全相關的;第二段是proxies代理配置段,主要是配置haproxy前端監聽那個地址那個埠以及後端server的名稱、地址、埠,以及server相關屬性等配置;而proxies... ...
前文我們聊了下haproxy的基礎安裝,以及怎樣去代理後端主機的配置;當然沒有很詳細的去說配置文件中各指令的意思;有關haproxy的安裝和代理後端server可以參考本人博客https://www.cnblogs.com/qiuhom-1874/p/12741018.html;今天我們主要來說一下haproxy global配置段常用配置指令的用法和說明;
前邊我們大概說了一下haproxy的配置文件大概可以分兩段;第一段配置是global配置段即全局配置段,主要是針對haproxy的進程和安全相關的配置;第二段是proxies代理配置段,主要是配置haproxy前端監聽那個地址那個埠以及後端server的名稱、地址、埠,以及server相關屬性等配置;而proxies配置段里又分defaults配置段,這個部分主要是定義後續的backend,listen這兩個段的預設配置;什麼意思呢?也就是在後面的配置中如果我們沒有寫對應參數,它預設會繼承defaults里的配置;如果說後面的配置中和前邊的defaults中的配置重覆了,那麼就以後面的配置生效,也就是說後面的配置段優先順序高於defaults里的配置;瞭解了haproxy的配置文件結構,接下來我們來看看haproxy的global配置段常用指令;
提示:以上是haproxy1.5.18yum安裝里預設提供的global配置段;其中log是用來指定日誌的,這裡要說一下haproxy的日誌,它和nginx的日誌不太一樣;nginx的日誌是我們用access_log 指令來指定日誌文件和調用日誌格式的名稱,意思就是把日誌以增量的方式往指定的日誌文件中寫;而haproxy的日誌不是自己記錄日誌,而是通過把日誌發送給rsyslog伺服器上的一個facility上,然後通過rsyslog的配置把指定facility上的日誌記錄到某個文件中或者數據中;以上配置段意思就是把haproxy的日誌發送給本機的rsyslog上的local2 記錄所有級別類型的日誌;其實我們不用配置rsyslog,預設會把日誌記錄到/var/log/messages這個文件中,這是因為rsyslog中明確定義了所有facility上的info級別以及info級別以上的日誌都記錄到/var/log/messages中;有關rsyslog的配置說明可以參考本人博客https://www.cnblogs.com/qiuhom-1874/p/12091118.html;接下來我們來配置下,讓haproxy的日誌記錄到/var/log/haproxy.log這個文件中去;
提示:在rsyslog的配置文件中明確要使用local2這個facility上的任何級別的日誌都交給/var/log/haproxy.log記錄;這樣只是把接收日誌的方式定義好了;通常如果rsyslog作為日誌伺服器接收非本機的其他主機日誌,我們還要讓rsyslog監聽在udp或者tcp的514埠上(當然這個埠也可以自己指定,通常不用更改),為其他主機提供服務;所以我們除了要定義把某個facility上的所有級別的日誌(當然也可以指定某些級別的日誌,這個要看你想要收集那一類的日誌)記錄到某個文件中外,我們還要把udp或tcp的514埠打開;
提示:以上配置就是導入imudp模塊,然後讓rsyslog監聽在udp的514埠;這樣配置後我們就可以保存rsyslog的配置文件,然後重啟rsyslog,我們就可以把haproxy的日誌記錄到/var/log/haproxy.log中去了;
提示:可以看到我們訪問haproxy,其中的訪問日誌就記錄到我們定義的/var/log/haproxy.log中去了;
chroot:該指令主要作用同vsftpd裡面的chroot類似,禁錮運行目錄的;一般這個參數主要是防止haproxy被惡意程式攻擊後對操作系統上的其他路徑資源的破環;也就是說即便haproxy被惡意程式攻破,最多只能破環我們指定的chroot目錄,而非整個系統目錄結構;通常情況下haproxy不會出現這種情況,為了安全我們還是配置上這個參數;如果haproxy是我們手動編譯安裝的,通常我們會把這個參數的值設置成很haproxy的程式編譯安裝時指定的目錄;yum安裝的基本上都是/var/lib/haproxy;一般都不會去更改它;
pidfile:該指令是指定pid文件的,通常情況下需要和unit file里指定的pid文件是同一個文件;不是同一個文件的話可能會遇到無法reload的情況;
maxconn:該指令指定haproxy的單個進程最大併發連接數;
user/group:前者用來指定運行haproxy進程的用戶(屬主),後者是用來指定運行進程的用戶屬組
uid/gid:前者用來指定運行haproxy工作進程的用戶id,後者是指定組id;以上兩種方式都是來指定運行haproxy進程的用戶身份;預設情況是用的id為99的用戶(nobody用戶)
deamon:此指令表示haproxy以守護進程運行;
stats socket:指定unix socket文件路徑;主要用於本機交互的方式管理haproxy;
以上是haproxy1.5.18配置文件中global段配置選項的說明;在haproxy1.8.0以後的版本中,haproxy支持多進程多線程的方式,而1.5不支持多線程,支持多進程,但是在1.5上啟用多進程的方式是串列的,意思就是它不是一個主進程下生成多個子進程,而是一個進程下生成一個進程,然後子進程下在生成子進程的方式;所以如果要使用多進程的方式,建議還是使用1.8以後的版本;
haproxy配置多進程
nbproc:該指令是用於指定haproxy的進程數 ,通常情況下建議同cup核心數一樣即可;
cpu-map:該指令用於綁定haproxy對應cup核心;有點類似nginx里的worker_cpu_affinity參數的意義;
提示:以上配置表示指定haproxy的進程數為4個,第一個進程綁定到0號核心上,第二個進程綁定到1號核心上,依次類推;如下
提示:以上是haproxy1.8.20上配置使用多進程,啟動進程情況,我們可以看到haproxy進程的父進程都是5945;
在1.5.18上使用多進程
提示:以同樣的配置在haproxy1.5.18上,啟動的多進程就不一樣,在1.5.18上多了一個haproxy-systemd這個進程,並且haproxy進程都是它的子進程,而我們用nbproc指定的進程數是指定haproxy-systemd下的haproxy的子進程數;而1.8.20nbproc指定的是haproxy的子進程數量,沒有haproxy-systemd,又或者我們可以理解為1.8.20把1.5.18上的haproxy-systemd和haproxy進程合併成一個進程haproxy;通常情況下haproxy單進程也是足夠用了,如果是在要開多進程,建議還是使用1.8以上的版本吧;
haproxy使用多線程
haproxy的多線程是在1.7以後的版本才支持的,所以1.5上面不支持多線程的方式,所以我們這裡的演示就用haproxy1.8.20來演示
nbthread:指定每個haproxy進程開啟的線程數;
提示:以上配置表示啟動4個進程,每個進程里啟動4個線程,預設每個進程一個線程
maxsslconn:該指令指定每個haproxy進程ssl最大連接數,通常情況下證書都不放在haproxy上,nginx上放證書更加合適;
maxconnrate:該指令指定每個進程每秒最大連接數;
spread-checks:該指令指定後端server狀態check隨機提前或延遲百分比時間;通常情況下在後端主機較多的情況下使用;官方建議2-5(20%-50%)之間;如果在後端主機較多的情況下,不使用該指令來延遲對後端主機健康狀態檢查,那麼很有可能降低haproxy的性能,因此該指令在後端主機較多的情況下(比如1000台甚至更多)能夠避免同時併發對後端主機check時對haproxy的性能影響;
以上是haproxy global配置段比較常用的配置指令說明,更多配置指令請參考https://cbonte.github.io/haproxy-dconv;