1、HAPROXY簡介
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種負載均衡解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的並發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。
官網:http://www.haproxy.com
2、HAProxy的特點是:
1、HAProxy支持虛擬主機。
2、HAProxy的優點能夠補充Nginx的一些缺點,比如支持Session的保持,Cookie的引導;同時支持通過獲取指定的url來檢測后端服務器的狀態。
3、HAProxy跟LVS類似,本身就只是一款負載均衡軟件;單純從效率上來講HAProxy會比Nginx有更出色的負載均衡速度,在並發處理上也是優於Nginx的。
4、HAProxy支持TCP協議的負載均衡轉發,可以對MySQL讀進行負載均衡,對后端的MySQL節點進行檢測和負載均衡,可以用LVS+Keepalived對MySQL主從做負載均衡。
5、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請求。
3、haproxy 配置中分成五部分內容詳解
1、global:參數是進程級的,通常是和操作系統相關。這些參數一般只設置一次,如果配置無誤,就不需要再次進行修改
2、defaults:配置默認參數,這些參數可以被用到frontend,backend,Listen組件
3、frontend:接收請求的前端虛擬節點,Frontend可以更加規則直接指定具體使用后端的backend
4、backend:后端服務集群的配置,是真實服務器,一個Backend對應一個或者多個實體服務器
5、Listen Fronted和backend的組合體
4、案例環境:
主機 操作系統 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
5、安裝配置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: [確定]
|
6、安裝配置Web服務Nginx
6.1 首先搭建Nginx1,
1
2
3
4
5
6
7
8
9
10
|
[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 退出服務
7、客戶端訪問測試:
用瀏覽器打開 http://192.168.200.101
打開一個新的瀏覽器再次訪問 http://192.168.200.101
可以驗證兩次訪問到的結果分別為:
server 192.168.200.103
server 192.168.200.104
8、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 狀態統計功能測試