HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。HAProxy運行在當前的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中, 同時能夠保護你的web服務器不被暴露到網絡上。javascript
HAProxy實現了一種事件驅動, 單一進程模型,此模型支持很是大的併發鏈接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,不多能處理數千併發鏈接。事件驅動模型由於在有更好的資源和時間管理的用戶空間(User-Space) 實現全部這些任務,因此沒有這些問題。此模型的弊端是,在多核系統上,這些程序一般擴展性較差。這就是爲何他們必須進行優化以使每一個CPU時間片(Cycle)作更多的工做css
HAProxy的優勢:前端
一、HAProxy是支持虛擬主機的,能夠工做在四、7層(支持多網段);java
二、可以補充Nginx的一些缺點好比Session的保持,Cookie的引導等工做;web
三、支持url檢測後端的服務器;算法
四、它跟LVS同樣,自己僅僅就只是一款負載均衡軟件;單純從效率上來說HAProxy更會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的;sql
五、HAProxy能夠對Mysql讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,不過在後端的MySQL slaves數量超過10臺時性能不如LVS;apache
六、HAProxy的算法較多,達到8種;vim
七、HAProxy 支持鏈接拒絕 : 由於維護一個鏈接的打開的開銷是很低的,有時咱們很須要限制***蠕蟲(attack bots),也就是說限制它們的鏈接打開從而限制它們的危害。 這個已經爲一個陷於小型DDoS***的網站開發了並且已經拯救了不少站點,這個優勢也是其它負載均衡器沒有的。後端
八、HAProxy 支持全透明代理(已具有硬件防火牆的典型特色): 能夠用客戶端IP地址或者任何其餘地址來鏈接後端服務器. 這個特性僅在Linux 2.4/2.6內核打了cttproxy補丁後纔可使用. 這個特性也使得爲某特殊服務器處理部分流量同時又不修改服務器的地址成爲可能。
九、細微的頭部處理 : 使得編寫基於header的規則更爲簡單,同時能夠處理URI的某部分。
十、快而可靠的頭部處理 : 使用徹底RFC2616 兼容的完整性檢查對通常的請求所有進行分析和索引僅僅須要不到2ms 的時間。
十一、模塊化設計 : 容許更多人加入進此項目,調試也很是簡單. poller已經分離, 已經使得它們的開發簡單了不少. HTTP已經從TCP分離出來了,這樣增長新的七層特性變得很是簡單. 其餘子系統也會很快實現模塊化
投機I/O 處理 : 在一個套接字就緒前就嘗試從它讀取數據。poller僅推測哪一個可能就緒哪一個沒有,嘗試猜想,而且若是成功,一些開銷很大的系統調用就能夠省去了。若是失敗,就會調用這些系統調用。已知的使用Linux epoll()已經淨提高起碼10%了。
十二、 ACLs : 使用任意規則的任意組合做爲某動做的執行條件。
下面是關於haproxy的簡單配置:
安裝haproxy
yum install haproxy -y
更改配置文件
vim /etc/haproxy/haproxy.cfg listen westos *:80 #監聽端口爲80 balance roundrobin #算法 server wb1 172.25.9.4:80 check #realserver開啓的服務爲apache server wb1 172.25.9.5:80 check /etc/init.d/haproxy start #啓動服務
設定監控頁面:
vim /etc/haproxy/haproxy.cfg stats uri /status (能夠加如defaults裏也能夠另起監聽端口) /etc/init.d/haproxy restart
將監控頁面的前端與後端分離:
vim /etc/haproxy/haproxy.cfg frontend westos *:80 default_backend web #默認的後端爲web backend web balance roundrobin server web1 172.25.9.4:80 check server web1 172.25.9.5:80 check /etc/init.d/haproxy restart
爲監控頁面添加用戶
vim /etc/haproxy/haproxy.cfg stats auth admin:westos /etc/init.d/haproxy restart
添加備機
vim /etc/haproxy/haproxy.cfg server backup 127.0.0.1:8080 backup #這裏的8080爲更改後的apache服務 /etc/init.d/haproxy restart
當realserver全掛了後顯示備機的網頁
添加haproxy的日誌
打開UDP監聽端口
vim /etc/rsyslog.conf $ModLoad imudp $UDPServerRun 514
添加日誌記錄:
local2.* /var/log/haproxy.log /etc/init.d/rsyslog restart
經過tail -f /var/log/haproxy.log
能夠實時觀測日誌:
設定acl控制列表
vim /etc/haproxy/haproxy.cfg frontend westos *:80 acl bad src 172.25.9.250 #設定250主機不能訪問#redirect location http://172.25.9.4:80 if bad #重定向250的訪問 block if bad errorloc 403 http://172.25.9.2:8080 #將403錯誤重定向#acl denyfile path /admin/ #設定拒絕訪問的目錄#http-request deny if denyfile bad #http也拒絕訪問 /etc/init.d/haproxy restart
動靜分離
當訪問的頁面以static等目錄開始以.jpg等結束時訪問的是p_w_picpaths不然訪問web
vim /etc/haproxy/haproxy.cfg frontend westos *:80 acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend p_w_picpaths if url_static default_backend web backend p_w_picpaths balance roundrobin server web1 172.25.9.4:80 check backend web server web1 172.25.9.5:80 check /etc/init.d/haproxy restart
讀寫分離:
當寫的時候訪問web(如上傳文件),不然訪問p_w_picpaths
vim /etc/haproxy/haproxy.cfg acl read method GET acl read method HEAD acl write method PUT acl write method POST use_backend web if write default_backend p_w_picpaths backend p_w_picpaths balance roundrobin server web1 172.25.9.4:80 check backend web server web1 172.25.9.5:80 check /etc/init.d/haproxy restart