在大型系統(tǒng)設(shè)計中用代理在負載均衡是最常見的一種方式,而相對靠譜的解決方案中Nginx、HAProxy、LVS、F5在各大場中用得比較普遍,各有各的優(yōu)勢和使用場景,由于本次要使用到TCP,因此Nginx只能在HTTP層負載,因此用HAProxy來負載,為什么不用LVS?因為配置太麻煩。
HAProxy是免費、極速且可靠的用于為TCP和基于HTTP應(yīng)用程序提供高可用、負載均衡和代理服務(wù)的解決方案,尤其適用于高負載且需要持久連接或7層處理機制的web站點。HAProxy還可以將后端的服務(wù)器與網(wǎng)絡(luò)隔離,起到保護后端服務(wù)器的作用。HAProxy的負載均衡能力雖不如LVS,但也是相當不錯,而且由于其工作在7層,可以對http請求報文做深入分析,按照自己的需要將報文轉(zhuǎn)發(fā)至后端不同的服務(wù)器(例如動靜分離),這一點工作在4層的LVS無法完成。
環(huán)境
CentOS6.X
HAProxy 1.7.3
用root用戶安裝
下載
若在線安裝不用下載,可直接通過yum命令安裝(建議),不過需要聯(lián)網(wǎng)。
去官網(wǎng)下載 :http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz
下載后放進CentOS中的/usr/local/ ?文件夾中(至于怎么放,你不會 這個鍋我不背,去學(xué)學(xué)Linux 操作基礎(chǔ))
關(guān)閉SElinux、配置防火墻
vi /etc/selinux/config#SELINUX=enforcing #注釋掉#SELINUXTYPE=targeted #注釋掉SELINUX=disabled#增加:wq!#保存退出setenforce 0#使配置立即生效
vi /etc/sysconfig/iptables#編輯-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT#允許組播地址通信(在做keepalived時用得到)-A RH-Firewall-1-INPUT -p? ? vrrp? ? -j ACCEPT#允許VRRP(虛擬路由器冗余協(xié))通信-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT#允許80端口通過防火墻:wq!#保存退出service iptables restart#重啟防火墻使配置生效
創(chuàng)建HAProxy運行賬戶和組
[root@H32 local]#groupadd haproxy #添加haproxy組[root@H32 local]#useradd -g haproxy haproxy -s /bin/false #創(chuàng)建nginx運行賬戶haproxy并加入到haproxy組,不允許haproxy
安裝
分兩種:
1、在線裝:yum install haproxy (建議)
2、安裝包:
環(huán)境中要有g(shù)cc,用于編譯,一般安裝環(huán)境時都會有,若沒有 運行 :
yum install -y gcc
進入local文件夾中
[root@H32 ~]#cd /usr/local
然后解壓下載好haproxy包到當前文件夾
[root@H32 local]#tar -zxvf haproxy-1.7.3.tar.gz[root@H32 local]#cd haproxy-1.7.3
安裝
[root@H32 haproxy-1.7.3]#make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haproxy-1.7.3 #編譯(源碼才需要)? uname -r #查看系統(tǒng)內(nèi)核版本號[root@H32 haproxy-1.7.3]#make install PREFIX=/usr/local/haproxy-1.7.3 #安裝 haproxy-1.7.3為解壓后的文件路徑(很重要)
設(shè)置HAProxy
mkdir -p /usr/local/haproxy-1.7.3/conf#創(chuàng)建配置文件目錄
mkdir -p /etc/haproxy#創(chuàng)建配置文件目錄
touch /usr/local/haproxy-1.7.3/conf/haproxy.cfg#創(chuàng)建配置文件
ln -s /usr/local/haproxy-1.7.3/conf/haproxy.cfg? /etc/haproxy/haproxy.cfg#添加配置文件軟連接
cp -r /usr/local/haproxy-1.7.3/examples/errorfiles? /usr/local/haproxy-1.7.3/errorfiles#拷貝錯誤頁面
ln -s /usr/local/haproxy-1.7.3/errorfiles? /etc/haproxy/errorfiles#添加軟連接
mkdir -p /usr/local/haproxy-1.7.3/log#創(chuàng)建日志文件目錄
touch /usr/local/haproxy-1.7.3/log/haproxy.log#創(chuàng)建日志文件
ln -s /usr/local/haproxy-1.7.3/log/haproxy.log? /var/log/haproxy.log#添加軟連接
cp /usr/local/haproxy-1.7.3/examples/haproxy.init? /etc/rc.d/init.d/haproxy#拷貝開機啟動文件
chmod +x /etc/rc.d/init.d/haproxy#添加腳本執(zhí)行權(quán)限
chkconfig haproxy on#設(shè)置開機啟動
ln -s /usr/local/haproxy-1.7.3/sbin/haproxy? /usr/sbin#添加軟連接
注意上面的文件夾,若與上面的文件夾路徑一致,可以直接復(fù)制運行。
配置haproxy.cfg參數(shù)
vi? /usr/local/haproxy-1.7.3/conf/haproxy.cfg#編輯
這里是最關(guān)鍵的設(shè)置,在此有兩個相同的服務(wù)由兩臺服務(wù)器提供:192.168.30.33,192.168.30.34
#---------------------------------------------------------------------#Global settings#---------------------------------------------------------------------globallog127.0.0.1 local2###[err warning info debug]chroot/usr/local/haproxy-1.7.3pidfile/var/run/haproxy.pid###haproxy的pid存放路徑,啟動進程的用戶必須有權(quán)限訪問此文件maxconn? 4000###最大連接數(shù),默認4000user? haproxy
group? haproxy
daemon###創(chuàng)建1個進程進入deamon模式運行。此參數(shù)要求將運行模式設(shè)置為"daemon"#---------------------------------------------------------------------#common defaults that all the 'listen' and 'backend' sections will#use if not designated in their block#---------------------------------------------------------------------defaults
mode? http###默認的模式,tcp是4層,http是7層,health只會返回OK若是混合模式則 mode 不需要設(shè)置logglobal###采用全局定義的日志option? dontlognull###不記錄健康檢查的日志信息option? httpclose###每次請求完畢后主動關(guān)閉http通道option? httplog###日志類別http日志格式混合模式 此處還需要加上 tcplog#option? forwardfor###如果后端服務(wù)器需要獲得客戶端真實ip需要配置的參數(shù),可以從Http Header中獲得客戶端ipoption? redispatch###serverId對應(yīng)的服務(wù)器掛掉后,強制定向到其他健康的服務(wù)器timeout connect 10s#default 10 second timeout if a backend is not foundtimeout client 10s###客戶端連接超時timeout server 10s###服務(wù)器連接超時maxconn? ? 60000###最大連接數(shù)retries? ? 3###3次連接失敗就認為服務(wù)不可用,也可以通過后面設(shè)置########統(tǒng)計頁面配置########listen admin_stats#監(jiān)聽端口bind 0.0.0.0:8089#啟用狀態(tài)監(jiān)控stats enable
mode http
logglobal#統(tǒng)計頁面URLstats uri /stats#統(tǒng)計頁面密碼框上提示文本stats realm Haproxy\ Statistics#統(tǒng)計頁面用戶名和密碼設(shè)置stats auth admin:admin#隱藏統(tǒng)計頁面上HAProxy的版本信息#stats hide-version#當通過認證才可管理stats adminifTRUE#統(tǒng)計頁面自動刷新時間stats refresh 30s########WEB配置#################listen web1080
bind0.0.0.0:1080mode http
option httplog
logglobalmaxconn3000balance leastconnserver web33192.168.80.33:8007? weight 1 rise 2 fall 3server web34 192.168.80.34:8007 weight 1 rise 2 fall 3#---------------------------------------------------------------------#main frontend which proxys to the backends 這里不需要動靜分離,所以全部注釋掉#---------------------------------------------------------------------#frontend? main *:5000#acl url_static? ? ? path_beg? ? ? -i /static /images /javascript /stylesheets#acl url_static? ? ? path_end? ? ? -i .jpg .gif .png .css .js#use_backend static? ? ? ? ? if url_static#default_backend? ? ? ? ? ? app#---------------------------------------------------------------------#static backend for serving up images, stylesheets and such#---------------------------------------------------------------------#backend static#balance? ? roundrobin#server? ? ? static 127.0.0.1:4331 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#backend app#balance? ? roundrobin#server? app1 127.0.0.1:5001 check#server? app2 127.0.0.1:5002 check#server? app3 127.0.0.1:5003 check#server? app4 127.0.0.1:5004 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#errorloc? 503? http://www.osyunwei.com/404.htmlerrorfile 403 /etc/haproxy/errorfiles/403.http
errorfile500 /etc/haproxy/errorfiles/500.http
errorfile502 /etc/haproxy/errorfiles/502.http
errorfile503 /etc/haproxy/errorfiles/503.http
errorfile504 /etc/haproxy/errorfiles/504.http
統(tǒng)一綁定的對外接口為1080, 監(jiān)控頁面端口為8089。
啟動
:wq!#保存退出
service haproxy start#啟動
#設(shè)置開機啟動
chkconfig haproxy on
設(shè)置HAProxy日志
vi? /etc/syslog.conf#編輯,在最下邊增加#
haproxy.log
local0.*? /var/log/haproxy.log
local1.*? /var/log/haproxy.log
local2.*? /var/log/haproxy.log
local3.*? /var/log/haproxy.log
:wq!#保存退出
vi? /etc/sysconfig/rsyslog#編輯修改
SYSLOGD_OPTIONS="-r -m 0"#接收遠程服務(wù)器日志
:wq!#保存退出
service rsyslog restart#重啟syslog
監(jiān)控頁面
打開監(jiān)控頁面,用戶名密碼為admin,出現(xiàn)下面的頁面就說明配置成功:
http://192.168.30.32:8089/stats
service haproxy stop#關(guān)閉service haproxy restart#重啟
擴展問題:
此處只做了簡單的IP請求負載,還可以做TCP層的負載,但里面的設(shè)置需要根據(jù)自己的實際情況不停的壓力測試進行調(diào)置。
此后還要做Keepalived + HAProxy 多機熱備的負載實用方案。
還可做mysql的讀寫負載、動靜態(tài)資源分離等等
ACL規(guī)則介紹
ACL控制哪些開放,往哪里轉(zhuǎn),哪些屏蔽 ,具體的內(nèi)容網(wǎng)上也有介紹,此處只做拋磚引玉。
實例:實現(xiàn)動靜分離功能
首先定義兩個backend,分別以動態(tài)和靜態(tài)進行分組
backend jingtai
balance roundrobin
server web1 10.0.10.82:80 check weight 1maxconn 2000
backend dongtai
balance roundrobin
server web2 10.0.10.83:80 check weight 1maxconn 3000
配置frontend
frontend web_server
bind *:80
default_backend webservers
acl badguy src 10.0.10.1
acl denyfile path /1.html
#http-request deny if badguy denyfile
acl static path_end .html
use_backend jingtai if static
default_backend dongtai
定義acl名稱為static ,如果訪問匹配是.html的文件,那么直接跳轉(zhuǎn)至jingtai 這個backend
如果訪問的不匹配.html 那么直接跳轉(zhuǎn)至默認backend dongtai組