一、實現了一種事件驅動,單一進程模型,支持數萬計的併發鏈接,用於爲tcp和http應用程序提供高可用,負載均衡和代理服務的解決方案,尤爲適用於高負載且須要持久鏈接或7層處理機制的web站點javascript
二、代理(http)做用: web緩存(加速)、反向代理、內容路由(根據流量及內容類型等將請求轉發至特定服務器)、轉碼器(將後端服務器的內容壓縮後傳輸給client端)-在代理服務器上添加Via首部;css
三、緩存的做用:減小冗餘內容傳輸,節省帶寬、緩解網絡瓶頸,下降了對原始服務器的請求壓力,下降了傳輸延遲html
四、負載均衡做用:支持兩種代理模式:TCP(四層)和HTTP(七層),支持虛擬主機,特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理前端
五、負載均衡對比java
LVS: 一、抗負載能力強。抗負載能力強、性能高,能達到F5硬件的60%;對內存和cpu資源消耗比較低 二、工做在網絡4層,經過vrrp協議轉發(僅做分發之用),具體的流量由linux內核處理,所以沒有流量的產生。 二、穩定性、可靠性好,自身有完美的熱備方案;(如:LVS+Keepalived) 三、應用範圍比較廣,能夠對全部應用作負載均衡; 四、不支持正則處理,不能作動靜分離。 五、支持負載均衡算法:rr(輪循)、wrr(帶權輪循)、lc(最小鏈接)、wlc(權重最小鏈接) 六、配置 複雜,對網絡依賴比較大,穩定性很高。 Ngnix: 一、工做在網絡的7層之上,能夠針對http應用作一些分流的策略,好比針對域名、目錄結構; 二、Nginx對網絡的依賴比較小,理論上能ping通就就能進行負載功能; 三、Nginx安裝和配置比較簡單,測試起來比較方便; 四、也能夠承擔高的負載壓力且穩定,通常能支撐超過1萬次的併發; 五、對後端服務器的健康檢查,只支持經過端口來檢測,不支持經過url來檢測。 六、Nginx對請求的異步處理能夠幫助節點服務器減輕負載; 七、Nginx僅能支持http、https和Email協議,這樣就在適用範圍較小。 八、不支持Session的直接保持,但能經過ip_hash來解決。、對Big request header的支持不是很好, 九、支持負載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權輪循)、Ip-hash(Ip哈希) 十、Nginx還能作Web服務器即Cache功能。 HAProxy的特色是: 一、支持兩種代理模式:TCP(四層)和HTTP(七層),支持虛擬主機; 二、可以補充Nginx的一些缺點好比Session的保持,Cookie的引導等工做 三、支持url檢測後端的服務器出問題的檢測會有很好的幫助。 四、更多的負載均衡策略好比:動態加權輪循(Dynamic Round Robin),加權源地址哈希(Weighted Source Hash),加權URL哈希和加權參數哈希(Weighted Parameter Hash)已經實現 五、單純從效率上來說HAProxy更會比Nginx有更出色的負載均衡速度。 六、HAProxy能夠對Mysql進行負載均衡,對後端的DB節點進行檢測和負載均衡。 九、支持負載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、RI(請求URL)、rdp-cookie(根據cookie) 十、不能作Web服務器即Cache。
一、簡單的架構圖python
二、環境(說明):mysql
HAProxy:192.168.1.157
web1:192.168.1.110
web2:192.168.1.184linux
三、安裝步驟web
(1)關閉Selinux和防火牆redis
(2)yum -y install haproxy
(3)主配置文件/etc/haproxy/haproxy.cfg---如下是負載的配置
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global log 127.0.0.1 local2 ###[err warning info debug] chroot /usr/local/haproxy pidfile /var/run/haproxy.pid ###haproxy的pid存放路徑,啓動進程的用戶必須有權限訪問此文件 maxconn 4000 ###最大鏈接數,默認4000 user haproxy group haproxy daemon ###建立1個進程進入deamon模式運行。此參數要求將運行模式設置爲"daemon" #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http ###默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK log global ###採用全局定義的日誌 option dontlognull ###不記錄健康檢查的日誌信息 option httpclose ###每次請求完畢後主動關閉http通道 option httplog ###日誌類別http日誌格式 option forwardfor ###若是後端服務器須要得到客戶端真實ip須要配置的參數,能夠從Http Header中得到客戶端ip option redispatch ###serverId對應的服務器掛掉後,強制定向到其餘健康的服務器 timeout connect 10000 #default 10 second timeout if a backend is not found timeout client 300000 ###客戶端鏈接超時 timeout server 300000 ###服務器鏈接超時 maxconn 60000 ###最大鏈接數 retries 3 ###3次鏈接失敗就認爲服務不可用,也能夠經過後面設置 ####################################################################
#啓用haproxy的狀態監控頁配置以下 listen stats bind 0.0.0.0:1080 #監聽端口 stats refresh 30s #統計頁面自動刷新時間 stats uri /stats #統計頁面url stats realm Haproxy Manager #統計頁面密碼框上提示文本 stats auth admin:admin #統計頁面用戶名和密碼設置 #stats hide-version #隱藏統計頁面上HAProxy的版本信息 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main bind 0.0.0.0:80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js
#動態靜態頁面的分離 use_backend static if url_static ###知足策略要求,則響應策略定義的backend頁面 default_backend dynamic ###不知足則響應backend的默認頁面 #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- #靜態頁面服務器 backend static balance roundrobin ###負載均衡模式輪詢 server static 127.0.0.1:80 check ###後端服務器定義
#動態頁面服務器 backend dynamic balance roundrobin server websrv1 192.168.1.110:80 check maxconn 2000 server websrv2 192.168.1.184:80 check maxconn 2000 #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- #errorloc 503 http://www.osyunwei.com/404.html errorfile 403 /etc/haproxy/errorfiles/403.http errorfile 500 /etc/haproxy/errorfiles/500.http errorfile 502 /etc/haproxy/errorfiles/502.http errorfile 503 /etc/haproxy/errorfiles/503.http errorfile 504 /etc/haproxy/errorfiles/504.http
(4)設置HAProxy日誌
vi /etc/syslog.conf #編輯,在最下邊增長 # haproxy.log local2.* /var/log/haproxy.log
local2.* 定義haproxy的日誌記錄位置,service rsyslog restart 重啓日誌服務
(5)啓用haproxy的狀態監控頁配置以下
#################################################################### listen stats bind 0.0.0.0:1080 #監聽端口 stats refresh 30s #統計頁面自動刷新時間 stats uri /stats #統計頁面url stats realm Haproxy Manager #統計頁面密碼框上提示文本 stats auth admin:admin #統計頁面用戶名和密碼設置 #stats hide-version #隱藏統計頁面上HAProxy的版本信息 #---------------------------------------------------------------------
(6)重啓並訪問
service haproxy start #啓動 service haproxy stop #關閉 service haproxy restart #重啓
一、haproxy 配置中分紅五部份內容,分別以下:
二、haproxy 經過acl功能根據http請求報文中的請求方法實現對後端不一樣服務器組的調度
read 定義acl的名字, method匹配請求報文中首部Request Method的值
if write 若是匹配write這條acl 就使用tag_engine這個服務器組(if後面若是給了多個名字則要同時知足)
三、動靜態頁面分離
acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js #動態靜態頁面的分離 use_backend static if url_static ###知足策略要求,則響應策略定義的backend頁面 default_backend dynamic ###不知足則響應backend的默認頁面
四、haproxy 負載均衡MySQL服務的配置示例
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon defaults mode tcp log global option httplog option dontlognull 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 600 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 mysql bind *:3306 mode tcp log global default_backend mysqlservers backend mysqlservers balance leastconn server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300 server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
五、反向代理的配置
haproxy代理https有兩種方式:
1)haproxy服務器自己提供ssl證書,後面的web服務器走正常的http
2)haproxy服務器自己只提供代理,後面的web服務器走https(配置ssl證書)
第一種方式:haproxy服務器自己提供ssl證書 注意: 須要編譯haproxy的時候支持ssl 編譯參數: #make TARGET=linux26 USE_OPENSSL=1 ADDLIB=-lz #ldd haproxy | grep ssl libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007fb0485e5000) 配置參數(修改haproxy.cfg文件) frontend https_frontend bind *:443 ssl crt /etc/ssl/certs/servername.pem mode http option httpclose option forwardfor reqadd X-Forwarded-Proto:\ https default_backend web_server backend web_server mode http balance roundrobin cookie SERVERID insert indirect nocache server s1 192.168.1.150:80 check cookie s1 server s2 192.168.1.151:80 check cookie s2 ----------------------------------------------------------- 注意:這裏的pem 文件是下面兩個文件合併而成: #cat servername.crt servername.key |tee servername.pem ----------------------------------------------------------- 第二種方式:haproxy服務器自己只提供代理,沒有ssl證書 (通常咱們經常使用的就是這種方式) 這種方式,haproxy不須要從新編譯支持ssl,簡單方便,只須要後面的web服務器配置好ssl便可。 配置參數(修改haproxy.cfg文件) frontend https_frontend bind *:443 mode tcp default_backend web_server backend web_server mode tcp balance roundrobin stick-table type ip size 200k expire 30m stick on src server s1 192.168.1.150:443 server s2 192.168.1.151:443 --------------------------------------------------------- 注意,這種模式下mode 必須是tcp 模式
五、正向向代理的配置
配置文件幾乎跟反向代理差很少,修改下代理的ip的地址,前端爲內部地址,後端爲外部地址
六、 acl <aclname> <criterion> [flags] [operator] <value> .
#用法1、容許10.0.0.0/24的用戶訪問,其餘用戶將禁止
acl goodguys src 10.0.0.0/24 tcp-request content accept if goodguys tcp-request content reject tcp-request content accept [{if | unless} <condition>] Accept a connection if/unless a content inspection condition is matched
#用法2、將源IP爲172.16.254.52的用戶禁止、將403的錯誤重定向到其餘服務器;
acl badguy src 172.16.254.52 block if badguy errorloc 403 http://www.afwing.com/
#用法3、當用戶訪問172.16.1.100時,重定向到http://www.afwing.com
acl dstipaddr hdr(Host) 172.16.1.100 redirect location http://www.afwing.com if dstipaddr
#用法4、限制某個IP訪問的路徑(文件)
acl badguy src 172.16.254.52 acl denyfile path /index.html http-request deny if denyfile badguy
#用法5、讀寫、動靜分離(見上面)
參考文獻
https://www.cnblogs.com/linuxboke/p/5425914.html
http://www.jb51.net/article/101996.htm