haproxy配置詳解


先看一個ha的配置文件:

#

# 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
#
log 127.0.0.1 local0

chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group 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
#mode http
mode tcp
log global
#option httplog
option tcplog
option dontlognull
#option http-server-close
#option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

#???????????????????????
# main frontend which proxys to the backends
#???????????????????????

frontend yqd-front
bind *:3307
mode tcp
default_backend yqd-back

frontend stats-front
bind *:8080
mode http
default_backend stats-back

frontend yqd-onenode-front
bind *:3306
mode tcp
default_backend yqd-onenode-back
#???????????????????????
# static backend for serving up images, stylesheets and such
#???????????????????????
backend yqd-back
mode tcp
balance leastconn
option httpchk
server percona-node1 192.168.1.243:3306 check port 9200 inter 12000 rise 3 fall 3
server percona-node2 192.168.1.233:3306 check port 9200 inter 12000 rise 3 fall 3
server percona-node3 192.168.1.244:3306 check port 9200 inter 12000 rise 3 fall 3

backend stats-back
mode http
balance roundrobin
stats uri /haproxy/stats
stats auth yqdstats:123456

#???????????????????????
# round robin balancing between the various backends
#???????????????????????
backend yqd-onenode-back
mode tcp
balance leastconn
option httpchk
server percona-node1 192.168.1.243:3306 check port 9200 inter 12000 rise 3 fall 3
server percona-node2 192.168.1.233:3306 check port 9200 inter 12000 rise 3 fall 3 backup
server percona-node3 192.168.1.244:3306 check port 9200 inter 12000 rise 3 fall 3 backup

Ha的主要配置塊:
  HAProxy配置中分五大部分:    
      global:全局配置參數,進程級的,用來控制Haproxy啟動前的一些進程及系統設置    
      defaults:配置一些默認的參數,可以被frontend,backend,listen段繼承使用    
      frontend:用來匹配接收客戶所請求的域名,uri等,並針對不同的匹配,做不同的請求處理    
      backend:定義后端服務器集群,以及對后端服務器的一些權重、隊列、連接數等選項的設置,我將其理解為Nginx中的upstream塊    
      listen:我將其理解為frontend和backend的組合體

對ha配置文件解析:

  

global   # 全局參數的設置
log 127.0.0.1 local0 info
# log語法:log <address_1>[max_level_1] # 全局的日志配置,使用log關鍵字,指定使用127.0.0.1上的syslog服務中的local0日志設備,記錄日志等級為info的日志
user haproxy
group haproxy
# 設置運行haproxy的用戶和組,也可使用uid,gid關鍵字替代之
daemon
# 以守護進程的方式運行
nbproc 16
# 設置haproxy啟動時的進程數,根據官方文檔的解釋,我將其理解為:該值的設置應該和服務器的CPU核心數一致,即常見的2顆8核心CPU的服務器,即共有16核心,則可以將其值設置為:<=16 ,創建多個進程數,可以減少每個進程的任務隊列,但是過多的進程數也可能會導致進程的崩潰。這里我設置為16
maxconn 4096
# 定義每個haproxy進程的最大連接數 ,由於每個連接包括一個客戶端和一個服務器端,所以單個進程的TCP會話最大數目將是該值的兩倍。
#ulimit -n 65536
# 設置最大打開的文件描述符數,在1.4的官方文檔中提示,該值會自動計算,所以不建議進行設置
pidfile /var/run/haproxy.pid
# 定義haproxy的pid 
defaults # 默認部分的定義
mode http
# mode語法:mode {http|tcp|health} 。http是七層模式,tcp是四層模式,health是健康檢測,返回OK
log 127.0.0.1 local3 err
# 使用127.0.0.1上的syslog服務的local3設備記錄錯誤信息
retries 3
# 定義連接后端服務器的失敗重連次數,連接失敗次數超過此值后將會將對應后端服務器標記為不可用
option httplog
# 啟用日志記錄HTTP請求,默認haproxy日志記錄是不記錄HTTP請求的,只記錄“時間[Jan 5 13:23:46] 日志服務器[127.0.0.1] 實例名已經pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]”,日志格式很簡單。
option redispatch
# 當使用了cookie時,haproxy將會將其請求的后端服務器的serverID插入到cookie中,以保證會話的SESSION持久性;而此時,如果后端的服務器宕掉了,但是客戶端的cookie是不會刷新的,如果設置此參數,將會將客戶的請求強制定向到另外一個后端server上,以保證服務的正常。
option abortonclose
# 當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接
option dontlognull
# 啟用該項,日志中將不會記錄空連接。所謂空連接就是在上游的負載均衡器或者監控系統為了探測該服務是否存活可用時,需要定期的連接或者獲取某一固定的組件或頁面,或者探測掃描端口是否在監聽或開放等動作被稱為空連接;官方文檔中標注,如果該服務上游沒有其他的負載均衡器的話,建議不要使用該參數,因為互聯網上的惡意掃描或其他動作就不會被記錄下來
option httpclose
# 這個參數我是這樣理解的:使用該參數,每處理完一個request時,haproxy都會去檢查http頭中的Connection的值,如果該值不是close,haproxy將會將其刪除,如果該值為空將會添加為:Connection: close。使每個客戶端和服務器端在完成一次傳輸后都會主動關閉TCP連接。與該參數類似的另外一個參數是“option forceclose”,該參數的作用是強制關閉對外的服務通道,因為有的服務器端收到Connection: close時,也不會自動關閉TCP連接,如果客戶端也不關閉,連接就會一直處於打開,直到超時。
contimeout 5000
# 設置成功連接到一台服務器的最長等待時間,默認單位是毫秒,新版本的haproxy使用timeout connect替代,該參數向后兼容
clitimeout 3000
# 設置連接客戶端發送數據時的成功連接最長等待時間,默認單位是毫秒,新版本haproxy使用timeout client替代。該參數向后兼容
srvtimeout 3000
# 設置服務器端回應客戶度數據發送的最長等待時間,默認單位是毫秒,新版本haproxy使用timeout server替代。該參數向后兼容

listen status # 定義一個名為status的部分
bind 0.0.0.0:1080
# 定義監聽的套接字
mode http
# 定義為HTTP模式
log global
# 繼承global中log的定義
stats refresh 30s
# stats是haproxy的一個統計頁面的套接字,該參數設置統計頁面的刷新間隔為30s
stats uri /admin?stats
# 設置統計頁面的uri為/admin?stats
stats realm Private lands
# 設置統計頁面認證時的提示內容
stats auth admin:password
# 設置統計頁面認證的用戶和密碼,如果要設置多個,另起一行寫入即可
stats hide-version
# 隱藏統計頁面上的haproxy版本信息

frontend http_80_in # 定義一個名為http_80_in的前端部分
bind 0.0.0.0:80
# http_80_in定義前端部分監聽的套接字
mode http
# 定義為HTTP模式
log global
# 繼承global中log的定義
option forwardfor
# 啟用X-Forwarded-For,在requests頭部插入客戶端IP發送給后端的server,使后端server獲取到客戶端的真實IP
acl static_down nbsrv(static_server) lt 1
# 定義一個名叫static_down的acl,當backend static_sever中存活機器數小於1時會被匹配到
acl php_web url_reg /*.php$
#acl php_web path_end .php
# 定義一個名叫php_web的acl,當請求的url末尾是以.php結尾的,將會被匹配到,上面兩種寫法任選其一
acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$
#acl static_web path_end .gif .png .jpg .css .js .jpeg
# 定義一個名叫static_web的acl,當請求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif結尾的,將會被匹配到,上面兩種寫法任選其一
use_backend php_server if static_down
# 如果滿足策略static_down時,就將請求交予backend php_server
use_backend php_server if php_web
# 如果滿足策略php_web時,就將請求交予backend php_server
use_backend static_server if static_web
# 如果滿足策略static_web時,就將請求交予backend static_server

backend php_server #定義一個名為php_server的后端部分
mode http
# 設置為http模式
balance source
# 設置haproxy的調度算法為源地址hash
cookie SERVERID
# 允許向cookie插入SERVERID,每台服務器的SERVERID可在下面使用cookie關鍵字定義
option httpchk GET /test/index.php
# 開啟對后端服務器的健康檢測,通過GET /test/index.php來判斷后端服務器的健康情況
server php_server_1 10.12.25.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2
server php_server_2 10.12.25.72:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1
server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup
# server語法:server [:port] [param*] # 使用server關鍵字來設置后端服務器;為后端服務器所設置的內部名稱[php_server_1],該名稱將會呈現在日志或警報中、后端服務器的IP地址,支持端口映射[10.12.25.68:80]、指定該服務器的SERVERID為1[cookie 1]、接受健康監測[check]、監測的間隔時長,單位毫秒[inter 2000]、監測正常多少次后被認為后端服務器是可用的[rise 3]、監測失敗多少次后被認為后端服務器是不可用的[fall 3]、分發的權重[weight 2]、最為備份用的后端服務器,當正常的服務器全部都宕機后,才會啟用備份服務器[backup]

backend static_server
mode http
option httpchk GET /test/index.html
server static_server_1 10.12.25.83:80 cookie 3 check inter 2000 rise 3 fall 3

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM