CentOS7部署Haproxy 1.7.2

參考文檔:

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組,如下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容