天天看點

[資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離

    • https://www.scalescale.com/nginx-haproxy-varnish-comparison/#

      四層轉發tcp(lvs) 七層代理http(haproxy)

      穩定性的适合用lvs 網站負載适合用haproxy nginx

      haproxy(單核)

      HAProxy 提供高可用性、負載均衡以及基于 TCP 和 HTTP 應用的代理,支援虛拟主機,

      它是免費、快速并且可靠的一種解決方案。HAProxy 特别适用于那些負載特大的 web 站點, 這些站點通常又需要會話保持或七層處理。HAProxy 運作在目前的硬體上,完全可以支援數以萬計的并發連接配接。并且它的運作模式使得它可以很簡單安全的整 合進您目前的架構中, 同時可以保護你的 web 伺服器不被暴露到網絡上。

      實驗環境:

      server1(172.25.27.1) haproxy節點
      server2(172.25.27.2) 後端伺服器
      server3(172.25.27.3)
      用戶端(172.25.27.250) 用戶端

      haproxy實作負載均衡

      在server1上:
      yum install haproxy -y (建議用rpm包裝)
      cd /etc/haproxy/
      vim haproxy.cfg
      
      global
      log         127.0.0.1 local2 #全局的日志配置,使用log關鍵字
      chroot      /var/lib/haproxy #改變目前工作目錄
      #修改haproxy的工作目錄至指定的目錄并在放棄權限之前執行chroot()操作,可以提升haproxy的安全級别,不過需要注意的是要確定指定的目錄為空目錄且任何使用者均不能有寫權限
                 
      安裝完成後會建立haproxy使用者
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      pidfile     /var/run/haproxy.pid #目前程序id檔案
      maxconn     4000   #設定每個haproxy程序所接受的最大并發連接配接數
      user        haproxy
      group       haproxy
      daemon  #讓haproxy以守護程序的方式工作于背景
      
      defaults
          mode                    http  #預設的模式mode { tcp|http|health },tcp是4層,http是7層,health隻會傳回OK
          log                     global    #應用全局的日志配置
          option                  httplog  # 啟用日志記錄HTTP請求,預設haproxy日志記錄是不記錄HTTP請求日志
          option                  dontlognull    # 啟用該項,日志中将不會記錄空連接配接。所謂空連接配接就是在上遊的負載均衡器 或者監控系統為了探測該服務是否存活可用時,需要定期的連接配接或者擷取某固定的元件或頁面,或者探測掃描端口是否在監聽或開放等動作被稱為空連接配接;官方文檔中标注,如果該服務上遊沒有其他的負載均衡器的話,建議不要使用該參數,因為網際網路上的惡意掃描或其他動作就不會被記錄下來
          option http-server-close #每次請求完畢後主動關閉http通道
          option forwardfor       except 127.0.0.0/8
          option                  redispatch
      #當使用了cookie時,haproxy将會将其請求的後端伺服器的serverID插入到cookie中,以保證會話的SESSION持久性;而此時,如果後端的伺服器宕掉了, 但是用戶端的cookie是不會重新整理的,如果設定此參數,将會将客戶的請
      求強制定向到另外一個後端server上,以保證服務的正常。
      
         retries                 3  # 定義連接配接後端伺服器的失敗重連次數,連接配接失敗次數超過此值後将會将對應後端
                                                                        伺服器标記為不可用
          timeout http-request    10s  #http請求逾時時間
          timeout queue           1m    #一個請求在隊列裡的逾時時間
          timeout connect         10s   #連接配接逾時
          timeout client          1m     #用戶端逾時
          timeout server          1m     #伺服器端逾時
          timeout http-keep-alive 10s     #設定http-keep-alive的逾時時間
          timeout check           10s     #檢測逾時
          maxconn                 3000     #每個程序可用的最大連接配接數
                 

      監控頁面添加認證:

      #listen:可以了解為frontend和backend的組合體

      listen admin *:8080
             stats enable
             stats uri /status  # 監控頁面位址
             stats auth admin:westos  # 管理帳号和密碼
             stats refresh 5s  #重新整理頻率
      
      
      listen  westos *:80      #監聽的執行個體名稱,位址和端口 
              balance roundrobin   #負載均衡算法
              server web1 172.25.27.2:80 check
              server web2 172.25.27.3:80 check
                 

      兩台後端伺服器server2,server3

      打開httpd服務并配置相關頁面

      用戶端測試:

      浏覽器通路172.25.27.1

      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      輸入登入賬号和密碼
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離

      日志監控:

      $ModLoad imudp     #接受 haproxy 日志
      $UDPServerRun 514
      
      vim /etc/rsyslog.conf
      *.info;mail.none;authpriv.none;cron.none;local2.none     /var/log/messages
      local2.*                       /var/log/haproxy.log   #日志檔案位置
                 
      自帶健康檢查:(測試)
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      關閉server2的httpd服務,重新整理浏覽器頁面
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      檢視日志(通路記錄)
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離

      動态靜态通路分離

      (可以自己加虛拟主機)

      #frontend:用來比對接收客戶所請求的域名,uri等,并針對不同的比對,做不同的請求處理

      frontend  westos *:80
          acl url_static       path_beg       -i /images
          acl url_static       path_end       -i .jpg .gif .png
      
         use_backend static          if url_static
          default_backend             app
      
      #backend:定義後端伺服器叢集
      backend static #(靜态)
          server web2 172.25.27.3:80 check
      backend app
          #balance roundrobin
          server web1 172.25.27.2:80 check
          server local 172.25.27.1:8000 backup   
          #(如果後端real server down掉 則排程報錯頁面 但是正常情況下不會通路 因為 是“backup”)
                 
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      配置server2
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離

      客戶通路靜态資源會通路到server2

      客戶通路動态資源會通路到server3

      錯誤重定向

      frontend  westos *:80
          acl url_static       path_beg       -i  /images  (以什麼開頭 預設根目錄)
          acl url_static       path_end       -i .jpg .gif .png (以什麼結尾)
      
          acl badhost  src  172.25.27.250  (設定誰不能通路我)
          block if badhost
      
           use_backend static          if url_static
           default_backend  app
      
      backend static
              balance roundrobin
              server web2 172.25.42.14:80 check
      
      backend app
              balance roundrobin
              server web1 172.25.42.13:80 check
                 
      用戶端通路被拒絕
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      frontend  westos *:80
          acl url_static       path_beg       -i  /images  (以什麼開頭 預設根目錄)
          acl url_static       path_end       -i .jpg .gif .png (以什麼結尾)
      
          acl badhost  src  172.25.27.250  (設定誰不能通路我)
          block if badhost
          errorloc 403 http://172.25.27.1:8000 (注意端口不要沖突)(403:伺服器拒絕你的通路 伺服器設定你是壞的 )(如果是403錯誤就重定向到 172.25.254.1:8000)
      
           use_backend static          if url_static
           default_backend  app
      
      backend static
              balance roundrobin
              server web2 172.25.42.14:80 check
      
      backend app
              balance roundrobin
              server web1 172.25.42.13:80 check
                 
      再次通路會自動跳轉至指定頁面
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離

      301永久重定向

      (一般推薦用301 302臨時重定向 有惡意刷點選的嫌疑)

      這樣設定的haproxy通路時,會出現302狀态碼

      301 redirect: 301 代表永久性轉移(Permanently Moved)

      302 redirect: 302 代表暫時性轉移(emporarily Moved )

      詳細來說,301和302狀态碼都表示重定向,就是說浏覽器在拿到伺服器傳回的這個狀态碼後會自動跳轉到一個新的URL位址,這個位址可以從響應的Location首部中擷取(使用者看到的效果就是他輸入的位址A瞬間變成了另一個位址B)——這是它們的共同點。他們的不同在于。301表示舊位址A的資源已經被永久地移除了(這個資源不可通路了),搜尋引擎在抓取新内容的同時也将舊的網址交換為重定向之後的網址;302表示舊位址A的資源還在(仍然可以通路),這個重定向隻是臨時地從舊位址A跳轉到位址B,搜尋引擎會抓取新的内容而儲存舊的網址

      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      acl westos.org hdr_beg(host) -i westos.org  
          acl 172.25.27.1 hdr_beg(host) -i 172.25.27.1
      #block if badhost
      #errorloc 403 http://172.25.42.12:8000 
      #redirect location http://172.25.42.12:8000 if badhost
           redirect code 301 location http://www.westos.org if westos.org
           (以westos.org通路 自動重定向 www.westos.org)
           redirect code 301 location http://www.westos.org if 172.25.27.1
           (以172.25.27.1通路 自動重定向 www.westos.org)
           use_backend static          if url_static
           default_backend  app
                 
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離

      讀寫分離

      real server(兩台): yum install php -y

      擷取一個上傳照片的php頁面

      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離

      chmod 777 upload (預設上傳目錄一定要給權限)

      server3進行相同的配置

      排程器:

      acl read method GET      
          acl read method HEAD     //兩個read write 隻用一個就行
          acl write method PUT
          acl write method POST
      
         use_backend app          if write  
           default_backend  static (預設靜态頁面 為了測試 剛開始 通路www.westos.org 時是172.25.27.3 而寫入(上傳時 卻是在172.25.254.2 上進行的) 做到了讀寫分離
      
      backend static
              balance roundrobin
              server web2 172.25.27.3:80 check
      
      backend app
              balance roundrobin
              server web1 172.25.27.2:80 check (預設會上傳到這個real server)
              server local 172.25.27.1:8000 backup
                 

      測試:

      用戶端上傳圖檔

      http://172.25.27.1/index.php

      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離
      [資源分享] haproxy實作負載均衡、日志監控、動靜通路分離、錯誤重定向、301重定向、讀寫分離

      本文章中包含資源

      您需要 登入 才可以下載下傳,沒有帳号?立即注冊