負載均衡服務之HAProxy基礎配置(三)

来源:https://www.cnblogs.com/qiuhom-1874/archive/2020/04/26/12776261.html
-Advertisement-
Play Games

ccookie就是用來讓服務端辨識客戶端的一種機制;而對於haproxy來講,基於cookie來做會話保持的原理就是通過對後端伺服器響應報文中的cookie信息中插入(或覆蓋的方式)一個鍵值對,在客戶端下次訪問時,檢查對應cookie首部的信息,從而讓haproxy能夠判斷把該請求調度在那個後端服... ...


  前文我們聊到了haproxy的代理配置段中比較常用的配置指令的用法以及說明,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12770930.html;今天我們來說說haproxy的狀態頁的配置,以及基於cookie實現的會話保持配置;

  haproxy和nginx一樣,都有一個狀態頁,這個頁面對於運維人員來說是一個比較重要的頁面,裡面包含了haproxy代理的後端伺服器的各種指標,通常我們要瞭解後端主機是否健康,當前負載情況,我們可以通過狀態頁去瞭解;haproxy的狀態頁配置起來很簡單,用stats enable指令去開啟即可;

  stats enable:開啟狀態頁;該指令可以配置在frontend或者listen或者backend,如果定義在backend中,那麼我們必須要用前端去調用該banckend才能夠看到狀態頁,所以通常我們都定義在listen中或者frontend中;具體示例如下

  示例:定義在backend中

  提示:定義在backend中必須要用frontend去調用該backend;

  示例:定義在frontend中

  示例:定義在listen中

  提示:以上三種方式都不影響訪問狀態頁面,推薦配置在fonrtend或listen中;

  配置好stats enable參數後,重啟haproxy,我們就可以通過瀏覽器訪問haproxy所在主機的對應埠,我這裡監聽在81埠上,所以訪問http://192.168.0.22:81/haporxy?stats就可以訪問到狀態頁;如下

  提示:之所以訪問/haproxy?stats這個uri才能夠訪問到狀態頁,是因為我們沒有在配置文件中明確指定把狀態頁綁定到那個uri上,預設情況不指定就是這個/haproxy?stats,當然我們如果要指定需要用stats uri <prefix>來指定對應的rui即可,如下

   stats uri <prefix>:自定義stats page uri,預設值:/haproxy?stats

  示例:更改狀態也都uri

  提示:以上配置表示訪問狀態頁,的uri為/admin??status

  測試:用瀏覽器訪問81埠上的/admin??status這個uri看看是否能夠訪問到狀態頁?

  提示:可以看到我們更改了uri後,預設的uri就不可以訪問了,必須鍵入我們指定uri才可以被訪問到,這在一定程度上降低了任何人訪問狀態頁的風險;

  stats auth <user>:<passwd>:配置狀態頁面認證的賬號和密碼,可使用多次;預設:no authentication,表示不驗證

  示例:配置狀態頁只允許admin用戶訪問並且密碼為admin123.com

  提示:以上配置表示開啟狀態頁的認證功能,並且添加admin為用戶名,admin123.com為密碼

  測試:現在我們訪問狀態頁,看看是否需要驗證?

  提示:可以看到我們現在訪問狀態頁,需要我們提供用戶名和密碼了,這相對於前面的配置,對於狀態頁的獲取更加安全了;

  stats realm <realm>:設置認證時彈出輸入用戶名密碼的提示信息;

  tats refresh <delay>:設置自動刷新時長;

  示例:

  提示:以上配置表示設定彈出輸入用戶名和密碼的提示,設置自動刷新時長為每4秒自動刷新一次

  測試:重啟haproxy,看看對應配置是否生效

  提示:可以看到我們配置的輸入用戶名和密碼提示的字元串和自動刷新頁都實現了,這裡說一下,設定提示字元串需要把空白字元通過“\”轉義,否則不會生效,加引號好像都不可以;

  stats admin { if | unless } <cond>:啟用stats page中的管理功能

  示例:配置可以在狀態頁管理後端主機的許可權;通常會通過後面的acl去控制,我這裡為了演示方便,就用TRUE這個內置的ACL

  提示:以上配置表示開啟狀態頁管理功能,在條件為真的情況下,if TRUE表示一直為真,這意味著只要登錄狀態頁,就有管理後端主機的許可權;

  測試:

  提示:可以看到我們可以把後端主機的狀態任意調整;

  stats hide-version:隱藏版本

  示例:隱藏haproxy狀態也的版本信息

  測試:登錄狀態頁看看是否還有版本信息?

  到此狀態頁的配置相關指令說完了,接下來我們來說說狀態頁裡邊的內容;

  提示:pid = 11712 (process #4, nbproc = 4) #pid為當前pid號,process為當前進程號,nbproc和nbthread為一共多少進程和每個進程多少個線程(多線程需要在1.7以上的版本才支持);uptime = 0d 0h08m17s #啟動了多長時間;system limits: memmax = unlimited; ulimit-n = 8035表示系統資源限制:記憶體/最大打開文件數/;maxsock = 8035; maxconn = 4000; maxpipes = 0表示最大socket連接數/單進程最大連接數/最大管道數maxpipes;current conns = 1; current pipes = 0/0; conn rate = 1/sec;表示當前連接數/當前管道數/當前連接速率;Running tasks: 1/8; idle = 100 %表示運行的任務/當前空閑率;

  active UP:綠色表示線上伺服器; backup UP:天藍色表示標記為backup的伺服器;active UP, going down:淡黃色表示監測未通過正在進入down過程;backup UP, going down:深紫色表示備份伺服器正在進入down過程;active DOWN, going up:黃色表示down的伺服器正在進入up過程;backup DOWN, going up:淺紫色表示備份伺服器正在進入up過程;active or backup DOWN:粉紅色表示線上的伺服器或者是backup的伺服器已經轉換成了down狀態; not checked:灰色表示標記為不監測的伺服器(沒有對它做健康狀態監測);active or backup DOWN for maintenance (MAINT) :棕色表示active或者backup伺服器認為下線的;active or backup SOFT STOPPED for maintenance :深藍色表示active或者backup被認為軟下線(人為將weight改成0);

  提示:session rate(每秒的連接會話信息)中的指標有cur,max,limit;其中cur表示每秒的當前會話數量;max表示每秒的最大會話數量;limit表示每秒新的會話限制量;sessions(會話信息),cur:表示當前會話量;max:表示最大會話量;limit: 表示限制會話量;Total:表示總共會話量;LBTot:表示選中一臺伺服器所用的總時間;Last:表示和伺服器的持續連接時間;Bytes(流量統計):In表示網路的位元組輸入總量;Out表示網路的位元組輸出總量;Denied(拒絕統計信息):Req表示拒絕請求量;Resp表示拒絕恢復量;Errors(錯誤統計信息):Req表示錯誤請求量;conn表示錯誤連接量;Resp表示錯誤響應量;Warnings(警告統計信息):Retr表示重新嘗試次數;Redis表示再次發送次數;Server(real server信息):Status表示後端server的狀態,包含UP和DOWN;LastChk表示持續監測後端伺服器的時間,其中L4OK表示基於4層tcp檢查OK,L7OK表示基於7層應用層檢查OK;Wght表示權重;Act表示活動鏈接數量;Bck表示備份的伺服器數量;Chk表示心跳監測時間;Dwn表示後端伺服器連接後都是DOWN的數量;Dwntme表示總的downtime時間;Thrtle表示server的狀態;

  瞭解了上面的狀態頁信息說明後,接下來我們來聊一聊haproxy基於cookie做會話保持;

  首先我們要清楚什麼叫cookie?它的主要作用是乾什麼的?眾所周知http是無狀態的,所謂無狀態就是前一秒客戶端訪問服務端,後一秒同一客戶端訪問服務端,服務端是無法判斷是不是同一客戶端;就相當於服務端沒有任何能力記住客戶端;這樣一來就存在一個問題;如果是一需要驗證的網站,如果服務端不能辨別客戶端身份,這意味著它不能夠辨認到底是哪個客戶端登錄了,這樣一來用戶每刷新一次網頁,服務端就會要求客戶端重新登錄;這很顯然不是正常的邏輯;為瞭解決這樣的問題,服務端每當客戶端登錄的時候,就會檢查請求報文中是否攜帶cookie信息;如果沒有攜帶cookie服務端在響應客戶端的時候就會在響應報文中添加一個set-cookie的首部,意思是告訴客戶端,這是你的cookie;客戶端拿到服務端的響應的同時,它會自動的把服務端發來的cookie保存到一個特定的地方,下次客戶端再次訪問服務端的時候,就會把上次伺服器發送過來的cookie信息帶上去訪問伺服器;這樣一來服務端收到客戶端的請求,一看請求報文中的cookie信息,服務端就知道這個請求是那個用戶發送過來的;這樣一來服務端就通過cookie來辨認客戶端了;這也是cookie的主要作用;通常情況下保存在客戶端的叫cookie;在服務端一側類似cookie的功能的東西我們叫session;通常兩者通過某些信息來對應的;比如在客戶端cookie信息里記錄了服務端上的session的號碼;當客戶端再次訪問服務端時,就會把cookie中的信息發送給服務端;服務端收到客戶端發送過來的cookie就會去找對應的session;從而實現了,服務端知道對應客戶端上次的操作;cookie是有時限性的;通常在有效的時間內去訪問服務端,服務端都能夠準確的辨認客戶端;過期以後,服務端會重新給客戶端發送cookie信息;

  從上面的描述,我們不難理解,cookie就是用來讓服務端辨識客戶端的一種機制;而對於haproxy來講,基於cookie來做會話保持的原理就是通過對後端伺服器響應報文中的cookie信息中添加(或覆蓋的方式)一個鍵值對,在客戶端下次訪問時,檢查對應cookie首部的信息,從而讓haproxy能夠判斷把該請求調度在那個後端伺服器上;通常我們會在server上設置一個cookie的值,在listen或backend中設置一個cookie的鍵,明確說明以怎樣的方式設置cookie的鍵;通過listen或backend中設置的cookie的鍵結合server後面的cookie的值組成的cookie信息,從而實現不同的cookie信息調度到不同的server上去;

  示例:

  提示:以上cookie COOKIE insert nocache表示在後端伺服器響應報文首部中添加一個cookie的名稱為COOKIE,而對應cookie的值就來源於後面server中的cookie的值;nocache表示該cookie不被共有緩存系統緩存;

  測試:重啟haproxy,用瀏覽器訪問看看響應首部有什麼變化

  提示:可以看到當客戶端第一次訪問時,響應首部set-Cookie中就會設置一個COOKIE=web1的值;這個值就是我們剛纔在haproxy配置的,從這個值上看,我們本次訪問被調度到web1上了,之後我們再次訪問時,就不會被調度到其他伺服器上,在cookie過期之前始終都會被調度到web1上響應;這是因為下次我們訪問時,會自動把這個cookie信息攜帶上;如下

  提示:正是因為我們攜帶的cookie信息是COOKIE=web1和haproxy上的web1上的cookie的值相同,所以我們只要攜帶COOKIE=web1就會被調度到web1上;

  用curl 模擬cookie信息訪問不同後端伺服器

  提示:通過不同的cookie信息,就可以訪問到不同後端server了;這樣就實現了基於cookie信息來把相同cookie的請求發送給同一後端server的目的;實現了會話保持;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前一段時間說過一篇繪製極坐標的,這段時間對它進行了改造已經今非昔比了,功能實現了很多,我目的是讓Marker動起來,然後還會繪製Route,上篇也就是簡單的繪製了Route,沒有關於Marker的相關知識。那個Circle有一定的改造,原來的純色改成了漸變,這個你可以提前想好,不過在代碼中你要做好適... ...
  • 外部字體文件 1.後臺代碼引用字體 將一個名為“ChineseCharacterSpecialFont.ttf”的ttf文件,放在桌面路徑,後臺引用方式如下: 1 var ttfFilePath = @"C:\Users\user\Desktop\"; 2 HanziTextBlock.FontFa ...
  • 前言: 在寫了上一篇文章之後, Blazor Server Side 開發教程 - 安裝環境與運行第一個程式 還寫了一個較遠的東西 : 視頻圖文教學 - 用最快的速度把 DotNet Core Blazor 程式安裝到 樹莓派中 並且用網頁控制 GPIO 閃燈 到現在, 居然已經過了一個多星期了. ...
  • 引文 hi,大家好,我是三合。不知各位有沒有想過,如果能把資料庫操作和http訪問都統一封裝成介面(interface)的形式, 然後介面對應的實現類由框架去自動生成,那麼必然能大大降低工作量,因為不需要去寫很多重覆的代碼了,還有一個好處是,都是提供介面,我們把原來資料庫操作的部分,改成http訪問 ...
  • 從去年微軟就將 WPF 開源了,差不多現在所有 WPF 的源代碼都開源了。在學習框架的時候,我會做一些改動,期望能構建一個自己的版本進行測試。但是作為一個特別大的框架,想要構建跑起來可不是直接在 VisualStudio 裡面點擊一下運行就完成了,需要做很多的準備才可以。本文將一步步教你如何構建 W... ...
  • C 繼承 繼承(加上封裝和多態性)是面向對象的編程的三個主要特性(也稱為“支柱”)之一。 繼承用於創建可重用、擴展和修改在其他類中定義的行為的新類。 其成員被繼承的類稱為“基類”,繼承這些成員的類稱為“派生類”。 派生類只能有一個直接基類。 但是,繼承是可傳遞的。 基類和派生類 一個類可以派生自多個 ...
  • C 結構體 在 C 中,結構體是值類型數據結構。它使得一個單一變數可以存儲各種數據類型的相關數據。 struct 關鍵字用於創建結構體。 定義結構體 結構的用法 類 vs 結構 類和結構有以下幾個基本的不同點: 類是引用類型,結構是值類型。 結構不支持繼承。 結構不能聲明預設的構造函數。 C 結構的 ...
  • 在linux命令中“|”是管道符,表示前面的輸出作為後面的輸入 uname 顯示內核 uname -a 顯示內核所有信息 history 查看歷史的命令執行記錄(用!加上執行記錄命令的編號可以執行之前那一條的命令) sosreport 收集系統的信息 who 顯示當前登錄的有那些用戶 who -b ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...