Haproxy安裝與配置

Haproxy安裝與配置

有關高負載均衡的軟件,目前使用比較多的是haproxy、nginx和lvs。下面我們就開始學習haprxoy這款軟件。

1、Haproxy概念

1.1、haproxy原理

haproxy提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。

haproxy特別適用於那些負載特別大的web站點,這些站點通常又需要會話保持或七層處理。haproxy運行在時下的硬件上,完全可以支持數以萬計的併發連接,並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。

haproxy實現了一種事件驅動、單一進程模型,此模型支持非常大的併發連接數。多進程或多線程模型受內存限制、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。

事件驅動模型因爲在有更好的資源和時間管理的用戶端(User-Space)實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以使每個CPU時間片(Cycle)做更多的工作。

1.2、haproxy的優點

  • 免費開源,穩定性也是非常好。單haproxy也跑得不錯,穩定性可以與硬件級的F5相媲美。
  • 根據官方文檔,haproxy可以跑滿10Gbps,這個數值作爲軟件級負載均衡器是相當驚人的。
  • haproxy支持連接拒絕:因爲維護一個連接的打開的開銷是很低的,有時我們很需要限制gongji蠕蟲(attack bots),也就是說限制它們的連接打開從而限制它們的危害。這個已經爲一個陷於小型DDoSgongji的網站開發了而且已經拯救了很多站點,這個優點也是其它負載均衡器沒有的。
  • haproxy支持全透明代理(已具備硬件防火牆的典型特點):可以用客戶端IP地址或者任何其他地址來連接後端服務器。這個特性僅在Linux 2.4/2.6內核打了tcp proxy補丁後纔可以使用。這個特性也使得爲某特殊服務器處理部分流量同時又不修改服務器的地址成爲可能。
  • haproxy現多於線上的Mysql集羣環境,我們常用於它作爲MySQL(讀)負載均衡。
  • 自帶強大的監控服務器狀態的頁面,實際環境中我們結合Nagios進行郵件或短信報警。
  • HAProxy支持虛擬主機,許多朋友說它不支持虛擬主機是錯誤的,通過測試我們知道,HAProxy是支持虛擬主機的。

2、環境

內核版本:3.10.0-862
架構:x86_64
系統版本:CentOS Linux release 7.5.1804 (Core)
HAproxy版本:haproxy-1.8.19.tar.gz
安裝方式:源碼編譯
安裝路徑:/usr/local/haproxy/
官方文檔:https://www.haproxy.org/#docs
下載路徑:https://www.haproxy.org/#down

3、安裝Haproxy

3.1、yum安裝:參考

3.1.1、官方base源安裝

CentOS 6.*CentOS 7安裝的Haproxy版本一樣

[root@node1 ~]# yum install haproxy     # base源
[root@node1 ~]# haproxy -v
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <[email protected]>

3.1.2、SCL源安裝haproxy1.8

安裝 Software Collections (SCL) repository 源以獲取最新版本的haproxy

sudo yum install centos-release-scl -y

安裝haproxy:訪問慢

sudo yum install rh-haproxy18-haproxy rh-haproxy18-haproxy-syspaths -y

開啓:systemctl start rh-haproxy18-haproxy
停止:systemctl stop rh-haproxy18-haproxy
開機啓動:systemctl enable rhhaproxy18-haproxy

3.2、編譯安裝Haproxy

3.2.1、創建運行賬戶和組

groupadd --system haproxy                          #添加haproxy的組
useradd --system -M -g haproxy haproxy -s /sbin/nologin  #創建haproxy的系統賬戶到haproxy的組,但是禁止其登陸系統。

3.2.2、編譯安裝Haproxy

[root@node1 opt]# yum install gcc make -y          # 安裝編譯工具
[root@node1 opt]# wget https://www.haproxy.org/download/1.8/src/haproxy-1.8.19.tar.gz
[root@node1 opt]# tar xf haproxy-1.8.19.tar.gz
[root@node1 opt]# cd haproxy-1.8.19
[root@node1 haproxy-1.8.19]# uname -r
3.10.0-862.el7.x86_64
[root@node1 haproxy-1.8.19]# more README            # 查看安裝說明
... ...
 38   - linux22     for Linux 2.2
 39   - linux24     for Linux 2.4 and above (default)
 40   - linux24e    for Linux 2.4 with support for a working epoll (> 0.21)
 41   - linux26     for Linux 2.6 and above
 42   - linux2628   for Linux 2.6.28, 3.x, and above (enables splice and tproxy)
 43   - solaris     for Solaris 8 or 10 (others untested)
 44   - freebsd     for FreeBSD 5 to 10 (others untested)
 45   - netbsd      for NetBSD
 46   - osx         for Mac OS/X
 47   - openbsd     for OpenBSD 5.7 and above
 48   - aix51       for AIX 5.1
 49   - aix52       for AIX 5.2
 50   - cygwin      for Cygwin
 51   - haiku       for Haiku
 52   - generic     for any other OS or version.
 53   - custom      to manually adjust every setting
... ...

要構建haproxy,必須在上面操作系統中選擇目標操作系統
並將其分配給TARGET變量: 我的內核是3.10.0,選擇linux2628
[root@node1 haproxy-1.8.19]# make TARGET=linux2628 ARCH=x86_64 prefix=/usr/local/haproxy  # TARGET指定內核版本,ARCH指定CPU架構,PREFIX指haprxoy的安裝路徑。
[root@node1 haproxy-1.8.19]# make install PREFIX=/usr/local/haproxy
[root@node1 haproxy-1.8.19]# ll /usr/local/haproxy/
總用量 0
drwxr-xr-x 3 root root 21 3月  22 17:50 doc
drwxr-xr-x 2 root root 21 3月  22 17:50 sbin
drwxr-xr-x 3 root root 17 3月  22 17:50 share
[root@node1 haproxy-1.8.19]# cp -a examples /usr/local/haproxy/    # 拷貝一些模板;

3.2.3、創建目錄

mkdir -pv /usr/local/haproxy/conf/ready/{tcp,http}     # 爲多配置文件準備,省略;
mkdir -pv /usr/local/haproxy/conf/enabled/{tcp,http}   # 爲多配置文件準備,省略;
mkdir -pv /usr/local/haproxy/logs

mkdir -pv /etc/haproxy                      #創建配置目錄
mkdir -pv /usr/share/haproxy/               #防止啓動出錯
touch /usr/local/haproxy/conf/haproxy.cfg   #創建配置文件
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件

3.2.4、查看haprxoy的版本

[root@node1 haproxy-1.8.19]# /usr/local/haproxy/sbin/haproxy -v
HA-Proxy version 1.8.19 2019/02/11
Copyright 2000-2019 Willy Tarreau <[email protected]>

3.2.5、把haproxy添加到系統服務

複製haproxy文件到/usr/sbin下
因爲下面的haproxy.init啓動腳本默認會去/usr/sbin下找。

[root@node1 haproxy-1.8.19]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy

添加到系統服務並開機自啓動

[root@node1 haproxy-1.8.19]# cp ./examples/haproxy.init /etc/init.d/haproxy
[root@node1 haproxy-1.8.19]# chmod 755 /etc/init.d/haproxy
[root@node1 haproxy-1.8.19]# chkconfig --add haproxy
[root@node1 haproxy-1.8.19]# chkconfig haproxy on
[root@node1 haproxy-1.8.19]# chkconfig --list|grep haproxy

注:該輸出結果只顯示 SysV 服務,並不包含
原生 systemd 服務。SysV 配置數據
可能被原生 systemd 配置覆蓋。

      要列出 systemd 服務,請執行 'systemctl list-unit-files'。
      查看在具體 target 啓用的服務請執行
      'systemctl list-dependencies [target]'。

haproxy         0:關 1:關 2:開 3:開 4:開 5:開 6:關

服務管理:

啓動:service haproxy start
停止:service haproxy stop
重載:service haproxy restart
狀態:service haproxy status
檢查:service haproxy test

處理一個報錯

[root@node1 haproxy-1.8.19]# service haproxy status
/etc/init.d/haproxy: 第 26 行:[: =: 期待一元表達式
● haproxy.service - SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments.
   Loaded: loaded (/etc/rc.d/init.d/haproxy; bad; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)

[root@node1 haproxy-1.8.19]# vim +26 /etc/rc.d/init.d/haproxy
 26 [ ${NETWORKING} = "no" ] && exit 0
 改爲:
 26 [ "${NETWORKING}" = "no" ] && exit 0

4、配置Haproxy

官方文檔:
https://cbonte.github.io/haproxy-dconv/1.8/configuration.html

4.1、爲多配置文件準備,省略;

熟悉 Nginx 和 Apache 的朋友都知道,這兩個 Webservice 都支持 include 加載多個配置文件的語法,但是 Haproxy 並不支持!如果現網映射規則非常多,那麼 haproxy.cfg 這個配置文件就很長!
Hparoxy 實現多配置文件的方案,但是不是 include 語法,而是在啓動的時候多次使用-f 拼接配置文件,比如:

cd /usr/local/haproxy/sbin
./haproxy -f ../conf/haproxy.cfg -f ../conf/ext1.cfg -f ../conf/ext2.cfg

因此,我們可以在配置文件目錄以及啓動腳本上做點改變,讓 Haproxy 支持多配置文件。

路徑約定:

  • 待上線的 tcp 映射規則存放目錄:/usr/local/haproxy/conf/ready/tcp
  • 待上線的 http 映射規則存放目錄:/usr/local/haproxy/conf/ready/http
  • 已上線的 tcp 映射規則存放目錄:/usr/local/haproxy/conf/enabled/tcp
  • 已上線的 http 映射規則存放目錄:/usr/local/haproxy/conf/enabled/http
  • Ps:本文爲多配置模式,enabled 裏面的配置爲軟鏈接形式,軟鏈接至 ready 對應配置文件,方便管理。

4.2、配置模板

Haproxy配置中分成五部分內容,當然這些組件不是必選的,可以根據需要選擇作爲配置。
• global:參數是進程級的,通常和操作系統(OS)相關。這些參數一般只設置一次,如果配置無誤,就不需要再次配置進行修改;
• default:配置默認參數的,這些參數可以被利用配置到frontend,backend,listen組件;
• frontend:接收請求的前端虛擬節點,Frontend可以根據規則直接指定具體使用後端的backend(可動態選擇);
• backend:後端服務集羣的配置,是真實的服務器,一個Backend對應一個或者多個實體服務器;
• listen:Frontend和Backend的組合體;通過關聯“前端”和“後端”定義了一個完整的代理,通常只對TCP流量有用。

主配置:/usr/local/haproxy/haproxy.cfg文件

[root@node1 ~]# vim /usr/local/haproxy/conf/haproxy.cfg
#configure haproxy.cfg
# 全局配置
global
    log 127.0.0.1 local0         # 設置日誌
    log 127.0.0.1 local1 notice
    maxconn 4000                 # 最大連接數
    chroot /usr/local/haproxy    # 安裝目錄
    user haproxy
    group haproxy
    daemon                       # 守護進程運行
    #nbproc 1                    # 進程數量,只能用於守護進程模式的haproxy;默認啓動一個進程,一般只在單進程僅能打開少數文件描述符的場景中才使用多進程模式;
    pidfile /var/run/haproxy.pid

# 默認配置
defaults
    log     global
    mode    http                 # 默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
    option  httplog              # http 日誌格式
    option dontlognull           # 不記錄健康檢查日誌信息;
    option  redispatch           # serverId對應的服務器掛掉後,強制定向到其他健康的服務器
    option http-server-close
    #option  abortonclose        # 當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接;
    #option  forwardfor          # 如果後端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip;
    #option  httpclose           # 主動關閉http通道,每次請求完畢後主動關閉http通道,ha-proxy不支持keep-alive,只能模擬這種模式的實現;  
    balance roundrobin           # 負載均衡算法,輪詢;
    retries 3                    # 重試次數;

    timeout http-request  10s    # 客戶端建立連接但不請求數據時,關閉客戶端連接;
    timeout queue         1m     # 等待最大時長;
    timeout connect 10s          # 定義haproxy將客戶端請求轉發至後端服務器所等待的超時時間;
    timeout client 1m            # 客戶端非活動狀態的超長時間(默認毫秒)
    timeout server 1m            # 客戶端與服務器建立連接後,等待服務器端的超時時長(默認毫秒)
    timeout http-keep-alive 10s  # 定義保持連接的超時時長;
    timeout check 10s            # 心跳檢測超時;
    maxconn 3000                 # 每個server最大的連接數;

# 統計頁面配置
listen admin_stats  
    bind 0.0.0.0:50000           # 監聽IP和端口,爲了安全可以設置本機的局域網IP及端口;
    mode http
    option httplog               # 採用http日誌格式  
    stats refresh 30s            # 統計頁面自動刷新時間  
    stats uri /haproxy?stats     # 狀態管理頁面,通過/haproxy?stats來訪問
    stats realm Haproxy Manager  # 統計頁面密碼框上提示文本  
    stats auth admin:psadmin     # 統計頁面用戶名和密碼設置  
    #stats hide-version          # 隱藏統計頁面上HAProxy的版本信息
    #errorfile 403 /usr/local/haproxy/examples/errorfiles/   #設置haproxy 錯誤頁面

#前端配置
frontend http_main
    bind 0.0.0.0:80              # http請求的端口,會被轉發到設置的ip及端口

    # 轉發規則
    #acl url_yuming   path_beg www.yuming.com
    #use_backend server_yuming if url_yuming

    # 默認跳轉項,當上面都沒有匹配上,就轉到backend的http_default上;
    default_backend http_default

    # 提升失敗的時候的用戶體驗
    #errorfile 502 /usr/local/haproxy/examples/errorfiles/502.http
    #errorfile 503 /usr/local/haproxy/examples/errorfiles/503.http
    #errorfile 504 /usr/local/haproxy/examples/errorfiles/504.http

# 後端配置
backend http_default
    # 額外的一些設置,按需使用
    option forwardfor
    option forwardfor header Client-IP
    option http-server-close
    option httpclose

    # 負載均衡方式
    #source 根據請求源IP
    #static-rr 根據權重
    #leastconn 最少連接先處理;在有着較長時間會話的場景中推薦使用此算法,如LDAP、SQL等,其並不太適用於較短會話的應用層協議,如HTTP;此算法是動態的,
    #uri 根據請求的uri
    #url_param 根據請求的url參數
    #rdp-cookie 據據cookie(name)來鎖定並哈希每一次請求
    #hdr(name) 根據HTTP請求頭來鎖定每一次HTTP請求
    #roundrobin 輪詢方式
    balance roundrobin           # 負載均衡的方式,輪詢方式

    # 設置健康檢查頁面
    #option httpchk GET /index.html

    #傳遞客戶端真實IP
    option forwardfor header X-Forwarded-For

    # 需要轉發的ip及端口
    # inter 2000 健康檢查時間間隔2秒
    # rise 3 檢測多少次才認爲是正常的
    # fall 3 失敗多少次才認爲是不可用的
    # weight 30 權重
    server node1 192.168.1.101:8080 check inter 2000 rise 3 fall 3 weight 30
    server node2 192.168.1.101:8081 check inter 2000 rise 3 fall 3 weight 30

多配置模式中,多個 frontend 必須綁定不同的 IP 或者端口,否則數據會串,導致映射到不同的後端而報錯。因此,同一個 IP+端口下的映射務必配置到同一個 frontend 模塊內。

4.3、配置說明

轉發規則

前端配置frontend中

acl url_yuming path_beg www.yuming.com
use_backend yuming if url_yuming

www.yuming.com訪問時,會轉發給後端backend的yuming項目;可用於一下幾種配置:

域名跳轉:客戶端通過訪問某個域名跳轉到跳轉指定服務器或者其他域名;
IP地址跳轉:客戶端訪問指定IP地址時,轉發到後端IP;
端口跳轉:客戶端通過域名加端口訪問時,轉發到後端IP和端口;
動靜分離:
默認跳轉:客戶端訪問時,如果其它規則都不匹配,默認轉發到後端IP和端口;
多ACL匹配:當指定客戶端(根據IP匹配)訪問某一個域名或者IP時,默認轉發到後端IP和端口;

5、配置日誌rsyslog

vim /etc/rsyslog.conf
# 取消如下2行註釋
$ModLoad imudp
$UDPServerRun 514

# 新增配置:local 1~7   –自定義的日誌設備
local7.* /var/log/haproxy.log

重啓syslog服務

# centos 6.*
service rsyslog restart

# CentOS 7.*
systemctl restart rsyslog

6、驗證

6.1、啓動Haproxy

[root@node1 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
[root@node1 ~]# ps -ef |grep haproxy |grep -v grep
root      6950     1  0 19:35 ?        00:00:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg

或者

[root@node1 ~]# service haproxy start
Starting haproxy (via systemctl):                          [  確定  ]
[root@node1 ~]# ps -ef |grep haproxy |grep -v grep
haproxy    4383      1  0 15:53 ?        00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid

haproxy參數說明

-v    顯示版本; 
-vv   顯示已知的構建選項。
-f    指定配置文件啓動;
-p    指定pid文件;
-d    進入調試模式; 
-db    僅禁用後臺模式。
-dM [<byte>]   使用<byte>中毒內存(默認爲0x50)
-V    進入詳細模式(禁用安靜模式)
-D    去守護進程; 
-C    在加載文件之前更改爲<dir>。
-q quiet mode:不顯示消息
-c check mode:只檢查配置文件並退出
-n    設置最大連接數(2000)
-m    限制可用內存量(以MB爲單位)
-N    設置默認的每代理最大連接數(2000)
-L    設置本地對等名稱(默認爲hostname)
-p    將所有子項的pid寫入此文件
-de    即使在可用時也禁用epoll()用法
-dp    即使在可用時也禁用poll()用法
-dS    禁用拼接使用(在舊內核上斷開)
-dG    禁用getaddrinfo()用法
-dV    在服務器端禁用SSL驗證
-sf/-st [pid]*    完成/終止舊的pid。必須是最後的論點。

6.2、前端登陸頁面

URL:http://$IP:80
建議把上面兩個轉發改爲不同的頁面,不停刷新,查看是否有頁面切換;

6.3、後臺監控登陸

URL:http://$IP:50000/haproxy?stats
username:admin
password:psadmin
haproxy監控後臺服務器的情況如圖:
Haproxy安裝與配置

參考

https://www.cnblogs.com/ilanni/p/4750081.html
http://www.ttlsa.com/linux/haproxy-study-tutorial/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章