Linux中國

使用 HAProxy 配置 HTTP 負載均衡器

什麼是 HTTP 負載均衡

HTTP 負載均衡是一個網路解決方案,它將進入的 HTTP 或 HTTPs 請求分配至一組提供相同的 Web 應用內容的伺服器用於響應。通過將請求在這樣的多個伺服器間進行均衡,負載均衡器可以防止伺服器出現單點故障,可以提升整體的可用性和響應速度。它還可以讓你能夠簡單的通過添加或者移除伺服器來進行橫向擴展或收縮,對工作負載進行調整。

什麼時候,什麼情況下需要使用負載均衡?

負載均衡可以提升伺服器的使用性能和最大可用性,當你的伺服器開始出現高負載時就可以使用負載均衡。或者你在為一個大型項目設計架構時,在前端使用負載均衡是一個很好的習慣。當你的環境需要擴展的時候它會很有用。

什麼是 HAProxy

HAProxy 是一個流行的開源的 GNU/Linux 平台下的 TCP/HTTP 伺服器的負載均衡和代理軟體。HAProxy 是單線程,事件驅動架構,可以輕鬆的處理 10 Gbps 速率 的流量,在生產環境中被廣泛的使用。它的功能包括自動健康狀態檢查,自定義負載均衡演算法,HTTPS/SSL 支持,會話速率限制等等。

這個教程要實現怎樣的負載均衡

在這個教程中,我們會為 HTTP Web 伺服器配置一個基於 HAProxy 的負載均衡。

準備條件

你至少要有一台,或者最好是兩台 Web 伺服器來驗證你的負載均衡的功能。我們假設後端的 HTTP Web 伺服器已經配置好並可以運行

在 Linux 中安裝 HAProxy

對於大多數的發行版,我們可以使用發行版的包管理器來安裝 HAProxy。

在 Debian 中安裝 HAProxy

在 Debian Wheezy 中我們需要添加源,在 /etc/apt/sources.list.d 下創建一個文件 "backports.list" ,寫入下面的內容

deb http://cdn.debian.net/debian wheezy­backports main 

刷新倉庫的數據,並安裝 HAProxy

# apt­ get update
# apt ­get install haproxy 

在 Ubuntu 中安裝 HAProxy

# apt ­get install haproxy 

在 CentOS 和 RHEL 中安裝 HAProxy

# yum install haproxy 

配置 HAProxy

本教程假設有兩台運行的 HTTP Web 伺服器,它們的 IP 地址是 192.168.100.2 和 192.168.100.3。我們將負載均衡配置在 192.168.100.4 的這台伺服器上。

為了讓 HAProxy 工作正常,你需要修改 /etc/haproxy/haproxy.cfg 中的一些選項。我們會在這一節中解釋這些修改。一些配置可能因 GNU/Linux 發行版的不同而變化,這些會被標註出來。

1. 配置日誌功能

你要做的第一件事是為 HAProxy 配置日誌功能,在排錯時日誌將很有用。日誌配置可以在 /etc/haproxy/haproxy.cfg 的 global 段中找到他們。下面是針對不同的 Linux 髮型版的 HAProxy 日誌配置。

CentOS 或 RHEL:

在 CentOS/RHEL中啟用日誌,將下面的:

log         127.0.0.1 local2 

替換為:

log         127.0.0.1 local0 

然後配置 HAProxy 在 /var/log 中的日誌分割,我們需要修改當前的 rsyslog 配置。為了簡潔和明了,我們在 /etc/rsyslog.d 下創建一個叫 haproxy.conf 的文件,添加下面的內容:

$ModLoad imudp 
$UDPServerRun 514  
$template Haproxy,"%msg%n" 
local0.=info ­/var/log/haproxy.log;Haproxy 
local0.notice ­/var/log/haproxy­status.log;Haproxy 
local0.* ~ 

這個配置會基於 $template 在 /var/log 中分割 HAProxy 日誌。現在重啟 rsyslog 應用這些更改。

# service rsyslog restart 

Debian 或 Ubuntu:

在 Debian 或 Ubuntu 中啟用日誌,將下面的內容

log /dev/log        local0 
log /dev/log        local1 notice 

替換為:

log         127.0.0.1 local0 

然後為 HAProxy 配置日誌分割,編輯 /etc/rsyslog.d/ 下的 haproxy.conf (在 Debian 中可能叫 49-haproxy.conf),寫入下面你的內容

$ModLoad imudp 
$UDPServerRun 514  
$template Haproxy,"%msg%n" 
local0.=info ­/var/log/haproxy.log;Haproxy 
local0.notice ­/var/log/haproxy­status.log;Haproxy 
local0.* ~ 

這個配置會基於 $template 在 /var/log 中分割 HAProxy 日誌。現在重啟 rsyslog 應用這些更改。

 # service rsyslog restart 

2. 設置默認選項

下一步是設置 HAProxy 的默認選項。在 /etc/haproxy/haproxy.cfg 的 default 段中,替換為下面的配置:

    defaults 
    log     global 
    mode    http 
    option  httplog 
    option  dontlognull 
    retries 3 
    option redispatch 
    maxconn 20000 
    contimeout      5000 
    clitimeout      50000 
    srvtimeout      50000

上面的配置是當 HAProxy 為 HTTP 負載均衡時建議使用的,但是並不一定是你的環境的最優方案。你可以自己研究 HAProxy 的手冊並配置它。

3. Web 集群配置

Web 集群配置定義了一組可用的 HTTP 伺服器。我們的負載均衡中的大多數設置都在這裡。現在我們會創建一些基本配置,定義我們的節點。將配置文件中從 frontend 段開始的內容全部替換為下面的:

listen webfarm *:80 
       mode http 
       stats enable 
       stats uri /haproxy?stats 
       stats realm Haproxy Statistics 
       stats auth haproxy:stats 
       balance roundrobin 
       cookie LBN insert indirect nocache 
       option httpclose 
       option forwardfor 
       server web01 192.168.100.2:80 cookie node1 check 
       server web02 192.168.100.3:80 cookie node2 check 

"listen webfarm :80" 定義了負載均衡器監聽的地址和埠。為了教程的需要,我設置為 "" 表示監聽在所有介面上。在真實的場景匯總,這樣設置可能不太合適,應該替換為可以從 internet 訪問的那個網卡介面。

stats enable 
stats uri /haproxy?stats 
stats realm Haproxy Statistics 
stats auth haproxy:stats 

上面的設置定義了,負載均衡器的狀態統計信息可以通過 http:///haproxy?stats 訪問。訪問需要簡單的 HTTP 認證,用戶名為 "haproxy" 密碼為 "stats"。這些設置可以替換為你自己的認證方式。如果你不需要狀態統計信息,可以完全禁用掉。

下面是一個 HAProxy 統計信息的例子

"balance roundrobin" 這一行表明我們使用的負載均衡類型。這個教程中,我們使用簡單的輪詢演算法,可以完全滿足 HTTP 負載均衡的需要。HAProxy 還提供其他的負載均衡類型:

  • leastconn:將請求調度至連接數最少的伺服器­
  • source:對請求的客戶端 IP 地址進行哈希計算,根據哈希值和伺服器的權重將請求調度至後端伺服器。
  • uri:對 URI 的左半部分(問號之前的部分)進行哈希,根據哈希結果和伺服器的權重對請求進行調度
  • url_param:根據每個 HTTP GET 請求的 URL 查詢參數進行調度,使用固定的請求參數將會被調度至指定的伺服器上
  • hdr(name):根據 HTTP 首部中的 欄位來進行調度

"cookie LBN insert indirect nocache" 這一行表示我們的負載均衡器會存儲 cookie 信息,可以將後端伺服器池中的節點與某個特定會話綁定。節點的 cookie 存儲為一個自定義的名字。這裡,我們使用的是 "LBN",你可以指定其他的名稱。後端節點會保存這個 cookie 的會話。

server web01 192.168.100.2:80 cookie node1 check 
server web02 192.168.100.3:80 cookie node2 check 

上面是我們的 Web 伺服器節點的定義。伺服器有由內部名稱(如web01,web02),IP 地址和唯一的 cookie 字元串表示。cookie 字元串可以自定義,我這裡使用的是簡單的 node1,node2 ... node(n)

啟動 HAProxy

如果你完成了配置,現在啟動 HAProxy 並驗證是否運行正常。

在 Centos/RHEL 中啟動 HAProxy

讓 HAProxy 開機自啟,使用下面的命令

# chkconfig haproxy on
# service haproxy start 

當然,防火牆需要開放 80 埠,像下面這樣

CentOS/RHEL 7 的防火牆

# firewall­cmd ­­permanent ­­zone=public ­­add­port=80/tcp
# firewall­cmd ­­reload 

CentOS/RHEL 6 的防火牆

把下面內容加至 /etc/sysconfig/iptables 中的 ":OUTPUT ACCEPT" 段中

­A INPUT ­m state ­­state NEW ­m tcp ­p tcp ­­dport 80 ­j ACCEPT 

重啟iptables

# service iptables restart 

在 Debian 中啟動 HAProxy

啟動 HAProxy

# service haproxy start 

不要忘了防火牆開放 80 埠,在 /etc/iptables.up.rules 中加入:

­A INPUT ­p tcp ­­dport 80 ­j ACCEPT 

在 Ubuntu 中啟動HAProxy

讓 HAProxy 開機自動啟動在 /etc/default/haproxy 中配置

ENABLED=1 

啟動 HAProxy:

# service haproxy start 

防火牆開放 80 埠:

# ufw allow 80 

測試 HAProxy

檢查 HAProxy 是否工作正常,我們可以這樣做

首先準備一個 test.php 文件,文件內容如下

<?php
header(&apos;Content-Type: text/plain&apos;);
echo "Server IP: ".$_SERVER[&apos;SERVER_ADDR&apos;];
echo "nX-Forwarded-for: ".$_SERVER[&apos;HTTP_X_FORWARDED_FOR&apos;];
?>

這個 PHP 文件會告訴我們哪台伺服器(如負載均衡)轉發了請求,哪台後端 Web 伺服器實際處理了請求。

將這個 PHP 文件放到兩個後端 Web 伺服器的 Web 根目錄中。然後用 curl 命令通過負載均衡器(192.168.100.4)訪問這個文件

$ curl http://192.168.100.4/test.php 

我們多次運行這個命令此時,會發現交替的輸出下面的內容(因為使用了輪詢演算法):

Server IP: 192.168.100.2
X-Forwarded-for: 192.168.100.4
Server IP: 192.168.100.3
X-Forwarded-for: 192.168.100.4

如果我們停掉一台後端 Web 服務,curl 命令仍然正常工作,請求被分發至另一台可用的 Web 伺服器。

總結

現在你有了一個完全可用的負載均衡器,以輪詢的模式對你的 Web 節點進行負載均衡。還可以去實驗其他的配置選項以適應你的環境。希望這個教程可以幫助你們的 Web 項目有更好的可用性。

你可能已經發現了,這個教程只包含單台負載均衡的設置。這意味著我們仍然有單點故障的問題。在真實場景中,你應該至少部署 2 台或者 3 台負載均衡以防止意外發生,但這不是本教程的範圍。

如果你有任何問題或建議,請在評論中提出,我會盡我的努力回答。

via: http://xmodulo.com/haproxy-http-load-balancer-linux.html

作者:Jaroslav Štěpánek 譯者:Liao 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國