參考文檔:
1.haproxy:http://www.haproxy.org/
本文涉及haproxy的安裝,并做簡單配置。
一.環(huán)境準(zhǔn)備
1.操作系統(tǒng)
CentOS-7-x86_64-Everything-1511
2.Haproxy版本
截至2017-02-23,haproxy穩(wěn)定版本是1.7.2:
http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
3.拓?fù)鋱D

1)haproxy服務(wù)器采用VMware ESXi虛擬出的1臺(tái)服務(wù)器,前端訪問地址10.11.4.152,后端地址192.168.4.152;1
2)Web1服務(wù)器為采用docker技術(shù)生成的1臺(tái)服務(wù)器,已安裝并啟動(dòng)nginx服務(wù),ip地址192.168.4.171;
3)Web2同Web1服務(wù)器,ip地址192.168.4.172;
4)設(shè)置web1/2測試頁面(路徑參考nginx安裝步驟),以方便后續(xù)查看驗(yàn)證結(jié)果。


二.Haproxy安裝
1.下載
[root@elk-node2 ~]# cd /usr/local/src/
[root@elk-node2 src]# wgethttp://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
2.編譯安裝
[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=linux2628PREFIX=/usr/local/haproxy
[root@elk-node2 haproxy-1.7.2]# make installPREFIX=/usr/local/haproxy
#”TARGET”指定編譯對(duì)應(yīng)的os對(duì)應(yīng)的內(nèi)核版本,通過”uname -r”查詢內(nèi)核版本呢,README文件可查詢對(duì)應(yīng)關(guān)系。
三.Haproxy配置
1.配置用戶
[root@elk-node2 ~]# groupadd haproxy
[root@elk-node2 ~]# useradd -g haproxy haproxy -s/sbin/nologin
2.配置文件
1)配置文件詳解
默認(rèn)安裝目錄下沒有配置文件,只有”doc”,“sbin”,“share”三個(gè)目錄,可手工創(chuàng)建目錄及配置文件。
haproxy的配置文件主要是以下5部分:
global全局配置、defaults默認(rèn)配置、監(jiān)控頁面配置、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
#全局配置,用于設(shè)定義全局參數(shù),屬于進(jìn)程級(jí)的配置,通常與操作系統(tǒng)配置有關(guān).
global
#定義全局日志,配置在本地,通過local0輸出,默認(rèn)是info級(jí)別,可配置兩條
log127.0.0.1 local0warning
#定義日志級(jí)別【error warning info debug】
#log127.0.0.1 local1 info
#運(yùn)行路徑
chroot/usr/local/haproxy
#PID文件存放路徑
pidfile/var/run/haproxy.pid
#設(shè)置每haproxy進(jìn)程的最大并發(fā)連接數(shù),其等同于命令行選項(xiàng)“-n”;“ulimit -n”自動(dòng)計(jì)算的結(jié)果參照此參數(shù)設(shè)定.
maxconn4096
#運(yùn)行haproxy用戶,或者使用關(guān)鍵字uid
userhaproxy
#運(yùn)行haproxy用戶組,或者使用關(guān)鍵字gid
grouphaproxy
#后臺(tái)運(yùn)行haproxy
daemon
#設(shè)置啟動(dòng)的haproxy進(jìn)程數(shù)量,只能用于守護(hù)進(jìn)程模式的haproxy;
#默認(rèn)只啟動(dòng)一個(gè)進(jìn)程,鑒于調(diào)試?yán)щy等多方面的原因,一般只在單進(jìn)程僅能打開少數(shù)文件描述符的場景中才使用多進(jìn)程模式.
nbproc1
#設(shè)置每進(jìn)程所能夠打開的最大文件描述符數(shù)目,默認(rèn)情況其會(huì)自動(dòng)進(jìn)行計(jì)算,因此不推薦修改此選項(xiàng).
#ulimit-n 819200
#調(diào)試級(jí)別,一般只在開啟單進(jìn)程時(shí)調(diào)試,且生產(chǎn)環(huán)境禁用.
#debug
#haproxy啟動(dòng)后不會(huì)顯示任何相關(guān)信息,這與在命令行啟動(dòng)haproxy時(shí)加上參數(shù)“-q”相同
#quiet
#定義統(tǒng)計(jì)信息保存位置
stats socket /usr/local/haproxy/stats
#默認(rèn)配置
defaults
#默認(rèn)的模式【tcp:4層;http:7層;health:只返回OK】
modehttp
#繼承全局的日志定義輸出
logglobal
#日志類別, httplog
#optionhttplog
#如果后端服務(wù)器需要記錄客戶端真實(shí)ip,需要在HTTP請(qǐng)求中添加”X-Forwarded-For”字段;
#但haproxy自身的健康檢測機(jī)制訪問后端服務(wù)器時(shí),不應(yīng)將記錄訪問日志,可用except來排除127.0.0.0,即haproxy本身.
#optionforwardfor except127.0.0.0/8
optionforwardfor
#開啟http協(xié)議中服務(wù)器端關(guān)閉功能,每個(gè)請(qǐng)求完畢后主動(dòng)關(guān)閉http通道,使得支持長連接,使得會(huì)話可以被重用,使得每一個(gè)日志記錄都會(huì)被記錄.
optionhttpclose
#如果產(chǎn)生了一個(gè)空連接,那這個(gè)空連接的日志將不會(huì)記錄.
optiondontlognull
#當(dāng)與后端服務(wù)器的會(huì)話失敗(服務(wù)器故障或其他原因)時(shí),把會(huì)話重新分發(fā)到其他健康的服務(wù)器上;當(dāng)故障服務(wù)器恢復(fù)時(shí),會(huì)話又被定向到已恢復(fù)的服務(wù)器上;
#還可以用”retries”關(guān)鍵字來設(shè)定在判定會(huì)話失敗時(shí)的嘗試連接的次數(shù)
optionredispatch
retries3
#當(dāng)haproxy負(fù)載很高時(shí),自動(dòng)結(jié)束掉當(dāng)前隊(duì)列處理比較久的鏈接.
optionabortonclose
#默認(rèn)http請(qǐng)求超時(shí)時(shí)間
timeout http-request10s
#默認(rèn)隊(duì)列超時(shí)時(shí)間,后端服務(wù)器在高負(fù)載時(shí),會(huì)將haproxy發(fā)來的請(qǐng)求放進(jìn)一個(gè)隊(duì)列中.
timeout queue1m
#haproxy與后端服務(wù)器連接超時(shí)時(shí)間.
timeout connect5s
#客戶端與haproxy連接后,數(shù)據(jù)傳輸完畢,不再有數(shù)據(jù)傳輸,即非活動(dòng)連接的超時(shí)時(shí)間.
timeout client1m
#haproxy與后端服務(wù)器非活動(dòng)連接的超時(shí)時(shí)間.
timeout server1m
#默認(rèn)新的http請(qǐng)求連接建立的超時(shí)時(shí)間,時(shí)間較短時(shí)可以盡快釋放出資源,節(jié)約資源.
timeout http-keep-alive 10s
#心跳檢測超時(shí)時(shí)間
timeout check10s
#最大并發(fā)連接數(shù)
maxconn2000
#設(shè)置默認(rèn)的負(fù)載均衡方式
#balance source
#balnace leastconn
#統(tǒng)計(jì)頁面配置, frontend和backend的組合體,監(jiān)控組的名稱可按需自定義
listen admin_status
#配置監(jiān)控運(yùn)行模式
mode http
#配置統(tǒng)計(jì)頁面訪問端口
bind 0.0.0.0:1080
#統(tǒng)計(jì)頁面默認(rèn)最大連接數(shù)
maxconn 10
#http日志格式
option httplog
#開啟統(tǒng)計(jì)
stats enable
#隱藏統(tǒng)計(jì)頁面上的haproxy版本信息
stats hide-version
#監(jiān)控頁面自動(dòng)刷新時(shí)間
stats refresh 30s
#統(tǒng)計(jì)頁面訪問url
stats uri /stats
#統(tǒng)計(jì)頁面密碼框提示文本
stats realm mCloud\ Haproxy
#監(jiān)控頁面的用戶和密碼:admin,可設(shè)置多個(gè)用戶名
stats auth admin:admin
#手工啟動(dòng)/禁用后端服務(wù)器,可通過web管理節(jié)點(diǎn)
stats admin if TRUE
#設(shè)置haproxy錯(cuò)誤頁面
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
#監(jiān)控haproxy后端服務(wù)器的監(jiān)控狀態(tài)
listen site_status
bind 0.0.0.0:1081#監(jiān)聽端口
mode http#http的7層模式
log 127.0.0.1 local2 err#[err warning info debug]
monitor-uri /site_status#網(wǎng)站健康檢測URL,用來檢測HAProxy管理的網(wǎng)站是否可以用,正常返回200,不正常返回503
acl site_dead nbsrv(php_server) lt1#定義網(wǎng)站down時(shí)的策略當(dāng)掛在負(fù)載均衡上的指定backend的中有效機(jī)器數(shù)小于1臺(tái)時(shí)返回true
acl site_dead nbsrv(html_server) lt 1
acl site_deadnbsrv(backend_default)lt 1
monitor fail if site_dead#當(dāng)滿足策略的時(shí)候返回503,網(wǎng)上文檔說的是500,實(shí)際測試為503
monitor-net 192.168.4.171/32#來自192.168.4.152的日志信息不會(huì)被記錄和轉(zhuǎn)發(fā)
monitor-net 192.168.4.172/32
#frontend,名字自定義
frontend HAproxy_Cluster
#定義前端監(jiān)聽端口,建議采用bind *:80的形式,否則做集群高可用的時(shí)候有問題,vip切換到其余機(jī)器就不能訪問.
bind 0.0.0.0:80
#acl后面是規(guī)則名稱,當(dāng)請(qǐng)求的url末尾是以.php結(jié)尾時(shí),匹配觸發(fā)php_web規(guī)則,以下兩種寫法均可.
#當(dāng)請(qǐng)求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif結(jié)尾時(shí),匹配并觸發(fā)static_web規(guī)則.
#acl static_web path_end .gif .png .jpg .css .js .jpeg
#acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$
#-i為忽略大小寫,當(dāng)被請(qǐng)求的是以www.test.com開頭的主機(jī)時(shí),匹配并觸發(fā)dns_name規(guī)則.
acl html_web hdr_beg(host) -i www.haproxytest.com
#acl html_web hdr_beg(host) 10.11.4.152
#當(dāng)客戶端的IP是x.x.x.x時(shí),匹配并觸發(fā)src_ip規(guī)則.
#acl src_ip src x.x.x.x
#如果匹配acl規(guī)則php_web,將請(qǐng)求轉(zhuǎn)交到php_server組處理;如果匹配acl規(guī)則html_web,將請(qǐng)求轉(zhuǎn)交到html_server組處理.
use_backend php_server if php_web
use_backend html_server if html_web
#如果以上規(guī)則都不匹配時(shí),將請(qǐng)求轉(zhuǎn)交到default_backend組處理.
default_backend backend_default
#backend后端配置,配置php_server組與html_server組
backend php_server
#定義負(fù)載均衡方式為roundrobin方式,即基于權(quán)重進(jìn)行輪詢調(diào)度的算法,在服務(wù)器性能分布較均勻情況下推薦.
#另有如下幾種負(fù)載均衡方式:
#-- static-rr:也是基于權(quán)重進(jìn)行輪轉(zhuǎn)調(diào)度,但屬于靜態(tài)方法,運(yùn)行時(shí)調(diào)整后端機(jī)組權(quán)重不會(huì)使用新的權(quán)重;
#-- source:基于請(qǐng)求源IP進(jìn)行hash運(yùn)算匹配后端服務(wù)器組;
#-- leastconn:不適合會(huì)話較短的環(huán)境,如基于http的應(yīng)用;
#-- uri:對(duì)整個(gè)URI進(jìn)行hash運(yùn)算;
#-- uri_param:對(duì)URI中的參數(shù)進(jìn)行轉(zhuǎn)發(fā);
#-- hdr():根據(jù)http頭進(jìn)行轉(zhuǎn)發(fā),無該頭部則轉(zhuǎn)為使用roundrobin.
balance roundrobin
mode http
#允許插入serverid到cookie中,serverid后面可定義
cookie SERVERID
#心跳檢測方式為檢測后端服務(wù)器index.html文件,還有其他方式
option httpchk GET /index.html
#后端服務(wù)器定義, maxconn 1024表示該服務(wù)器的最大連接數(shù), cookie 1表示serverid為1,
weight代表權(quán)重(默認(rèn)1,最大為265,0則表示不參與負(fù)載均衡),
#check inter 1500是檢測心跳頻率, rise 2是2次正確認(rèn)為服務(wù)器可用, fall 3是3次失敗認(rèn)為服務(wù)器不可用.
server php1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter1500 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 inter1500 rise 2 fall 3
backend backend_default
balance source
mode http
server default1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 checkinter 1500 rise 2 fall 3
2)error文件
[root@elk-node2 ~]# cp -r/usr/local/src/haproxy-1.7.2/examples/errorfiles/ /usr/local/haproxy/
#配置文件中統(tǒng)計(jì)監(jiān)控頁面部分定義了error文件,將安裝包中的文件復(fù)制到安裝目錄使用。
3)日志文件
創(chuàng)建文件
[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主配置文件
[root@elk-node2 ~]# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 2 -r -m0"
#修改”SYSLOGD_OPTIONS”參數(shù),-c 2使用兼容模式,默認(rèn)是-c 5;-r開啟遠(yuǎn)程日志;-m 0標(biāo)記時(shí)間戳,單位是分鐘,0表示禁用該功能。
rsyslog文件
[root@elk-node2 ~]# cd /etc/rsyslog.d/
[root@elk-node2 rsyslog.d]# touch haproxy.conf
[root@elk-node2 rsyslog.d]# chown haproxy:haproxyhaproxy.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 restartrsyslog.service
[root@elk-node2 rsyslog.d]# setenforce 0
#haproxy默認(rèn)沒有日志,依靠rsyslog收集日志;
#文件最末尾的“&~”,如果沒有此配置,日志除寫入指定文件外,會(huì)同步寫入messages文件;
#關(guān)閉selinux,本文因沒有關(guān)閉selinux導(dǎo)致排查問題用了半天時(shí)間。
4)配置文件權(quán)限及軟鏈接
[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.配置開機(jī)啟動(dòng)
[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
4.配置全局啟動(dòng)文件
[root@elk-node2 ~]# ln -s/usr/local/haproxy/sbin/haproxy /usr/sbin/
[root@elk-node2 ~]# chown haproxy:haproxy/usr/sbin/haproxy
#采用軟鏈接方式。
5.配置防火墻
[root@elk-node2 ~]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --stateNEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --stateNEW -m tcp --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --stateNEW -m tcp --dport 1081 -j ACCEPT
-A INPUT -p udp -m state --stateNEW -m tcp --dport 514 -j ACCEPT
[root@elk-node2 ~]# service iptables restart
#開放如上端口,均在配置文件中有定義,日志端口在rsyslog.d/haproxy.conf文件中定義。
6.啟動(dòng)并驗(yàn)證
[root@elk-node2 ~]# service haproxy start
1)端口驗(yàn)證
[root@elk-node2 ~]# netstat –tunlp

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



3)訪問頁面
觸發(fā)配置文件中定義的php_server組,如下:

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

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