1. 程式人生 > >CentOS7.3 部署Haproxy 1.7.2

CentOS7.3 部署Haproxy 1.7.2

-- sts lob 末尾 裝包 backend iptables 失敗 fresh

  1. haproxy:http://www.haproxy.org/

本文涉及haproxy的安裝,並做簡單配置。

一.環境準備

1. 操作系統

CentOS-7-x86_64-Everything-1511

2. Haproxy版本

截至2017-02-23,haproxy穩定版本是1.7.2: http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz

3. 拓撲圖

技術分享圖片

  1. haproxy服務器采用VMware ESXi虛擬出的1臺服務器,前端訪問地址10.11.4.152,後端地址192.168.4.152;1
  2. Web1服務器為采用docker技術生成的1臺服務器,已安裝並啟動nginx服務,ip地址192.168.4.171;
  3. Web2同Web1服務器,ip地址192.168.4.172;
  4. 設置web1/2測試頁面(路徑參考nginx安裝步驟),以方便後續查看驗證結果。

    技術分享圖片

    技術分享圖片

二.Haproxy安裝

1. 下載

[root@elk-node2 ~]# cd /usr/local/src/
[root@elk-node2 src]# wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz

2. 編譯安裝

技術分享圖片
#”TARGET”指定編譯對應的os對應的內核版本,通過”uname -r”查詢內核版本呢,README文件可查詢對應關系
[root@elk-node2 src]# tar -zxvf haproxy-1.7.2.tar.gz
[root@elk-node2 src]# cd haproxy-1.7.2
[root@elk-node2 haproxy-1.7.2]# make TARGET=linux2628 PREFIX=/usr/local/haproxy
[root@elk-node2 haproxy-1.7.2]# make install PREFIX=/usr/local/haproxy
技術分享圖片

三.Haproxy配置

1. 配置用戶

[root@elk-node2 ~]# groupadd haproxy
[root@elk-node2 ~]# useradd -g haproxy haproxy -s /sbin/nologin

2. 配置文件

1)配置文件詳解

技術分享圖片
#默認安裝目錄下沒有配置文件,只有”doc”,“sbin”,“share”三個目錄,可手工創建目錄及配置文件;
#haproxy的配置文件主要是以下5部分:global全局配置、defaults默認配置、監控頁面配置、frontend配置、backend配置
[root@elk-node2 ~]# mkdir -p /usr/local/haproxy/etc
[root@elk-node2 ~]# cd /usr/local/haproxy/etc/
[root@elk-node2 etc]# vim haproxy.cfg

#全局配置, 用於設定義全局參數, 屬於進程級的配置, 通常與操作系統配置有關.
global
    #定義全局日誌, 配置在本地, 通過local0 輸出, 默認是info級別,可配置兩條
    log         127.0.0.1 local0 warning
    #定義日誌級別【error warning info debug】
    #log         127.0.0.1 local1 info
    
    #運行路徑
    chroot      /usr/local/haproxy
    #PID 文件存放路徑
    pidfile     /var/run/haproxy.pid
    
    #設置每haproxy進程的最大並發連接數, 其等同於命令行選項“-n”; “ulimit -n”自動計算的結果參照此參數設定.
    maxconn     4096
    
    #運行haproxy 用戶, 或者使用關鍵字uid
    user        haproxy
    #運行haproxy 用戶組, 或者使用關鍵字gid
    group       haproxy
    
    #後臺運行haproxy
    daemon

    #設置啟動的haproxy進程數量, 只能用於守護進程模式的haproxy;
    #默認只啟動一個進程, 鑒於調試困難等多方面的原因, 一般只在單進程僅能打開少數文件描述符的場景中才使用多進程模式.
    nbproc      1
    #設置每進程所能夠打開的最大文件描述符數目, 默認情況其會自動進行計算, 因此不推薦修改此選項.
    #ulimit-n 819200 
    
    #調試級別, 一般只在開啟單進程時調試, 且生產環境禁用.
    #debug
    #haproxy啟動後不會顯示任何相關信息, 這與在命令行啟動haproxy時加上參數“-q”相同
    #quiet
    
    #定義統計信息保存位置
    stats socket /usr/local/haproxy/stats

#默認配置    
defaults
    #默認的模式【tcp:4層; http:7層; health:只返回OK】
    mode        http
    
    #繼承全局的日誌定義輸出
    log         global
    
    #日誌類別, httplog
    #option      httplog 

    #如果後端服務器需要記錄客戶端真實ip, 需要在HTTP請求中添加”X-Forwarded-For”字段;
    #但haproxy自身的健康檢測機制訪問後端服務器時, 不應將記錄訪問日誌,可用except來排除127.0.0.0,即haproxy本身.
    #option      forwardfor except 127.0.0.0/8
    option      forwardfor 

    #開啟http協議中服務器端關閉功能, 每個請求完畢後主動關閉http通道, 使得支持長連接,使得會話可以被重用,使得每一個日誌記錄都會被記錄.
    option      httpclose 

    #如果產生了一個空連接,那這個空連接的日誌將不會記錄.
    option      dontlognull

    #當與後端服務器的會話失敗(服務器故障或其他原因)時, 把會話重新分發到其他健康的服務器上; 當故障服務器恢復時, 會話又被定向到已恢復的服務器上;
    #還可以用”retries”關鍵字來設定在判定會話失敗時的嘗試連接的次數
    option      redispatch
    retries     3
    
    #當haproxy負載很高時, 自動結束掉當前隊列處理比較久的鏈接.
    option      abortonclose

    #默認http請求超時時間
    timeout http-request    10s
    #默認隊列超時時間, 後端服務器在高負載時, 會將haproxy發來的請求放進一個隊列中. 
    timeout queue           1m
    #haproxy與後端服務器連接超時時間.
    timeout connect         5s
    #客戶端與haproxy連接後, 數據傳輸完畢, 不再有數據傳輸, 即非活動連接的超時時間.
    timeout client          1m
    #haproxy與後端服務器非活動連接的超時時間.
    timeout server          1m
    #默認新的http請求連接建立的超時時間,時間較短時可以盡快釋放出資源,節約資源.
    timeout http-keep-alive 10s
    #心跳檢測超時時間
    timeout check           10s
    
    #最大並發連接數
    maxconn                 2000
    
    #設置默認的負載均衡方式
    #balance source 
    #balnace leastconn

#統計頁面配置, frontend和backend的組合體, 監控組的名稱可按需自定義
listen admin_status
    #配置監控運行模式
    mode http
    
    #配置統計頁面訪問端口
    bind 0.0.0.0:1080
    
    #統計頁面默認最大連接數
    maxconn 10
    
    #http日誌格式
    option httplog 
    
    #開啟統計
    stats enable
    
    #隱藏統計頁面上的haproxy版本信息
    stats hide-version
    
    #監控頁面自動刷新時間
    stats refresh 30s
    
    #統計頁面訪問url
    stats uri /stats
    
    #統計頁面密碼框提示文本
    stats realm mCloud\ Haproxy
    
    #監控頁面的用戶和密碼:admin, 可設置多個用戶名
    stats auth admin:admin
    
    #手工啟動/禁用後端服務器, 可通過web管理節點
    stats admin if TRUE

    #設置haproxy錯誤頁面
    errorfile 400 /usr/local/haproxy/errorfiles/400.http
    errorfile 403 /usr/local/haproxy/errorfiles/403.http
    errorfile 408 /usr/local/haproxy/errorfiles/408.http
    errorfile 500 /usr/local/haproxy/errorfiles/500.http
    errorfile 502 /usr/local/haproxy/errorfiles/502.http
    errorfile 503 /usr/local/haproxy/errorfiles/503.http
    errorfile 504 /usr/local/haproxy/errorfiles/504.http

#監控haproxy後端服務器的監控狀態
listen site_status 
       bind 0.0.0.0:1081                       #監聽端口
       mode http                               #http的7層模式
       log 127.0.0.1 local2 err                #[err warning info debug] 
       monitor-uri /site_status                #網站健康檢測URL,用來檢測HAProxy管理的網站是否可以用,正常返回200,不正常返回503 
       acl site_dead nbsrv(php_server) lt 1    #定義網站down時的策略當掛在負載均衡上的指定backend的中有效機器數小於1臺時返回true 
       acl site_dead nbsrv(html_server) lt 1 
       acl site_dead nbsrv(backend_default)  lt 1  
       monitor fail if site_dead               #當滿足策略的時候返回503,網上文檔說的是500,實際測試為503 
       monitor-net 192.168.4.171/32            #來自192.168.4.152的日誌信息不會被記錄和轉發
       monitor-net 192.168.4.172/32
    
#frontend, 名字自定義
frontend HAproxy_Cluster
    #定義前端監聽端口, 建議采用bind *:80的形式,否則做集群高可用的時候有問題,vip切換到其余機器就不能訪問.
    bind 0.0.0.0:80

    #acl後面是規則名稱,當請求的url末尾是以.php結尾時,匹配觸發php_web規則,以下兩種寫法均可.
    acl php_web url_reg /*.php

    #當請求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif結尾時,匹配並觸發static_web規則.
    #acl static_web path_end .gif .png .jpg .css .js .jpeg
    #acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$

    #-i為忽略大小寫,當被請求的是以www.test.com開頭的主機時,匹配並觸發dns_name規則.
    acl html_web hdr_beg(host) -i www.haproxytest.com
    #acl html_web hdr_beg(host) 10.11.4.152

    #當客戶端的IP是x.x.x.x時,匹配並觸發src_ip規則.
    #acl src_ip src x.x.x.x

    #如果匹配acl規則php_web,將請求轉交到php_server組處理;如果匹配acl規則html_web,將請求轉交到html_server組處理.
    use_backend php_server if php_web
    use_backend html_server if html_web

    #如果以上規則都不匹配時,將請求轉交到default_backend組處理.
    default_backend backend_default

#backend後端配置, 配置php_server組與html_server組
backend php_server

    #定義負載均衡方式為roundrobin方式, 即基於權重進行輪詢調度的算法, 在服務器性能分布較均勻情況下推薦.
    #另有如下幾種負載均衡方式:
    #-- static-rr: 也是基於權重進行輪轉調度, 但屬於靜態方法, 運行時調整後端機組權重不會使用新的權重;
    #-- source: 基於請求源IP進行hash運算匹配後端服務器組;
    #-- leastconn: 不適合會話較短的環境, 如基於http的應用;
    #-- uri: 對整個URI進行hash運算;
    #-- uri_param: 對URI中的參數進行轉發;
    #-- hdr(<name>):根據http頭進行轉發, 無該頭部則轉為使用roundrobin.
    balance roundrobin

    mode http

    #允許插入serverid到cookie中,serverid後面可定義
    cookie SERVERID

    #心跳檢測方式為檢測後端服務器index.html文件,還有其他方式
    option httpchk GET /index.html

    #後端服務器定義, maxconn 1024表示該服務器的最大連接數, cookie 1表示serverid為1, weight代表權重(默認1,最大為265,0則表示不參與負載均衡), 
    #check inter 1500是檢測心跳頻率, rise 2是2次正確認為服務器可用, fall 3是3次失敗認為服務器不可用.
    server php1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3

backend html_server
    balance source
    mode http
    server html1 192.168.4.172:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3

backend backend_default
    balance source
    mode http
    server default1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3
技術分享圖片

2)error文件

#配置文件中統計監控頁面部分定義了error文件,將安裝包中的文件復制到安裝目錄使用
[root@elk-node2 ~]# cp -r /usr/local/src/haproxy-1.7.2/examples/errorfiles/ /usr/local/haproxy/

3)日誌文件

創建文件

技術分享圖片
[root@elk-node2 ~]# mkdir -p /usr/local/haproxy/log
[root@elk-node2 ~]# touch /usr/local/haproxy/log/haproxy.log
[root@elk-node2 ~]# ln -s /usr/local/haproxy/log/haproxy.log /var/log/
[root@elk-node2 ~]# chown haproxy:haproxy /var/log/haproxy.log
技術分享圖片

rsyslog主配置文件

#修改”SYSLOGD_OPTIONS”參數,-c 2 使用兼容模式,默認是 -c 5;-r 開啟遠程日誌;-m 0 標記時間戳,單位是分鐘,0表示禁用該功能
[root@elk-node2 ~]# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 2 -r -m 0"

rsyslog文件

技術分享圖片
#haproxy默認沒有日誌,依靠rsyslog收集日誌;
#文件最末尾的“&~”,如果沒有此配置,日誌除寫入指定文件外,會同步寫入messages文件
[root@elk-node2 ~]# cd /etc/rsyslog.d/
[root@elk-node2 rsyslog.d]# touch haproxy.conf
[root@elk-node2 rsyslog.d]# chown haproxy:haproxy haproxy.conf
[root@elk-node2 rsyslog.d]# vim haproxy.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# haproxy.log
#  
local0.*   /usr/local/haproxy/log/haproxy.log
#local1.*   /usr/local/haproxy/log/haproxy.log
local2.*   /usr/local/haproxy/log/haproxy.log
&~

[root@elk-node2 rsyslog.d]# systemctl restart rsyslog.service

#關閉selinux,本文因沒有關閉selinux導致排查問題用了比較長的時間
[root@elk-node2 rsyslog.d]# setenforce 0
技術分享圖片

4)配置文件權限及軟鏈接

技術分享圖片
[root@elk-node2 ~]# chown -R haproxy:haproxy /usr/local/haproxy/
[root@elk-node2 ~]# mkdir -p /etc/haproxy
[root@elk-node2 ~]# ln -s /usr/local/haproxy/etc/haproxy.cfg /etc/haproxy/
[root@elk-node2 ~]# chown -R haproxy:haproxy /etc/haproxy
技術分享圖片

3. 配置開機啟動

技術分享圖片
[root@elk-node2 ~]# cp /usr/local/src/haproxy-1.7.2/examples/haproxy.init /etc/rc.d/init.d/haproxy
[root@elk-node2 ~]# chown haproxy:haproxy /etc/rc.d/init.d/haproxy
[root@elk-node2 ~]# chmod +x /etc/rc.d/init.d/haproxy
[root@elk-node2 ~]# chkconfig --add haproxy
[root@elk-node2 ~]# chkconfig --level 35 haproxy on
技術分享圖片

4. 配置全局啟動文件

#采用軟鏈接方式
[root@elk-node2 ~]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
[root@elk-node2 ~]# chown haproxy:haproxy /usr/sbin/haproxy

5. 配置防火墻

技術分享圖片
#開放如上端口,均在配置文件中有定義,日誌端口在rsyslog.d/haproxy.conf文件中定義
[root@elk-node2 ~]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1081 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m tcp --dport 514 -j ACCEPT

[root@elk-node2 ~]# service iptables restart
技術分享圖片

6. 啟動並驗證

[root@elk-node2 ~]# service haproxy start

1)端口驗證

[root@elk-node2 ~]# netstat –tunlp

技術分享圖片

2)監控頁面

監控頁面展示信息與賬戶/密碼在配置文件中已定義。

技術分享圖片

技術分享圖片

技術分享圖片

3)訪問頁面

觸發配置文件中定義的php_server組,如下:

技術分享圖片

觸發配置文件中定義的html_server組(在本地修改hosts文件),如下:

技術分享圖片

觸發配置文件中定義的backend_default組,如下:

技術分享圖片

CentOS7.3 部署Haproxy 1.7.2