Haproxy安裝與配置

Haproxy安裝與配置html

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

一、Haproxy概念

1.一、haproxy原理

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

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

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

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

1.二、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是支持虛擬主機的。

二、環境

內核版本: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/#downgit

三、安裝Haproxy

3.一、yum安裝:參考

3.1.一、官方base源安裝

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

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

3.1.二、SCL源安裝haproxy1.8

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

sudo yum install centos-release-scl -y

安裝haproxy:訪問慢redis

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.二、編譯安裝Haproxy

3.2.一、建立運行帳戶和組

groupadd --system haproxy                          #添加haproxy的組
useradd --system -M -g haproxy haproxy -s /sbin/nologin  #建立haproxy的系統帳戶到haproxy的組,可是禁止其登錄系統。

3.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.三、建立目錄

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.四、查看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 <willy@haproxy.org>

3.2.五、把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

四、配置Haproxy

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

4.一、爲多配置文件準備,省略;

熟悉 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.二、配置模板

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.三、配置說明

轉發規則

前端配置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和端口;

五、配置日誌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.一、啓動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.二、前端登錄頁面

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

6.三、後臺監控登錄

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

參考

http://www.javashuo.com/article/p-qxlniskh-dn.html
http://www.ttlsa.com/linux/haproxy-study-tutorial/

相關文章
相關標籤/搜索