為了確保最大的網路應用程式可用性、擴展性和高性能,現在常見的做法是實施引入冗餘的技術,例如伺服器叢集和負載平衡。例如,設置一個運行相同應用程式的伺服器叢集,然後在它們前面部署負載平衡器
HAProxy是一個開源的、強大的、高性能的、可靠的、安全的並且廣泛使用的高可用性TCP/HTTP負載平衡器、代理伺服器和SSL/TLS終端,專為非常高流量的網站建造。它在Linux、Solaris、FreeBSD、OpenBSD以及AIX作業系統上可靠地運行。
本指南展示了如何在HAProxy上設置一個專用的高可用性負載平衡器,用於CentOS 8上控制NGINX網頁伺服器叢集的流量。它還演示了如何在HAProxy中配置SSL/TLS終端。
先決條件:
A total of 4 servers with minimal CentOS 8 installation.
測試環境設置
----------- HAProxy Server Setup ----------- HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247 Test Site Domain: www.tecmint.lan ----------- Client Web Servers Setup ----------- Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200 Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21 Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34
第一步:在客戶機上設置Nginx HTTP伺服器
1.登入所有的CentOS 8客戶機,並使用dnf包管理器安裝Nginx網頁伺服器,如下所示。
# dnf install Nginx
2. 接下來,啟動 Nginx 服務,並設定為在系統啟動時自動啟動,使用 systemctl 命令 確認其運行狀態(在所有客戶端機器上進行此操作)。
# systemctl start nginx # systemctl enable nginx # systemctl status nginx
3. 此外,如果所有客戶端機器上都在運行 firewalld 服務(您可以通過運行 systemctl start firewalld 來檢查),您必須在防火牆配置中添加 HTTP 和 HTTPS 服務,以允許來自負載平衡器的請求通過防火牆到達 Nginx 網頁伺服器。然後重新加載 firewalld 服務以使新變更生效(在所有客戶端機器上進行此操作)。
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent --add-service=https # firewall-cmd --reload
4. 接下來,在您的本地機器上打開網頁瀏覽器,測試 Nginx 安裝是否正常運行。使用客戶端 IP 導航,一旦您看到 Nginx 測試頁面,這意味著安裝在客戶端機器上的網頁伺服器運行正常。

5. 接下來,我們需要在客戶端機器上創建測試頁面,稍後我們將使用它們來測試 HAProxy 設置。
----------- Web Server #1 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html ----------- Web Server #2 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html ----------- Web Server #3 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html
步驟2:在 CentOS 8 上安裝和配置 HAProxy 伺服器
6. 現在在 HAProxy 伺服器上安裝 HAProxy 套件,執行以下命令。
# dnf install haproxy
7. 接著,啟動 HAProxy 服務,啟用自動啟動系統並驗證其狀態。
# systemctl start haproxy # systemctl enable haproxy # systemctl status haproxy

8. 現在我們將使用以下配置文件配置 HAProxy。
# vi /etc/haproxy/haproxy.cfg
配置文件分為四個主要部分。
- 全局設置 – 設置整個進程的參數。
- 默認 – 此部分為其聲明後的所有其他部分設置默認參數。
- 前端 – 此部分描述一組接受客戶端連接的監聽套接字。
- 後端 – 此部分描述一組伺服器,代理將連接以轉發傳入連接。
要了解 全局設置 和 默認 下的選項,請閱讀 HAProxy 文檔(文章末尾提供鏈接)。對於本指南,我們將使用默認值。
設置 HAProxy 日誌記錄
9. 一旦部署 HAProxy 將在您的 IT 基礎設施中發揮重要作用,因此為其配置日誌記錄是基本要求;這使您能夠獲得有關每個連接到後端 Web 伺服器的洞察。
日誌參數(在下面的截圖中突出顯示)宣告一個全局Syslog伺服器(例如rsyslog在CentOS中的默認值),將接收日誌消息。這裡可以宣告多個伺服器。
默認配置指向localhost(127.0.0.1),local2是用於識別rsyslog下的HAProxy日誌消息的默認設施代碼。

10. 接下來,您需要告訴rsyslog伺服器如何接收和處理HAProxy日誌消息。打開rsyslog配置文件到/etc/rsyslog.conf或在/etc/rsyslog.d目錄中創建一個新文件,例如/etc/rsyslog.d/haproxy.conf</diy16。
# vi /etc/rsyslog.d/haproxy.conf
複製並粘貼以下配置以使用UDP在默認端口514收集日誌。
$ModLoad imudp $UDPServerAddress 127.0.0.1 $UDPServerRun 514
還要添加這些行以指示rsyslog根據嚴重性寫入兩個獨立的日誌文件,其中local2是上面HAProxy配置中定義的設施代碼。
local2.* /var/log/haproxy-traffic.log local2.notice /var/log/haproxy-admin.log
11.保存文件並關閉它。然後重新啟動rsyslog服務以應用最近的更改。
# systemctl restart rsyslog
配置HAProxy前端和後端
12. 在本節中,我們將演示如何配置前端和後端代理。返回到 HAProxy 配置文件,並按照以下方式修改默認的前端和後端部分。我們不會對每個參數進行詳細解釋,您可以隨時參考官方文檔。
以下配置定義了一個用於提供 HAProxy 統計 頁面的 listen 部分。 bind 參數將監聽器分配給給定的 IP 地址(在這種情況下為 *
)和 端口(9000)。
統計 enable 設置啟用統計頁面,將使用 URI /stats 進行訪問(即 http://server_ip:9000/stats
)。
統計 auth 設置用於在訪問頁面時添加基本身份驗證(將 haproxy 和 Lostp@1ss 替換為您選擇的用戶名和密碼)。
listen stats bind *:9000 stats enable stats hide-version stats uri /stats stats admin if LOCALHOST stats auth haproxy:Lostp@1ss
13. 下一個配置定義了一個名為 TL 的前端部分(您可以自行命名)。 mode 參數定義了 HAProxy 運行的模式。
acl(存取控制清單)參數用於根據從請求中提取的內容做出決定。在這個例子中,如果請求不是通過SSL進行的,則將其視為普通的HTTP。
然後使用http-request set-header設置來向請求添加HTTP標頭。這有助於通知Nginx初始請求是通過HTTP(或通過端口80)進行的。
default_backend或use_backend指令定義了後端伺服器,在這種情況下,由TL_web_servers引用。
請注意,如果一個請求沒有被use_backend或default_backend指令路由,HAProxy將返回“503服務不可用錯誤”。
frontend TL bind *:80 mode http acl http ssl_fc,not http-request set-header X-Forwarded-Protocol http if http default_backend TL_web_servers
14.然後我們需要定義一個後端部分,其中balance設置定義了HAProxy如何選擇後端伺服器來處理請求,如果沒有持久性方法覆蓋該選擇。
cookie指令啟用基於cookie的持久性,它指示HAProxy向客戶端發送一個名為SERVERID的cookie,並將其與給出初始響應的伺服器的ID關聯起來。
server指令用於定義上游伺服器的格式為server_name(例如websrv1)、server_IP:port和options。
其中一個關鍵選項是check,告訴HAProxy持續檢查伺服器的可用性並在統計頁面上報告。
backend TL_web_servers mode http balance roundrobin option httpchk HEAD / cookie SERVERUID insert indirect nocache server websrv1 10.42.0.200:80 cookie websrv1 check server websrv2 10.42.0.21:80 cookie websrv2 check server websrv3 10.42.0.34:80 cookie websrv3 check
如下圖所示,註釋掉其他前端和後端部分。保存文件並關閉它。

15.現在重新啟動HAProxy服務以應用新更改。
# systemctl restart haproxy
16.接下來,確保防火牆中開啟HTTP(端口80)和HTTPS(端口433)服務以接受客戶端請求。同時,開啟防火牆中的端口9000以訪問統計頁面並重新加載防火牆設置。
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent –add-service=https # firewall-cmd --zone=public --permanent --add-port=9000/tcp # firewall-cmd --reload
第3步:測試HAProxy設置並查看統計資料
17.現在是時候測試HAPrxoy設置了。在您從中訪問所有伺服器的本地桌面機器上,將以下行添加到/etc/hosts文件中,以啟用我們使用虛擬網站域名。
10.42.0.247 www.tecmint.lan
18.然後打開瀏覽器,使用伺服器地址或網站域名進行導航。
http://10.42.0.247/ OR http://www.tecmint.lan/

19.要訪問HAProxy統計頁面,請使用以下地址。
http://10.42.0.247:9000/stats
然後使用您在HAProxy配置文件中定義的用戶名和密碼(參考stats auth參數)。

成功登錄後,您將進入顯示伺服器健康狀況、當前請求速率、響應時間等指標的HAProxy統計頁面。
為了演示狀態報告如何運作,我們已經放置了一個後端伺服器。

第4步:使用自簽名SSL證書在HAProxy中配置HTTPS
20.在這最後一部分,我們將演示如何配置SSL/TLS以保護HAProxy伺服器和客戶端之間的所有通信。HAProxy支持四種主要的HTTPS配置模式,但在本指南中,我們將使用SSL/TLS卸載。
在SSL/TLS卸載模式中,HAProxy在客戶端解密流量並以明文流量連接到後端伺服器。
我們將首先創建證書和金鑰,如所示(根據證書創建期間的公司詳細信息回答問題,如截圖中所示)。
# mkdir /etc/ssl/tecmint.lan # cd /etc/ssl/tecmint.lan/ # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt # cd /etc/ssl/tecmint.lan/ # cat tecmint.crt tecmint.key >tecmint.pem # ls -l

21.接下來,打開HAProxy配置文件(/etc/haproxy/haproxy.cfg)並編輯前端部分。
frontend TL bind *:80 bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem redirect scheme https if !{ ssl_fc } mode http acl http ssl_fc,not acl https ssl_fc http-request set-header X-Forwarded-Protocol http if http http-request set-header X-Forwarded-Protocol https if https default_backend TL_web_servers

保存文件並關閉它。
22.然後重新啟動HAProxy服務以應用新更改。
# systemctl restart haproxy.service
23.接下來,打開網頁瀏覽器並再次嘗試訪問該網站。由於自簽名證書,瀏覽器將顯示錯誤,點擊進階以繼續。



這就是全部內容!每個網絡應用程序都有自己的一套要求,您需要設計和配置負載平衡以滿足您的IT基礎設施和應用程序的需求。
要獲取有關本指南中使用的某些配置選項以及通常如何使用HAProxy的更多見解,請參閱官方HAProxy社區版文檔或HAProxy企業版文檔。您可以通過下面的反饋表格發布任何問題或想法。
Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/