1》HAProxy簡介: HAProxy是免費,高效,可靠的高可用及負載均衡解決方案,該軟體非常適合於處理高負載站點的七層數據請求,HAProxy的工作模式使其可以非常容易且安全地集成 到我們現有的站點架構中,使用類似的代理軟體還可以對外屏蔽內部的真實WEB伺服器,防止內部伺服器遭受外部攻擊;HAP ...
1》HAProxy簡介:
HAProxy是免費,高效,可靠的高可用及負載均衡解決方案,該軟體非常適合於處理高負載站點的七層數據請求,HAProxy的工作模式使其可以非常容易且安全地集成 到我們現有的站點架構中,使用類似的代理軟體還可以對外屏蔽內部的真實WEB伺服器,防止內部伺服器遭受外部攻擊;HAProxy架構中終端用戶通過訪問HAProxy代理伺服器 獲得站點頁面,而代理伺服器在收到客戶端請求後會根據自身規則將數據請求轉發給後端真實伺服器;為了讓同一客戶端訪問伺服器時可以保持會話(同一客戶端第二次訪問網 站時可以被轉發至相同的後端真實伺服器),HAProxy有三種解決方案:客戶端IP,Cookie以及Session,第一種方式中,HAProxy將客戶端IP進行Hash計算並保存,以此確保當 相同的IP訪問代理伺服器時可以轉發到固定的真實伺服器上;第二種方式中,HAProxy依靠真實伺服器發送給客戶端的Cookie信息進行會話保持;第三種方式中,HAProxy將保 存真實伺服器的Session及伺服器標識,實現會話保持功能;
HAProxy軟體包可以在其官方網站上下載,下麵通過源碼方式安裝該軟體,在使用make命令生成makefile文件時,TARGET=linux2628代表Linux操作系統使用的內核版 本為2.6.28及以上版本;
#yum install gcc
#tar -xvf haproxy-1.4.24.tar.gz
#cd /usr/local/src/haproxy-1.4.24
#make TARGET=linux2628
#make install
2》配置文件解析:
HAProxy安裝後沒有預設的配置文件,需要手動創建,本例將創建/etc/haproxy.cfg配置文件,當啟動HAProxy服務時需要使用-f選項指定配置文件路徑,HAProxy配置文件主 要包含全局設置段與代理段,global代表全局段,defaults,listen,frontend,backend為代理段;frontend用來匹配客戶端請求的功能變數名稱或URI等,backend定義後端伺服器集群,listen 是frontend與backend的集合,有時僅使用listen即可代替frontend與backend,下麵給出了一個監聽80埠的HTTP代理案例,代理伺服器將轉發數據請求到單一後臺伺服器 127.0.0.1:8000;
HAProxy主配置文件的具體語法格式及描述:
global:
chroot<jail dir>:將工作目錄切換至<jail dir>並執行chroot,該配置可增強HAProxy的安全性,但需要使用超級賬戶啟動HAProxy程式;
daemon:配置HAProxy以後臺進程模式工作;
uid<number>:配置進程的賬戶ID,建議設置為HAProxy專用賬戶;
gid<number>:配置進程的組ID,建議設置為HAProxy專用組;
log<address><facility>:配置全局syslog伺服器,可以設置兩台日誌伺服器;
nbproc<number>:指定後臺進程的數量;
pidfile<pidfile>:將進程ID號寫入<pidfile>文件;
ulimit-n<number>:設置每個進程的最大文件描述符數量;
maxconn<number>:設置每個進程支持的最大併發數;
tune.bufsize<number>:設置buffer大小,預設值為16384,單位為位元組(B);
代理設置:
mode:HAProxy工作模式,可選項為:tcp,http,health;
timeout check<timeout>:設置檢查超時時間;
contimeout<timeout>:設置連接超時時間;
balance roundrobin:預設負載均衡工作模式,輪詢;
bind<address>:<port>:定義一個或過個監聽地址或埠;
stats auth admin:admin:設置監控界面的用戶名稱與密碼;
stats refresh <number>:統計頁面刷新間隔時間;
option httplog:使用http日誌;
cookie<name>:啟用基於cookie的保持連接功能;
option forwardfor:允許插入X-Forwarded-For數據包頭給後端真實伺服器,可以讓後臺伺服器獲得客戶端的真實IP地址;
option abortonclose:伺服器負載高時,自動關閉隊列里處理時間比較長的連接請求;
option allbackups:當後端伺服器全部宕機時,是否激活所有備用的伺服器,預設僅啟動第一個備用伺服器;
option dontlognull:不記錄空連接日誌,主要用於不記錄健康檢查日誌;
option redispatch:在HTTP模式,如果使用cookie的伺服器宕機,客戶端還好堅持連接它,該選項在後端伺服器宕機時強制將請求轉發給其他健康主機;
monitor-uri<uri>:檢查<uri>文件是否存在,依次判斷主機健康狀態;
monitor-fail if site_dead:當伺服器宕機時,返回503錯誤代碼,需要定義ACL;
option httpchk<uri>:使用HTTP協議檢查伺服器健康狀態;
retries<value>:伺服器連接失敗後的重試次數;
timeout client<n>:設置客戶端最大超時時間為n,預設單位為毫秒(ms);
timeout server<n>:設置伺服器端最大超時時間為n,預設單位為毫秒(ms);
timeout connect<n>:設置連接最大超時時間為n,預設單位為毫秒(ms);
default_backend:配置文件中沒有use_backend規則時,設置預設後端伺服器組,伺服器組由backend定義;
use_backend:當條件滿足時,指定後端伺服器組,需要設置ACL;
acl<name><criterion>:定義訪問控制列表,配置文件中通過name調用該ACL,常用限制包括:dst(目標地址),dst_port(目標埠),src(源地址),hdr(連接頭部 信息),path_reg(訪問路徑匹配正則),url(統一資源定位符);
ACL訪問控制列表案例如下:
3》HAProxy應用案例:
本例以生產環境為原型,簡化網路拓撲後使用HAProxy實現下圖所示的高性能代理伺服器架構,本例將使用listen定義一個監控埠;使用frontend定義一個前端80端 口;通過backend分別定義名為inside_servers和external_servers的伺服器組;使用default_backend定義預設伺服器組為external_servers;定義ACL規則時,如果內網 (192.168.0.0/24)訪問WEB服務,則由inside_servers伺服器組提供WEB頁面;
external_servers伺服器組中包含web1.example.com和web2.example.com兩台伺服器,inside_servers伺服器組中包含web2.example.com一臺伺服器;
=》Web1
Client------->Internet--------->HAProxy--------->router-----=
=》Web2
1>實驗環境;
haproxy.example.com: eth0:172.31.16.163
eth1:192.168.10.10
web1.example.com: eth0:192.168.10.20
web2.example.com: eth0:192.168.10.30
client.example.com: eth0:172.31.16.229
2>具體配置:
兩台WEB伺服器基本採用相同的配置,下麵僅以WEB1為例,為了演示HAProxy可以輪詢訪問後端伺服器,我們將兩台伺服器的頁面設置為不同的內容以示區 別:
#service network restart
#yum -y install httpd
#echo "192.168.10.20" >/var/www/html/index.html
#service iptables stop
#service network restart
#yum -y install httpd
#echo "192.168.10.30" >/var/www/html/index.html
#service iptables stop
HAProxy代理伺服器設置如下:
#service network restart
#service iptables stop
內核調優,文件中插入如下兩行:
#yum install gcc
#tar -xvf haproxy-1.4.24.tar.gz
#cd /usr/local/src/haproxy-1.4.24
#make TARGET=linux2628
#make install
#mkdir /var/haproxy #chroot所需目錄
創建配置文件:
global
maxconn 4096
log 127.0.0.1 local3 info
chroot /var/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /var/run/haproxy.pid
ulimit-n 65535
stats socket /var/tmp/stats
defaults
log global
mode http
maxconn 20480
option httplog
option httpclose
option dontlognull
option forwardfor
option redispatch
option abortonclose
stats refresh 30
retries 3
balance roundrobin
cookie SRV
timeout check 2000ms
timeout connect 5000ms
timeout server 50000ms
timeout client 50000ms
listen admin_status #定義HAProxy到監控界面
bind 0.0.0.0:6553
mode http
log 127.0.0.1 local3 info
stats enable
stats refresh 5s #監控統計頁面自動刷新時間為5s
stats realm Haproxy\ Statistics #登錄監控統計頁面提示符
stats uri /admin?stats #監控頁面URL路徑
stats auth admin1:AdMiN123 #查看HAProxy監控頁面到賬戶與密碼
stats hide-version #隱藏HAProxy版本信息
frontend web_service #定義終端用戶訪問到前端伺服器
bind 0.0.0.0:80
mode http
log global
option httplog
option httpclose
option forwardfor
acl inside_src src 192.168.10.0/24 #定義ACL
#use_backend調用ACL定義,如果源地址為192.168.10.0/24,則代理伺服器將會把請求轉發#給inside_servers伺服器組
use_backend inside_servers if inside_src
default_backend external_servers
backend external_servers
mode http
balance roundrobin #輪詢真實伺服器
#檢查真實伺服器到index.html文件,以此判斷伺服器的健康狀態
option httpchk GET /index.html
#定義後端真實伺服器,向cookie信息中插入web1信息,check代表允許對伺服器進行健康檢#查,健康檢查到時間間隔為2000ms,連續兩次健康檢查成功則認為伺服器是有效開啟的,連續三次健康檢查失敗後,認為伺服器已經宕機,伺服器權重為1
server web1 192.168.10.20:80 cookie web1 check inter 2000 rise 2 fall 3 weight 1server web2 192.168.10.30:80 cookie web2 check inter 2000 rise 2 fall 3 weight 1backend inside_servers
mode http
balance roundrobin
option httpchk GET /index.html
server web1 192.168.10.30:80 cookie web2 check inter 1500 rise 3 fall 3 weight 1
3>修改HAProxy伺服器日誌配置文件,插入以下內容:
#vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
local3.*
#service rsyslog restart #重啟系統日誌服務
#haproxy -f /etc/haproxy.cfg #指定配置文件啟動HAProxy服務
#echo "/usr/local/sbin/haproxy -f /etc/haproxy.cf" >>/etc/rc.local
4》客戶端驗證如下:
首先為客戶端主機配置正確的網路環境,確保客戶端與HAProxy代理伺服器可以直接連通,使用瀏覽器訪問http://172.31.16.163:6553/admin?stats查看代理伺服器狀態統 計信息:
配置客戶端主機IP地址為172.31.16.229,通過瀏覽器訪問http://172.31.16.163,刷新將分別得到web1.example.com以及web2.example.com兩台主機返回的頁面信息,如 果客戶端主機IP地址配置為192.168.10.0/24網路內的IP,則訪問http://192.168.10.10,伺服器將返回的頁面將永遠都是web2.example.com主機的頁面信息;