haproxy負載均衡代理詳解

1. 介紹

HAProxy提供高可用性負載均衡以及基於TCPHTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。根據官方數據,其最高極限支持10G的併發。

HAProxy特別適用於那些負載特大的web站點, 這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

其支持從4層至7層的網絡交換,即覆蓋所有的TCP協議。就是說,Haproxy 甚至還支持 Mysql 的均衡負載。。

如果說在功能上,能以proxy反向代理方式實現 WEB均衡負載,這樣的產品有很多。包括 Nginx,ApacheProxy,lighttpd,Cheroke 等。但要明確一點的,Haproxy 並不是 Http 服務器。以上提到所有帶反向代理均衡負載的產品,都清一色是 WEB 服務器。簡單說,就是他們能自個兒提供靜態(html,jpg,gif…)或動態(php,cgi…)文件的傳輸以及處理。而Haproxy 僅僅,而且專門是一款的用於均衡負載的應用代理。其自身並不能提供http服務。

但其配置簡單,擁有非常不錯的服務器健康檢查功能還有專門的系統狀態監控頁面,當其代理的後端服務器出現故障, HAProxy會自動將該服務器摘除,故障恢復後再自動將該服務器加入。自1.3版本開始還引入了frontend,backend,frontend根據任意HTTP請求頭內容做規則匹配,然後把請求定向到相關的backend。

2. 功能

  • 內容交換 : 可以根據請求(request)的任何一部分 來選擇一組服務器, 比如請求的 URI , Host頭(header) , cookie , 以及其他任何東西. 當然,對那些靜態分離的站點來說,對此特性還有更多的需求。
  • 全透明代理 : 可以用 客戶端IP地址 或者任何其他地址來連接後端服務器. 這個特性僅在Linux2.4/2.6內核打了cttproxy 補丁後纔可以使用. 這個特性也使得爲某特殊服務器處理部分流量同時又不修改服務器的地址成爲可能。
  • 基於樹的更快的調度器 : 1.2.16以上的版本要求所有的超時都設成同樣的值以支持數以萬計的全速連接. 這個特性已經移植到1.2.17.
  • 內核TCP拼接 : 避免了內核到用戶然後用戶到內核端的數據拷貝, 提高了吞吐量同時又降低了CPU使用率 . Haproxy1.3支持Linux L7SW 以滿足在商用硬件上數Gbps 的吞吐的需求。
  • 連接拒絕 : 因爲維護一個連接的打開的開銷是很低的,有時我們很需要限制攻擊蠕蟲(attack bots),也就是說限制它們的連接打開從而限制它們的危害。 這個已經爲一個陷於小型DDoS攻擊的網站開發了而且已經拯救了很多站點。
  • 細微的頭部處理 : 使得編寫基於header的規則更爲簡單,同時可以處理URI的某部分。 快而可靠的頭部處理 : 使用完全RFC2616兼容的完整性檢查對一般的請求全部進行分析和索引僅僅需要不到2ms 的時間。
  • 模塊化設計 : 允許更多人加入進此項目,調試也非常簡單. poller已經分離, 已經使得它們的開發簡單了很多,HTTP已經從TCP分離出來了,這樣增加新的七層特性變得非常簡單. 其他子系統也會很快實現模塊化。
  • 投機I/O 處理 : 在一個套接字就緒前就嘗試從它讀取數據。poller僅推測哪個可能就緒哪個沒有,嘗試猜測,並且如果成功,一些開銷很大的系統調用就可以省去了。如果失敗,就會調用這些系統調用。已知的使用Linux epoll()已經淨提升起碼10%了。
  • ACLs : 使用任意規則的任意組合作爲某動作的執行條件。
  • TCP 協議檢查 : 結合ACL來對請求的任意部分進行檢查,然後再進行轉發。這就可以執行協議驗證而不是盲目的進行轉發。比如說允許SSL但拒絕SSH。
  • 更多的負載均衡算法 : 現在,動態加權輪循(Dynamic Round Robin),加權源地址哈希(Weighted Source Hash),加權URL哈希和加權參數哈希(Weighted Parameter Hash)已經實現。其他算法比如Weighted Measured Response Time也很快會實現。

3. 安裝部署

3.1 系統環境

Oracle Linux Server 7.4
web1 server : 192.168.1.120
web2 server : 192.168.1.121
haproxy server: 192.168.1.121

3.2 安裝web服務

web1 server執行:

$ yum -y install httpd
$ echo web1 > /var/www/html/index.html
$ systemctl start httpd && systemctl enable httpd

web2 server執行:

$ yum -y install httpd
$ echo web2 > /var/www/html/index.html
$ systemctl start httpd && systemctl enable httpd

3.3 安裝haproxy

官網:http://www.haproxy.org/

$ yum -y install gcc c++
$ wget http://www.haproxy.org/download/2.1/src/haproxy-2.1.4.tar.gz
$ tar -zxvf haproxy-2.1.4.tar.gz
$ cd haproxy-2.1.4
$ uname -r 
3.10.0-693.el7.x86_64
$ make TARGET=linux3100 ARCH=x86_64 PREFIX=/usr/local/haproxy
$ make install PREFIX=/usr/local/haproxy

參數說明:
使用uname -r查看內核,如:3.10.0-693.el7.x86_64,此時該TARGET參數就爲linux3100
ARCH=x86_64 #系統位數
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy爲haprpxy安裝路徑

如果是YUM安裝的話配置文件會自動生成在/etc/haproxy/haproxy.cfg。如果是編譯安裝的就可以通過複製安裝包的模板文件做修改,這樣可以方便快速手動配置,並且爲haproxy創建一個系統用戶。Haproxy的日誌在/var/log/message裏。

$ useradd -r haproxy
$ cp ./examples/haproxy.init /etc/init.d/haproxy
$ chmod 755 /etc/init.d/haproxy
$ cp ./examples/option-http_proxy.cfg /usr/local/haproxy/haproxy.cfg

3.4 Haproxy日誌配置

創建日誌目錄

$ mkdir /usr/local/haproxy/logs

系統設置接收外來日誌

$ vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r -m 0 -c 2"
  • -m 0 : 表示給日誌添加-- MARK --標記,0表示關閉標記
  • -r : 選項以允許接受外來日誌消息
  • -c : 指定rsyslog運行(兼容)的版本號, 當然也可以省略, 默認爲-c 0, (命令行兼容sysklogd)
    開啓rsyslog的日誌記錄功能
$ vim /etc/rsyslog.conf  #Haproxy默認是把日誌輸出到/var/log/message中,不太方便查閱,所以配置文件中有配置rsyslog
$ModLoad imudp
$UDPServerRun 514
local2.*           /usr/local/haproxy/logs/haproxy.log
#或者 local2.*           /var/log/haproxy.log

重啓rsyslog生效

$ systemctl restart rsyslog

3.5Haproxy簡單配置

通過該Haproxy實現後端兩臺web節點輪詢

$ cat /usr/local/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /usr/local/haproxy
    pidfile     /usr/local/haproxy/logs/haproxy.pid
    maxconn     4000
    ulimit-n    65535
    user        haproxy
    group       haproxy
    daemon
    nbproc      1

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8  #記錄客戶端真實IP
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s  #haproxy連接後端服務器超時時間
    timeout client          10m  #客戶端和haproxy的非活動超時時間
    timeout server          10m  #haproxy和後端服務器的非活動超時時間
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend  test
    bind  *:8080
    default_backend             test

backend test
    balance     roundrobin
    server  app1 192.168.1.120:80 weight 1 check inter 2000 fall 3 rise 3
    server  app2 192.168.1.121:80 weight 1 check inter 2000 fall 3 rise 3 

listen mysqlserver  #名稱隨意寫
    bind 0.0.0.0:3306
    balance roundrobin
    server server1 192.168.1.190:3306 weight 1
    server server2 192.168.1.191:3306 weight 1

listen  admin_stats  #配置狀態監控頁面
  bind 0.0.0.0:8000
  mode http
  stats refresh 30s
  stats uri /status
  stats auth admin:admin123
  stats hide-version
  stats admin if TRUE

3.6 啓動服務

$ /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg

3.7 查看Haproxy狀態監控

瀏覽器:http://192.168.1.121:8000/status
在這裏插入圖片描述

3.8 查看haproxy代理的web

瀏覽器:http://192.168.1.121:8080
在這裏插入圖片描述
刷新一次
在這裏插入圖片描述

4. 模板配置文件詳解

####################全局配置信息########################
#######參數是進程級的,通常和操作系統(OS)相關#########
global
       maxconn 20480                   #默認最大連接數
       log 127.0.0.1 local3            #[err warning info debug]
       chroot /var/haproxy             #chroot運行的路徑
       uid 99                          #所屬運行的用戶uid
       gid 99                          #所屬運行的用戶組
       daemon                          #以後臺形式運行haproxy
       nbproc 1                        #進程數量(可以設置多個進程提高性能)
       pidfile /var/run/haproxy.pid    #haproxy的pid存放路徑,啓動進程的用戶必須有權限訪問此文件
       ulimit-n 65535                  #ulimit的數量限制
       #####################默認的全局設置######################
       ##這些參數可以被利用配置到frontend,backend,listen組件##
defaults
       log global
       mode http                       #所處理的類別 (#7層 http;4層tcp  )
       maxconn 20480                   #最大連接數
       option httplog                  #日誌類別http日誌格式
       option httpclose                #每次請求完畢後主動關閉http通道
       option dontlognull              #不記錄健康檢查的日誌信息
       option forwardfor               #如果後端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip
       option redispatch               #serverId對應的服務器掛掉後,強制定向到其他健康的服務器
       option abortonclose             #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接
       stats refresh 30                #統計頁面刷新間隔
       retries 3                       #3次連接失敗就認爲服務不可用,也可以通過後面設置
       balance roundrobin              #默認的負載均衡的方式,輪詢方式
      #balance source                  #默認的負載均衡的方式,類似Nginx的ip_hash
      #balance leastconn               #默認的負載均衡的方式,最小連接
       contimeout 5000                 #連接超時
       clitimeout 50000                #客戶端超時
       srvtimeout 50000                #服務器超時
       timeout check 2000              #心跳檢測超時
       ####################監控頁面的設置#######################
listen admin_status                    #Frontend和Backend的組合體,監控組的名稱,按需自定義名稱
        bind 0.0.0.0:65532             #監聽端口
        mode http                      #http的7層模式
        log 127.0.0.1 local3 err       #錯誤日誌記錄
        stats refresh 5s               #每隔5秒自動刷新監控頁面
        stats uri /admin?stats         #監控頁面的url
        stats realm itnihao itnihao   #監控頁面的提示信息
        stats auth admin:admin         #監控頁面的用戶和密碼admin,可以設置多個用戶名
        stats auth admin1:admin1       #監控頁面的用戶和密碼admin1
        stats hide-version             #隱藏統計頁面上的HAproxy版本信息
        stats admin if TRUE            #手工啓用/禁用,後端服務器(haproxy-1.4.9以後版本)
       errorfile 403 /etc/haproxy/errorfiles/403.http
       errorfile 500 /etc/haproxy/errorfiles/500.http
       errorfile 502 /etc/haproxy/errorfiles/502.http
       errorfile 503 /etc/haproxy/errorfiles/503.http
       errorfile 504 /etc/haproxy/errorfiles/504.http
       #################HAProxy的日誌記錄內容設置###################
       capture request  header host           len 40
       capture request  header Content-Length len 10
       capture request  header Referer        len 200
       capture response header Server         len 40
       capture response header Content-Length len 10
       capture response header Cache-Control  len 8
       #######################網站監測listen配置#####################
       ###########此用法主要是監控haproxy後端服務器的監控狀態############
listen site_status
       bind 0.0.0.0:1081                    #監聽端口
       mode http                            #http的7層模式
       log 127.0.0.1 local3 err             #[err warning info debug]
       monitor-uri /site_status             #網站健康檢測URL,用來檢測HAProxy管理的網站是否可以用,正常返回200,不正常返回503
       acl site_dead nbsrv(server_web) lt 2 #定義網站down時的策略當掛在負載均衡上的指定backend的中有效機器數小於1臺時返回true
       acl site_dead nbsrv(server_blog) lt 2
       acl site_dead nbsrv(server_bbs)  lt 2
       monitor fail if site_dead            #當滿足策略的時候返回503,網上文檔說的是500,實際測試爲503
       monitor-net 192.168.16.2/32          #來自192.168.16.2的日誌信息不會被記錄和轉發
       monitor-net 192.168.16.3/32
       ########frontend配置############
       #####注意,frontend配置裏面可以定義多個acl進行匹配操作########
frontend http_80_in
       bind 0.0.0.0:80      #監聽端口,即haproxy提供web服務的端口,和lvs的vip端口類似
       mode http            #http的7層模式
       log global           #應用全局的日誌配置
       option httplog       #啓用http的log
       option httpclose     #每次請求完畢後主動關閉http通道,HA-Proxy不支持keep-alive模式
       option forwardfor    #如果後端服務器需要獲得客戶端的真實IP需要配置次參數,將可以從Http Header中獲得客戶端IP
       ########acl策略配置#############
       acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$
       #如果請求的域名滿足正則表達式中的2個域名返回true -i是忽略大小寫
       acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn
       #如果請求的域名滿足www.itnihao.cn返回true -i是忽略大小寫
       #acl itnihao    hdr(host) -i itnihao.cn
       #如果請求的域名滿足itnihao.cn返回true -i是忽略大小寫
       #acl file_req url_sub -i  killall=
       #在請求url中包含killall=,則此控制策略返回true,否則爲false
       #acl dir_req url_dir -i allow
       #在請求url中存在allow作爲部分地址路徑,則此控制策略返回true,否則返回false
       #acl missing_cl hdr_cnt(Content-length) eq 0
       #當請求的header中Content-length等於0時返回true
      ########acl策略匹配相應#############
       #block if missing_cl
       #當請求中header中Content-length等於0阻止請求返回403
       #block if !file_req || dir_req
       #block表示阻止請求,返回403錯誤,當前表示如果不滿足策略file_req,或者滿足策略dir_req,則阻止請求
       use_backend  server_web  if itnihao_web
       #當滿足itnihao_web的策略時使用server_web的backend
       use_backend  server_blog if itnihao_blog
       #當滿足itnihao_blog的策略時使用server_blog的backend
       #redirect prefix http://blog.itniaho.cn code 301 if itnihao
       #當訪問itnihao.cn的時候,用http的301挑轉到http://192.168.16.3
       default_backend server_bbs
       #以上都不滿足的時候使用默認server_bbs的backend
       ##########backend的設置##############
       #下面我將設置三組服務器 server_web,server_blog,server_bbs
###########backend server_web#################
backend server_web
       mode http            #http的7層模式
       balance roundrobin   #負載均衡的方式,roundrobin平均方式
       cookie SERVERID      #允許插入serverid到cookie中,serverid後面可以定義
       option httpchk GET /index.html #心跳檢測的文件
       server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1
       #服務器定義,cookie 1表示serverid爲web1,check inter 1500是檢測心跳頻率rise 33次正確認爲服務器可用,
       #fall 3是3次失敗認爲服務器不可用,weight代表權重
       server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2
       #服務器定義,cookie 1表示serverid爲web2,check inter 1500是檢測心跳頻率rise 33次正確認爲服務器可用,
       #fall 3是3次失敗認爲服務器不可用,weight代表權重
#############backend server_blog##############
backend server_blog
       mode http            #http的7層模式
       balance roundrobin   #負載均衡的方式,roundrobin平均方式
       cookie SERVERID      #允許插入serverid到cookie中,serverid後面可以定義
       option httpchk GET /index.html #心跳檢測的文件
       server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1
       #服務器定義,cookie 1表示serverid爲web1,check inter 1500是檢測心跳頻率rise 33次正確認爲服務器可用,fall 33次失敗認爲服務器不可用,weight代表權重
       server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2
        #服務器定義,cookie 1表示serverid爲web2,check inter 1500是檢測心跳頻率rise 33次正確認爲服務器可用,fall 33次失敗認爲服務器不可用,weight代表權重
#############backend server_bbs##############
backend server_bbs
       mode http            #http的7層模式
       balance roundrobin   #負載均衡的方式,roundrobin平均方式
       cookie SERVERID      #允許插入serverid到cookie中,serverid後面可以定義
       option httpchk GET /index.html #心跳檢測的文件
       server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1
       #服務器定義,cookie 1表示serverid爲web1,check inter 1500是檢測心跳頻率rise 33次正確認爲服務器可用,fall 33次失敗認爲服務器不可用,weight代表權重
       server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2
        #服務器定義,cookie 1表示serverid爲web2,check inter 1500是檢測心跳頻率rise 33次正確認爲服務器可用,fall 33次失敗認爲服務器不可用,weight代表權重

更新的配置詳解參考 馬哥教育

參考連接:
http://www.liangxiansen.cn/2017/03/06/haproxy/
http://www.linuxe.cn/post-379.html
https://www.cnblogs.com/f-ck-need-u/p/8540805.html
https://www.cnblogs.com/MacoLee/p/5853413.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章