一、Haproxy的簡介
Haproxy的官網站點:http://haproxy.com/
HAProxy提供高可用性、負載均衡以及基于TCP和HTTP應用的代 理,支援虛拟主機,它是免費、快速并且可靠的一種解決方案。HAProxy特别适用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運作在目前的硬體上,完全可以支援數以萬計的并發連接配接。并且它的運作模式使得它可以很簡單安全的整合進您目前的架構中, 同時可以保護你的web伺服器不被暴露到網絡上。
HAProxy實作了一種事件驅動, 單一程序模型,此模型支援非常大的并發連接配接數。多程序或多線程模型受記憶體限制 、系統排程器限制以及無處不在的鎖限制,很少能處理數千并發連接配接。事件驅動模型因為在有更好的資源和時間管理的使用者端(User-Space) 實作所有這些任務,是以沒有這些問題。此模型的弊端是,在多核系統上,這些程式通常擴充性較差。這就是為什麼他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。
摘自[百度百科]
二、Haproxy的工作模式
<a href="http://s3.51cto.com/wyfs02/M00/53/C8/wKioL1RwGirTYixDAAENO0C4xYo238.jpg" target="_blank"></a>
大緻的意思就是:可以分為兩部分,
第一部分是網際網路,包括網際網路上衆多的路由裝置、Firewall等;
第二部分是本地的網絡架構,包括Firewall,proxy、Web server,Database等
Haproxy的注釋Local balanceer in proxy mode -- 工作在代理模下是一個負載均衡的功能
通過Haproxy代理後端的Web server群集,如果需要與資料庫互動,有Web server與Database建立連接配接。
三、Haproxy的安裝和配置說明
CentOS 6.4系統中yum源提供的Haproxy的版本為1.5.2,在這裡我們直接用yum安裝
1、安裝haproxy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<code># yum -y install haproxy</code>
<code># rpm -ql haproxy #可以檢視yum安裝Haproxy生成了哪些檔案</code>
<code>/etc/haproxy</code>
<code>/etc/haproxy/haproxy</code><code>.cfg </code><code>#haproxy的配置檔案</code>
<code>/etc/logrotate</code><code>.d</code><code>/haproxy</code>
<code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/haproxy</code> <code>#haproxy的服務腳本檔案</code>
<code>/usr/bin/halog</code>
<code>/usr/bin/iprange</code>
<code>/usr/sbin/haproxy</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.2</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.2</code><code>/acl-content-sw</code><code>.cfg</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.2</code><code>/acl</code><code>.fig</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.2</code><code>/haproxy</code><code>.cfg</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.2</code><code>/internals</code>
<code>/usr/share/haproxy</code>
<code>/usr/share/haproxy/400</code><code>.http </code><code>#400錯誤的狀态碼頁面</code>
<code>/usr/share/haproxy/403</code><code>.http </code><code>#403錯誤的狀态碼頁面</code>
<code>/usr/share/haproxy/408</code><code>.http </code><code>#408錯誤的狀态碼頁面</code>
<code>/usr/share/haproxy/500</code><code>.http </code><code>#500錯誤的狀态碼頁面</code>
<code>/usr/share/haproxy/502</code><code>.http </code><code>#502錯誤的狀态碼頁面</code>
<code>/usr/share/haproxy/503</code><code>.http </code><code>#503錯誤的狀态碼頁面</code>
<code>/usr/share/haproxy/504</code><code>.http </code><code>#504錯誤的狀态碼頁面</code>
<code>/usr/share/man/man1/halog</code><code>.1.gz </code><code>#可以直接使用man halog檢視指令的使用文法</code>
<code>/usr/share/man/man1/haproxy</code><code>.1.gz </code><code>#可以直接使用man haproxy檢視指令的使用文法</code>
<code>/var/lib/haproxy</code>
<code>.....</code>
2、haproxy的配置檔案說明
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<code># cd /etc/haproxy/</code>
<code># cp haproxy.cfg haproxy.cfg.bak</code>
<code># vim haproxy.cfg</code>
<code>**********************************************************************</code>
<code>#---------------------------------------------------------------------</code>
<code># Example configuration for a possible web application. See the</code>
<code># full configuration options online.</code>
<code>#</code>
<code># http://haproxy.1wt.eu/download/1.4/doc/configuration.txt</code>
<code># Global settings </code>
<code>global </code><code>#全局配置檔案</code>
<code> </code><code># to have these messages end up in /var/log/haproxy.log you will</code>
<code> </code><code># need to: #配置日志</code>
<code> </code><code>#</code>
<code> </code><code># 1) configure syslog to accept network log events. This is done</code>
<code> </code><code># by adding the '-r' option to the SYSLOGD_OPTIONS in</code>
<code> </code><code># /etc/sysconfig/syslog #修改syslog配置檔案</code>
<code> </code><code># 2) configure local2 events to go to the /var/log/haproxy.log</code>
<code> </code><code># file. A line like the following can be added to</code>
<code> </code><code># /etc/sysconfig/syslog #定義日志裝置</code>
<code> </code><code># local2.* /var/log/haproxy.log</code>
<code> </code><code>log 127.0.0.1 local2 </code><code>#日志配置,所有的日志都記錄本地,通過local2輸出</code>
<code> </code><code>chroot </code><code>/var/lib/haproxy</code> <code>#改變haproxy的工作目錄</code>
<code> </code><code>pidfile </code><code>/var/run/haproxy</code><code>.pid </code><code>#指定pid檔案的路徑</code>
<code> </code><code>maxconn 4000 </code><code>#最大連接配接數的設定</code>
<code> </code><code>user haproxy </code><code>#指定運作服務的使用者</code>
<code> </code><code>group haproxy </code><code>#指定運作服務的使用者組</code>
<code> </code><code>daemon</code>
<code> </code><code># turn on stats unix socket</code>
<code> </code><code>stats socket </code><code>/var/lib/haproxy/stats</code>
<code># common defaults that all the 'listen' and 'backend' sections will</code>
<code># use if not designated in their block</code>
<code>defaults</code>
<code> </code>
<code> </code><code>mode http </code><code>#預設使用協定,可以為{http|tcp|health} http:是七層協定 tcp:是四層 health:隻傳回OK</code>
<code> </code><code>log global </code><code>#全局日志記錄</code>
<code> </code><code>option httplog </code><code>#詳細記錄http日志</code>
<code> </code><code>option dontlognull </code><code>#不記錄空日志</code>
<code> </code><code>option http-server-close </code><code>#啟用http-server-close</code>
<code> </code><code>option forwardfor except 127.0.0.0</code><code>/8</code> <code>#來自這些資訊的都不forwardfor</code>
<code> </code><code>option redispatch </code><code>#重新分發,ServerID對應的伺服器當機後,強制定向到其他運作正常的伺服器</code>
<code> </code><code>retries 3 </code><code>#3次連接配接失敗則認為服務不可用</code>
<code> </code><code>timeout http-request 10s </code><code>#預設http請求逾時時間</code>
<code> </code><code>timeout queue 1m </code><code>#預設隊列逾時時間</code>
<code> </code><code>timeout connect 10s </code><code>#預設連接配接逾時時間</code>
<code> </code><code>timeout client 1m </code><code>#預設用戶端逾時時間</code>
<code> </code><code>timeout server 1m </code><code>#預設伺服器逾時時間</code>
<code> </code><code>timeout http-keep-alive 10s </code><code>#預設持久連接配接逾時時間</code>
<code> </code><code>timeout check 10s </code><code>#預設檢查時間間隔</code>
<code> </code><code>maxconn 3000 </code><code>#最大連接配接數</code>
<code># main frontend which proxys to the backends</code>
<code>frontend main *:5000</code>
<code> </code><code>#定義ACL規則以如".html"結尾的檔案;-i:忽略大小寫</code>
<code> </code><code>acl url_static path_beg -i </code><code>/static</code> <code>/images</code> <code>/javascript</code> <code>/stylesheets</code>
<code> </code><code>acl url_static path_end -i .jpg .gif .png .css .js</code>
<code> </code><code>use_backend static </code><code>if</code> <code>url_static </code><code>#調用後端伺服器并檢查ACL規則是否被比對</code>
<code> </code><code>default_backend app </code><code>#用戶端通路時預設調用後端伺服器位址池</code>
<code># static backend for serving up images, stylesheets and such</code>
<code>backend static </code><code>#定義後端伺服器</code>
<code> </code><code>balance roundrobin </code><code>#定義算法;基于權重進行輪詢</code>
<code> </code><code>server static 127.0.0.1:4331 check check:啟動對後端server的健康狀态檢測</code>
<code># round robin balancing between the various backends</code>
<code>backend app</code>
<code> </code><code>balance roundrobin</code>
<code> </code><code>server app1 127.0.0.1:5001 check</code>
<code> </code><code>server app2 127.0.0.1:5002 check</code>
<code> </code><code>server app3 127.0.0.1:5003 check</code>
<code> </code><code>server app4 127.0.0.1:5004 check</code>
3、haproxy的指令詳解
<code># haproxy -h</code>
<code>HA-Proxy version 1.5.2 2014</code><code>/07/12</code>
<code>Copyright 2000-2014 Willy Tarreau <[email protected]></code>
<code>Usage : haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ]</code>
<code> </code><code>[ -p <pidfile> ] [ -m <max megs> ] [ -C <</code><code>dir</code><code>> ]</code>
<code> </code><code>-</code><code>v</code> <code>displays version ; -vv shows known build options.</code>
<code> </code><code>-d enters debug mode ; -db only disables background mode.</code>
<code> </code><code>-dM[<byte>] poisons memory with <byte> (defaults to 0x50)</code>
<code> </code><code>-V enters verbose mode (disables quiet mode)</code>
<code> </code><code>-D goes daemon ; -C changes to <</code><code>dir</code><code>> before loading files.</code>
<code> </code><code>-q quiet mode : don't display messages</code>
<code> </code><code>-c check mode : only check config files and </code><code>exit</code>
<code> </code><code>-n sets the maximum total </code><code># of connections (2000)</code>
<code> </code><code>-m limits the usable amount of memory (</code><code>in</code> <code>MB)</code>
<code> </code><code>-N sets the default, per-proxy maximum </code><code># of connections (2000)</code>
<code> </code><code>-L </code><code>set</code> <code>local</code> <code>peer name (default to </code><code>hostname</code><code>)</code>
<code> </code><code>-p writes pids of all children to this </code><code>file</code>
<code> </code><code>-de disables epoll() usage even when available</code>
<code> </code><code>-dp disables poll() usage even when available</code>
<code> </code><code>-dS disables splice usage (broken on old kernels)</code>
<code> </code><code>-dV disables SSL verify on servers side</code>
<code> </code><code>-sf</code><code>/-st</code> <code>[pid ]* finishes</code><code>/terminates</code> <code>old pids. Must be last arguments.</code>
4、配置Haproxy的日志
<code>預設情況下,Haproxy沒有啟用日志檔案,但是我們可以根據haproxy的配置檔案做修改。</code>
<code>(1)修改系統日志的配置檔案</code>
<code># vim /etc/sysconfig/rsyslog</code>
<code>SYSLOGD_OPTIONS=</code><code>"-c 2 -r"</code>
<code>(2)增加日志裝置</code>
<code># vim /etc/rsyslog.conf </code>
<code>local2.* </code><code>/var/log/haproxy</code><code>.log</code>
<code>(3)重新開機一下日志服務</code>
<code># /etc/init.d/rsyslog restart</code>
<code>關閉系統日志記錄器: [确定]</code>
<code>啟動系統日志記錄器: [确定]</code>
<code>(4)檢視日志記錄資訊</code>
<code># tail -f /var/log/haproxy.log</code>
四、Haproxy負載均衡web
1、一個配置示例:
Haproxy-Server:192.168.0.105
Apache1-Client:192.168.0.102
Apache2-Client:192.168.0.106
<code># Global settings</code>
<code>global</code>
<code> </code><code># need to:</code>
<code> </code><code># /etc/sysconfig/syslog</code>
<code> </code><code># /etc/sysconfig/syslog</code>
<code> </code><code>log 127.0.0.1 local2</code>
<code> </code><code>chroot </code><code>/var/lib/haproxy</code>
<code> </code><code>pidfile </code><code>/var/run/haproxy</code><code>.pid</code>
<code> </code><code>maxconn 4000</code>
<code> </code><code>user haproxy</code>
<code> </code><code>group haproxy</code>
<code> </code><code>mode http</code>
<code> </code><code>log global</code>
<code> </code><code>option httplog</code>
<code> </code><code>option dontlognull</code>
<code> </code><code>option http-server-close</code>
<code> </code><code>option forwardfor except 127.0.0.0</code><code>/8</code>
<code> </code><code>option redispatch</code>
<code> </code><code>retries 3</code>
<code> </code><code>timeout http-request 10s</code>
<code> </code><code>timeout queue 1m</code>
<code> </code><code>timeout connect 10s</code>
<code> </code><code>timeout client 1m</code>
<code> </code><code>timeout server 1m</code>
<code> </code><code>timeout http-keep-alive 10s</code>
<code> </code><code>timeout check 10s</code>
<code> </code><code>maxconn 30000</code>
<code>listen stats</code>
<code> </code><code>mode http</code>
<code> </code><code>bind 0.0.0.0:1080</code>
<code> </code><code>stats </code><code>enable</code>
<code> </code><code>stats hide-version</code>
<code> </code><code>stats uri </code><code>/haproxyadmin</code><code>?stats</code>
<code> </code><code>stats realm Haproxy\ Statistics</code>
<code> </code><code>stats auth admin:123456</code>
<code> </code><code>stats admin </code><code>if</code> <code>TRUE</code>
<code>frontend http-</code><code>in</code>
<code> </code><code>bind *:80</code>
<code> </code><code>log global</code>
<code> </code><code>option httpclose</code>
<code> </code><code>option logasap</code>
<code> </code><code>option dontlognull</code>
<code> </code><code>capture request header Host len 20</code>
<code> </code><code>capture request header Referer len 60</code>
<code> </code><code>default_backend servers</code>
<code>frontend healthcheck</code>
<code> </code><code>bind :1099</code>
<code> </code><code>option forwardfor</code>
<code>backend servers</code>
<code> </code><code>balance roundrobin</code>
<code> </code><code>server websrv1 192.168.0.102:80 check maxconn 2000</code>
<code> </code><code>server websrv2 192.168.0.106:80 check maxconn 2000</code>
2、啟動Haproxy服務
<code># service haproxy start</code>
<code>正在啟動 haproxy: [确定]</code>
3、浏覽器通路
單獨通路Apache1:192.168.0.102
<a href="http://s3.51cto.com/wyfs02/M00/53/CA/wKioL1RwMNjRicJhAADYLGQ6DcA929.jpg" target="_blank"></a>
單獨通路Apache2:192.168.0.106
<a href="http://s3.51cto.com/wyfs02/M00/53/CC/wKiom1RwMF2wp7cVAADauWnSFrk034.jpg" target="_blank"></a>
多次重新整理通路Haproxy:192.168.0.105
多次重新整理Haproxy的website,會切換到後端不同的webserver主機上。
<a href="http://s3.51cto.com/wyfs02/M01/53/CA/wKioL1RwMNiQBz_SAADWTNm43hg230.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/53/CC/wKiom1RwMF2DCah8AADjp38HsUI779.jpg" target="_blank"></a>
五、Haproxy的狀态監控
1、Haproxy的監控頁面
<code>listen stats </code><code>#關聯前端和後端定義一個完整的代理</code>
<code> </code><code>mode http </code><code>#設定代理協定</code>
<code> </code><code>bind 0.0.0.0:1080 </code><code>#綁定相應的端口</code>
<code> </code><code>stats </code><code>enable</code> <code>#開啟Haproxy統計狀态</code>
<code> </code><code>stats refresh 3s </code><code>#統計頁面自動重新整理時間間隔</code>
<code> </code><code>stats hide-version </code><code>#隐藏代理伺服器版本</code>
<code> </code><code>stats uri </code><code>/haproxyadmin</code><code>?stats </code><code>#通路的url</code>
<code> </code><code>stats realm Haproxy\ Statistics </code><code>#統計頁面認證時提示内容資訊</code>
<code> </code><code>stats auth admin:123456 </code><code>#設定登入使用者和密碼 </code>
<code> </code><code>stats admin </code><code>if</code> <code>TRUE </code><code>#如果認證通過,則就可以打開stats</code>
2、通路監控頁面
(1)登陸監控頁面
admin/123456
<a href="http://s3.51cto.com/wyfs02/M02/53/CA/wKioL1RwM3eilyGVAAFLazQ1qcw644.jpg" target="_blank"></a>
(2)檢視監控頁面
<a href="http://s3.51cto.com/wyfs02/M02/53/CA/wKioL1RwNAHiKSM3AAk3jcCY9WM150.jpg" target="_blank"></a>
(3)模拟一下故障
<code># service httpd stop</code>
<code>停止 httpd: [确定]</code>
(4)在次檢視監控頁面
<a href="http://s3.51cto.com/wyfs02/M02/53/CC/wKiom1RwNFDy-iQ0AAJkwsA7ySE639.jpg" target="_blank"></a>
六、Haproxy的動靜分離
注釋說明:
在這裡說明動靜分離的示範流程,後端分别三台負載均衡主機上放上同樣的頁面,靜态頁面index.html,動态頁面a.php;然後通路haproxy主機的靜态頁面和動态頁面,來判斷通路的是那台主機
1、動靜分離的主機配置設定
Haproxy:192.168.0.105 proxy
Apache1:192.168.0.102 static
Apache2:192.168.0.106 static
Nginx01:192.168.0.107 dynamic
2、浏覽器分别通路各個主機
<a href="http://s3.51cto.com/wyfs02/M00/53/CA/wKioL1RwPmfzyADHAADlewFBd-U290.jpg" target="_blank"></a>
Apache1:192.168.0.102 dynamic
<a href="http://s3.51cto.com/wyfs02/M00/53/CC/wKiom1RwPezDweGEAAI6yhvw3ks953.jpg" target="_blank"></a>
Apache1:192.168.0.106 static
<a href="http://s3.51cto.com/wyfs02/M01/53/CA/wKioL1RwPmejLKdTAAD9CAERs3o326.jpg" target="_blank"></a>
Apache1:192.168.0.106 dynamic
<a href="http://s3.51cto.com/wyfs02/M01/53/CC/wKiom1RwPezRRj0AAAFMOcYx8w0873.jpg" target="_blank"></a>
Nginx01:192.168.0.107 static
<a href="http://s3.51cto.com/wyfs02/M02/53/CA/wKioL1RwPmiwb7H-AAHHny5ngjA254.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/53/CC/wKiom1RwPezgaVq_AAKd8OyTKFs632.jpg" target="_blank"></a>
3、haproxy動靜分離的配置
<code> </code><code>acl url_static path_end -i .html .jpg .gif</code>
<code> </code><code>acl url_dynamic path_end -i .php</code>
<code> </code><code>use_backend lnmmp </code><code>if</code> <code>url_dynamic</code>
<code> </code><code>server websrv1 192.168.0.102:80 check rise 2 fall 1 weight 2 maxconn 2000</code>
<code> </code><code>server websrv2 192.168.0.106:80 check rise 2 fall 1 weight 2 maxconn 2000</code>
<code>backend lnmmp</code>
<code> </code><code>balance </code><code>source</code>
<code> </code><code>server websrv3 192.168.0.107:80 check rise 2 fall 1 maxconn 2000</code>
4、動靜分離通路測試
<a href="http://s3.51cto.com/wyfs02/M00/53/CB/wKioL1RwP5WDSfjjAAD4W8GHZqY597.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/53/CD/wKiom1RwPxqgc-ybAAD-q3Vo2Lg725.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/53/CB/wKioL1RwP5WD-NZPAAJ87xn_AF0588.jpg" target="_blank"></a>
七、近期網絡架構
<a href="http://s3.51cto.com/wyfs02/M01/53/CB/wKioL1RwS_Ky77adAAYSgiqjz2Y603.jpg" target="_blank"></a>
期望網友能夠指點架構的優缺點,後期将會釋出此博文
本文轉自zys467754239 51CTO部落格,原文連結:http://blog.51cto.com/467754239/1581237,如需轉載請自行聯系原作者