如何在 CentOS 8 上將 HAProxy 設置為 Nginx 的負載平衡器

為了確保最大的網路應用程式可用性、擴展性和高性能,現在常見的做法是實施引入冗餘的技術,例如伺服器叢集和負載平衡。例如,設置一個運行相同應用程式的伺服器叢集,然後在它們前面部署負載平衡器

HAProxy是一個開源的、強大的、高性能的、可靠的、安全的並且廣泛使用的高可用性TCP/HTTP負載平衡器、代理伺服器和SSL/TLS終端,專為非常高流量的網站建造。它在LinuxSolarisFreeBSDOpenBSD以及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 來檢查),您必須在防火牆配置中添加 HTTPHTTPS 服務,以允許來自負載平衡器的請求通過防火牆到達 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 測試頁面,這意味著安裝在客戶端機器上的網頁伺服器運行正常。

Test Nginx Installation on All CentOS 8 Client Machines

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
Verify HAProxy Status in CentOS 8

8. 現在我們將使用以下配置文件配置 HAProxy。

# vi /etc/haproxy/haproxy.cfg

配置文件分為四個主要部分。

  • 全局設置 – 設置整個進程的參數。
  • 默認 – 此部分為其聲明後的所有其他部分設置默認參數。
  • 前端 – 此部分描述一組接受客戶端連接的監聽套接字。
  • 後端 – 此部分描述一組伺服器,代理將連接以轉發傳入連接。

要了解 全局設置默認 下的選項,請閱讀 HAProxy 文檔(文章末尾提供鏈接)。對於本指南,我們將使用默認值。

設置 HAProxy 日誌記錄

9. 一旦部署 HAProxy 將在您的 IT 基礎設施中發揮重要作用,因此為其配置日誌記錄是基本要求;這使您能夠獲得有關每個連接到後端 Web 伺服器的洞察。

日誌參數(在下面的截圖中突出顯示)宣告一個全局Syslog伺服器(例如rsyslog在CentOS中的默認值),將接收日誌消息。這裡可以宣告多個伺服器。

默認配置指向localhost127.0.0.1),local2是用於識別rsyslog下的HAProxy日誌消息的默認設施代碼。

HAProxy Default Log Parameter

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 設置用於在訪問頁面時添加基本身份驗證(將 haproxyLostp@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_backenduse_backend指令定義了後端伺服器,在這種情況下,由TL_web_servers引用。

請注意,如果一個請求沒有被use_backenddefault_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:portoptions

其中一個關鍵選項是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

如下圖所示,註釋掉其他前端和後端部分。保存文件並關閉它。

Configuring HAProxy Front-end and Back-ends

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/
Check HAProxy Setup

19.要訪問HAProxy統計頁面,請使用以下地址。

http://10.42.0.247:9000/stats

然後使用您在HAProxy配置文件中定義的用戶名和密碼(參考stats auth參數)。

HAProxy Stats Login Page

成功登錄後,您將進入顯示伺服器健康狀況、當前請求速率、響應時間等指標的HAProxy統計頁面。

為了演示狀態報告如何運作,我們已經放置了一個後端伺服器。

HAProxy Statistics Report

第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
Create SSL for HAProxy

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
Configure HAProxy Front-end with SSL

保存文件並關閉它。

22.然後重新啟動HAProxy服務以應用新更改。

# systemctl restart haproxy.service

23.接下來,打開網頁瀏覽器並再次嘗試訪問該網站。由於自簽名證書,瀏覽器將顯示錯誤,點擊進階以繼續。

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

這就是全部內容!每個網絡應用程序都有自己的一套要求,您需要設計和配置負載平衡以滿足您的IT基礎設施和應用程序的需求。

要獲取有關本指南中使用的某些配置選項以及通常如何使用HAProxy的更多見解,請參閱官方HAProxy社區版文檔HAProxy企業版文檔。您可以通過下面的反饋表格發布任何問題或想法。

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/