HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。HAProxy運行在時下的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中, 同時能夠保護你的web服務器不被暴露到網絡上。 javascript
HAProxy實現了一種事件驅動、單一進程模型,此模型支持很是大的併發鏈接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,不多能處理數千併發鏈接。事件驅動模型由於在有更好的資源和時間管理的用戶端(User-Space) 實現全部這些任務,因此沒有這些問題。此模型的弊端是,在多核系統上,這些程序一般擴展性較差。這就是爲何他們必須進行優化以 使每一個CPU時間片(Cycle)作更多的工做。php
yum install haproxy -y
### 主配置文件是/etc/haproxy/haproxy.conf ### 配置文件主要有: global settings: 全局配置段 主要用於定義haproxy進程自身的工做特性; proxies: 代理配置段 backend: 後端服務器組 frontend: 定義面向客戶的監聽的地址和端口,以及關聯到的後端服務器組; listen: 組合方式直接定義frontend及相關的backend的一種機制; defaults: 定義默認配置 ################################################################################# gloab的默認選項: log 127.0.0.1 local2 # 記錄日誌,此時要藉助於本機的rsyslod的日誌服務,須要開啓udp端口監聽 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats ################################################################################# defaults配置選項: mode http # 工做模式,有TCP和http,表明4層代理、7層代理 log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 # 重試次數 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 # 最大併發鏈接數
實驗主機 | 安裝軟件 |
172.16.10.9 | haproxy,反向代理的前端 |
172.16.10.77 | httpd,後端主機 |
172.16.10.1 | httpd,後端主機 |
## 配置過程: 在172.16.10.1和172.16.10.77上: yum install httpd -y 建立測試頁面: echo "172.16.10.1@node1.example.com" > /var/www/html/index.html echo "172.16.10.77@basic.example.com" > /var/www/html/index.html ############################################################## ## 在172.16.10.9上配置,在配置文件中添加如下內容,就能夠實現: frontend http *:80 default_backend web backend web balance roundrobin server web1 172.16.10.77:80 server web2 172.16.10.1:80 ###############################################################
此時會出現負載均衡的效果:css
此時查看後端web日誌:html
解決辦法:前端
編輯http的配置文件中,修改如下內容:(修改記錄的http的頭部信息) LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 修改成: LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
在上面的的使用中,使用到了balance關鍵字,這個關鍵字的做用是指定負載均衡算法的。java
### haproxy使用的調度算法:經常使用的 ### 使用範圍:defaults forntend backend listen 一、roundrobin: 至關於lvs的 wrr, 是一種dynamic調度算法,支持weight指定權重。所謂的動態是 能夠再服務器運行中調整,慢啓動。對後端服務器數目由限制 4096 二、static-rr: wrr, static調度算法,對後端服務器數目沒有限制 三、leastconn: 相似於lvs的wlc, dynamic方法 四、source: 建議用於基於TCP模式調度,且不支持使用cookie插入模式時使用; 由hash-type參數決定其爲dynamic或者static等價於ipvs: sh,nginx: ip_hash 五、uri: 基於請求報文中的uri的左半部分(查詢條件以前的部分)或所有的URI進行調度; 經常使用於backend server爲cache server的場景中;由hash-type參數決定其爲dynamic或者static 六、url_params: 經常使用於後端服務器須要對用戶進行認證的場景中; 由hash-type參數決定其爲dynamic或者static 七、hdr(<name>):根據用戶請求報文中,指定的http首部的值進行調度 hdr(host):經常使用於實現將對同一個虛擬主機的請求始終發往同個backend server; use_domain_only: 在計算hash值時僅使用域名;由hash-type參數決定其爲dynamic或者static
hash_type的取值有:node
map-based:hash表是一個包含了全部在線服務器的靜態數組。 挑選服務器是根據其在數組中的位置進行的,所以,當一臺服務器宕機或添加了一臺新的服務器時, 大多數鏈接將會被從新派發至一個與此前不一樣的服務器上。 對於緩存服務器的工做場景來講,此方法不適用。 consistent:hash表是一個由各服務器填充而成的樹狀結構; 基於hash鍵在hash樹中查找相應的服務器時,最近的服務器將被選中。此方法是動態的, 支持在運行時修改服務器權重。 添加一個新的服務器時,僅會對一小部分請求產生影響,所以,尤爲適用於後端服務器爲cache的 場景。 不過,此算法不甚平滑,派發至各服務器的請求未必能達到理想的均衡效果,所以, 可能須要不時的調整服務器的權重以得到更好的均衡性。
cookie實現根據客戶端cooike信息來實現持久鏈接。實現的原理:mysql
cookie關鍵字用法說明: nocacahe:將附加cookie信息的資源不緩存於緩存服務器中 insert:插入cooike信息 rewrite:重寫cookie prefix:做爲前綴
測試:修改haproxy的配置文件nginx
backend web balance roundrobin cookie webser insert nocache server web1 172.16.10.77:80 cookie web1 server web2 172.16.10.1:80 cookie web2
測試:web
### 在配置文件中添加: listen stats mode http bind 0.0.0.0:1080 stats enable stats hide-version stats uri /haproxyadmin?stats stats realm Haproxy\ Statistics stats auth admin:admin stats admin if TRUE
### 修改配置文件,以下: backend web balance roundrobin server web1 172.16.10.77:80 check port 80 inter 2 fall 2 rise 1 server web2 172.16.10.1:80 check port 80 inter 2 fall 2 rise 1 server back 172.16.10.9:8080 backup
當後端主機全都不在線時,測試:
一旦手段主機從新上線,訪問恢復:
此時要利用到haproxy的ACL機制:
haproxy的ACL用於實現基於請求報文的首部、響應報文的內容或其它的環境狀態信息來作出轉發決 策,這大大加強了其配置彈性。其配置法則一般分爲兩步,首先去定義ACL,即定義一個測試條件, 然後在條件獲得知足時執行某特定的動做,如阻止請求或轉發至某特定的後端。 定義ACL的語法格式以下。 acl <aclname> <criterion> [flags] [operator] <value> ... <aclname>:ACL名稱,區分字符大小寫,且其只能包含大小寫字母、數字、-(鏈接線)、_(下劃線)、 .(點號)和:(冒號);haproxy中,acl能夠重名,這能夠把多個測試條件定義爲一個共同的acl; <criterion>:測試標準,即對什麼信息發起測試;測試方式能夠由[flags]指定的標誌進行調整; 而有些測試標準也能夠須要爲其在<value>以前指定一個操做符[operator]; [flags]:目前haproxy的acl支持的標誌位有3個: -i:不區分<value>中模式字符的大小寫; -f:從指定的文件中加載模式; --:標誌符的強制結束標記,在模式中的字符串像標記符時使用; <value>:acl測試條件支持的值有如下四類: 整數或整數範圍:如1024:65535表示從1024至65535;僅支持使用正整數(若是出現相似小數的標 識,其爲一般爲版本測試),且支持使用的操做符有5個,分別爲eq、ge、gt、le和lt; 字符串:支持使用「-i」以忽略字符大小寫,支持使用「\」進行轉義; 若是在模式首部出現了-i,能夠在其以前使用「--」標誌位; 正則表達式:其機制類同字符串匹配; IP地址及網絡地址 同一個acl中能夠指定多個測試條件,這些測試條件須要由邏輯操做符指定其關係。 條件間的組合測試關係有三種:「與」(默認即爲與操做)、「或」(使用「||」操做符)以及 「非」(使用「!」操做符)。
示例:
acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js acl host_static hdr_beg(host) -i img. video. download. ftp. acl being_scanned be_sess_rate gt 50
在172.16.10.9:
一、提供haproxy的配置文件,內容以下: global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen stats mode http bind 0.0.0.0:1080 stats enable stats hide-version stats uri /haproxyadmin?stats stats realm Haproxy\ Statistics stats auth admin:admin stats admin if TRUE frontend http bind *: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 static if url_static default_backend web backend static balance roundrobin server static 172.16.10.122 check backend web balance roundrobin server web1 172.16.10.77:80 check port 80 inter 2 fall 2 rise 1 server web2 172.16.10.1:80 check port 80 inter 2 fall 2 rise 1 server back 172.16.10.9:8080 backup ################################################################################### 二、提供nfs服務 mkdir /data setfacl -m d:u:48:rwx /data/ ################################################################################### 三、提供Discuzz的數據庫受權用戶 mysql> GRANT ALL ON discuzz.* TO disuser@'172.16.10.%' IDENTIFIED BY 'dispass'; mysql> FLUSH PRIVILEGES; ################################################################################## 啓動服務: service nfs start service haproxy restart
在172.16.10.一、172.16.10.77上:
yum install php php-mysql -y mkdir /var/www/html/discuzz service httpd restart
在172.16.10.122上:
這個節點上只需響應靜態頁面,能夠不安裝php php-mysql。直接掛載
在任意一臺上,掛載nfs,開始安裝discuzz.這裏以172.16.10.77爲例:
大體步驟: 一、mount -t nfs 172.16.10.9:/data/ /var/www/html/discuzz/ 二、解壓discuzz安裝包,將解壓後的upload中的全部文件複製到/var/www/html/discuzz/ 三、開始安裝:http;//172.16.10.77/discuzz/install/index.php
按照提示解決問題並安裝,最關鍵的是數據庫信息的填寫:
安裝完成後,在172.16.10.122和172.16.10.1上:mount -t nfs 172.16.10.9:/data/ /var/www/html/discuzz/ 開始測試:
前端調度:
此時,將靜態頁面服務器172.16.10.122中止,結果:
實現了必定程度上的動靜分離。
關於haproxy更多,更詳細的內容,參考官方文檔。