一、HAPROXY簡介php
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速而且可靠的一種負載均衡解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。HAProxy運行在當前的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中,同時能夠保護你的web服務器不被暴露到網絡上。html
官網:http://www.haproxy.com前端
二、HAProxy的特色是:
一、HAProxy支持虛擬主機。
二、HAProxy的優勢可以補充Nginx的一些缺點,好比支持Session的保持,Cookie的引導;同時支持經過獲取指定的url來檢測後端服務器的狀態。
三、HAProxy跟LVS相似,自己就只是一款負載均衡軟件;單純從效率上來說HAProxy會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的。
四、HAProxy支持TCP協議的負載均衡轉發,能夠對MySQL讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,能夠用LVS+Keepalived對MySQL主從作負載均衡。
五、HAProxy負載均衡策略很是多,HAProxy的負載均衡算法如今具體有以下8種:
① roundrobin,表示簡單的輪詢,這個很少說,這個是負載均衡基本都具有的;
② static-rr,表示根據權重,建議關注;
③ leastconn,表示最少鏈接者先處理,建議關注;
④ source,表示根據請求源IP,這個跟Nginx的IP_hash機制相似,咱們用其做爲解決session問題的一種方法,建議關注;
⑤ ri,表示根據請求的URI;
⑥ rl_param,表示根據請求的URl參數’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;
⑧ rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。linux
三、haproxy 配置中分紅五部份內容詳解nginx
一、global:參數是進程級的,一般是和操做系統相關。這些參數通常只設置一次,若是配置無誤,就不須要再次進行修改c++
二、defaults:配置默認參數,這些參數能夠被用到frontend,backend,Listen組件web
三、frontend:接收請求的前端虛擬節點,Frontend能夠更加規則直接指定具體使用後端的backend算法
四、backend:後端服務集羣的配置,是真實服務器,一個Backend對應一個或者多個實體服務器vim
五、Listen Fronted和backend的組合體後端
四、案例環境:
主機 操做系統 IP地址 主要的軟件
----------------------------------------------------------------------------
Haproxy CentOS6.6 x86_64 192.168.200.101 haproxy-1.4.24.tar.gz
Nginx1 CentOS6.6 x86_64 192.168.200.103 nginx-1.6.2.tar.gz
Nginx2 CentOS6.6 x86_64 192.168.200.104 nginx-1.6.2.tar.gz
五、安裝配置Haproxy
5.1 安裝Haproxy依賴包及源碼包編譯安裝
[root@localhost ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel [root@localhost ~]# tar xf haproxy-1.4.24.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/haproxy-1.4.24/ [root@localhost haproxy-1.4.24]# make TARGET=linux26 && make install
5.2 創建haproxy的配置目錄及文件
[root@localhost haproxy-1.4.24]# mkdir /etc/haproxy [root@localhost haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/
5.3 haproxy配置項的介紹
###########全局配置######### global log 127.0.0.1 local0 #日誌輸出配置,全部日誌都記錄在本機系統日誌,經過local0輸出 log 127.0.0.1 local1 notice #notice爲日誌級別,一般有24個級別(error warringinfo debug) nbproc 1 #設置進程數量,一般是CPU核心數或者2倍 pidfile /etc/haproxy/haproxy.pid #haproxy 進程PID文件 maxconn 4096 #最大鏈接數(需考慮ulimit-n限制 ) #chroot /usr/share/haproxy #chroot運行路徑 uid 99 #用戶uid gid 99 #用戶gid daemon #守護進程模式,之後臺服務形式容許 #debug #haproxy 調試級別,建議只在開啓單進程的時候調試 ########默認配置############ defaults log global #定義日誌爲global配置中的日誌定義 mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK option httplog #日誌類別,採用http日誌格式記錄日誌 #option dontlognull #不記錄健康檢查日誌信息 retries 3 #檢查節點服務器失敗次數,連續達到三次失敗,則認爲節點不可用 #option forwardfor #若是後端服務器須要得到客戶端真實ip須要配置的參數,能夠從Http Header中得到客戶端i #option httpclose #每次請求完畢後主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現 maxconn 4096 #最大鏈接數 contimeout 5000 #鏈接超時時間 clitimeout 50000 #客戶端超時時間 srvtimeout 50000 #服務器超時時間 #timeout check 2000 #心跳檢測超時 #timeout http-keep-alive10s #默認持久鏈接超時時間 #timeout http-request 10s #默認http請求超時時間 #timeoutqueue 1m #默認隊列超時時間 ########統計頁面配置######## listen admin_stats bind 0.0.0.0:1080 #設置Frontend和Backend的組合體,監控組的名稱,按須要自定義名稱 mode http #http的7層模式 option httplog #採用http日誌格式 #log 127.0.0.1 local0 err #錯誤日誌記錄 maxconn 10 #默認的最大鏈接數 stats refresh 30s #統計頁面自動刷新時間 stats uri /stats #統計頁面url stats realm Crushlinux\ Haproxy #統計頁面密碼框上提示文本 stats auth admin:admin #設置監控頁面的用戶和密碼:admin,能夠設置多個用戶名 stats hide-version #隱藏統計頁面上HAProxy的版本信息 #stats admin if TRUE #設置手工啓動/禁用,後端服務器(haproxy-1.4.9之後版本) ########設置haproxy 錯誤頁面##### errorfile 403 /home/haproxy/haproxy/errorfiles/403.http errorfile 500 /home/haproxy/haproxy/errorfiles/500.http errorfile 502 /home/haproxy/haproxy/errorfiles/502.http errorfile 503 /home/haproxy/haproxy/errorfiles/503.http errorfile 504 /home/haproxy/haproxy/errorfiles/504.http ########frontend前端配置############## bibind *:80 #這裏建議使用bind *:80的方式,要否則作集羣高可用的時候有問題,vip切換到其餘機器就不能訪問了。 acl web hdr(host) -i www.abc.com #acl後面是規則名稱,-i是要訪問的域名, acl img hdr(host) -i img.abc.com #若是訪問www.abc.com這個域名就分發到下面的webserver 的做用域。 #若是訪問img.abc.com.cn就分發到imgserver這個做用域。 use_backend webserver if web use_backend imgserver if img ########backend後端配置############## backend webserver #webserver做用域 mode http balance roundrobin #banlance roundrobin 輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數 option httpchk /index.html HTTP/1.0 #健康檢查,檢測文件,若是分發到後臺index.html訪問不到就再也不分發給它 server web1 192.168.200.103:80 cookie 1 weight 1 check inter 2000 rise 2 fall 3 server web2 192.168.200.104:80 cookie 2 weight 1 check inter 2000 rise 2 fall 3 #cookie 1表示serverid爲1,check inter 1500 是檢測心跳頻率 #rise 2是2次正確認爲服務器可用,fall 3是3次失敗認爲服務器不可用,weight表明權重 backend imgserver mode http option httpchk /index.php balance roundrobin server img01 192.168.200.105:80 check inter 2000 fall 3 server img02 192.168.200.106:80 check inter 2000 fall 3 ########tcp配置################# listen test1 bind 0.0.0.0:90 mode tcp option tcplog #日誌類別,採用tcplog maxconn 4086 #log 127.0.0.1 local0 debug server s1 192.168.200.107:80 weight 1 server s2 192.168.200.108:80 weight 1
5.4 haproxy 配置文件修改
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg # this config needs haproxy-1.1.28 or haproxy-1.2.1 global # log 127.0.0.1 local0 # log 127.0.0.1 local1 notice log /dev/log local0 info log /dev/log local0 notice maxconn 4096 uid 99 gid 99 daemon defaults log global mode http option httplog retries 3 maxconn 4096 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen webcluster 0.0.0.0:80 option httpchk GET /index.html balance roundrobin server inst1 192.168.200.103:80 check inter 2000 fall 3 server inst1 192.168.200.104:80 check inter 2000 fall 3 listen admin_stats bind 0.0.0.0:8000 mode http option httplog maxconn 100 stats refresh 30s stats uri /stats stats realm Crushlinux\ Haproxy stats auth admin:admin stats hide-version
5.5 準備服務自啓動腳本
[root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy [root@localhost ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy [root@localhost ~]# chmod +x /etc/init.d/haproxy [root@localhost ~]# /etc/init.d/haproxy start Starting haproxy: [肯定]
六、安裝配置Web服務Nginx
6.1 首先搭建Nginx1,
[root@localhost ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel openssl-devel [root@localhost ~]# useradd -M -s /sbin/nologin nginx [root@localhost ~]# tar xf nginx-1.6.2.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/nginx-1.6.2 [root@localhost nginx-1.6.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install [root@localhost nginx-1.6.2]# cd /usr/local/nginx/html/ [root@localhost html]# echo "server 192.168.200.103" > index.html [root@localhost html]# /usr/local/nginx/sbin/nginx [root@localhost html]# netstat -anpt |grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4503/nginx
6.2 搭建nginx2, 同nginx1搭建方式是同樣的。
與6.1惟一不一樣的是:
[root@localhost html]# echo "server 192.168.200.104" > index.html
注意:nginx服務控制方式
/usr/local/nginx/sbin/nginx 啓動服務
killall -s HUP nginx 從新加載服務
killall -s QUIT nginx 退出服務
七、客戶端訪問測試:
用瀏覽器打開 http://192.168.200.101
打開一個新的瀏覽器再次訪問 http://192.168.200.101
能夠驗證兩次訪問到的結果分別爲:
server 192.168.200.103
server 192.168.200.104
八、Haproxy 日誌
Haproxy 的日誌默認輸出到系統的syslog中,爲了更好的管理Haproxy 的日誌,在生產環境中通常單獨定義出來。
8.1 修改Haproxy配置文件中關於日誌配置選項,
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg # this config needs haproxy-1.1.28 or haproxy-1.2.1 global #log 127.0.0.1 local0 #log 127.0.0.1 local1 notice log /dev/log local0 info log /dev/log local0 notice [root@localhost ~]# service haproxy restart Shutting down haproxy: [肯定] Starting haproxy: [肯定]
這兩行配置放到global選項中,主要是將Haproxy的info和notice日誌分別記錄到不一樣的日誌文件中
8.2 修改rsyslog配置
爲了便於管理,將Haproxy相關的配置獨立定義到haproxy.conf 並放到/etc/rsyslog.d/ 下,rsyslog啓動時會自動加載此目錄下的全部配置文件。
[root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf if ($programname == 'haproxy' and $syslogserverity-text == 'info') then -/var/log/haproxy/haproxy-info.log &~ if ($programname == 'haproxy' and $syslogserverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log &~
將haproxy的info日誌記錄到/var/log/haproxy/haproxy-info.log中,將notice日誌記錄到/var/log/haproxy/haproxy-notice.log中,將notice日誌記錄到/var/log/haproxy/haproxy-notice
&~ 表示當寫入到日誌文件後,rsyslog中止處理這個信息,(rainerscript 腳本語言)
重啓rsyslog服務
[root@localhost ~]# service rsyslog restart
關閉系統日誌記錄器: [肯定]
啓動系統日誌記錄器: [肯定]
8.3 查看日誌文件是否建立成功
[root@localhost ~]# ls -l /var/log/haproxy/haproxy-info.log [root@localhost ~]# ls -l /var/log/haproxy/haproxy-notice.log Sep 20 23:39:26 localhost haproxy[2674]: 192.168.200.1:51629 [20/Sep/2015:23:38:27.256] web-cluster web-cluster/inst2 0/0/0/1/59740 200 1648 - - CD-- 0/0/0/0/0 0/0 "GET / HTTP/1.1" Sep 20 23:40:06 localhost haproxy[2674]: 192.168.200.1:51693 [20/Sep/2015:23:39:34.423] web-cluster web-cluster/inst2 0/0/0/0/32120 200 580 - - ---- 1/1/1/1/0 0/0 "GET / HTTP/1.1"
8.4 狀態統計功能測試