天天看點

Haproxy其他功能及配置

下面了解一下haproxy的其他功能設定,多是一些生産環境中常用的功能設定,是以列舉如下。

一、haproxy健康檢查

1、基于HEAD的檢查方法

寫法:

option httpchk HEAD /a.html HTTP/1.0

<a href="http://s2.51cto.com/wyfs02/M02/88/53/wKiom1fuogPiAQNyAAK1Dp4KTtQ418.png-wh_500x0-wm_3-wmp_4-s_2384485089.png" target="_blank"></a>

兩個節點的狀态原本都是正常的。

下面修改一下配置檔案,内容添加httpchk一項:

<code>listenwebsites</code>

<code>        </code><code>bind  192.168.100.121:80</code>

<code>        </code><code>option  httpchk HEAD </code><code>/check</code><code>.html HTTP</code><code>/1</code><code>.0</code>

<code>        </code><code>timeout  server  15s</code>

<code>        </code><code>timeout  connect 30s</code>

<code>        </code><code>server  mylinux3  192.168.100.181:80 check port 80 inter 2000 fall 3</code>

<code>        </code><code>server  mylinux4  192.168.100.182:80 check port 80 inter 2000 fall 3</code>

再次檢視伺服器的狀态:

<a href="http://s1.51cto.com/wyfs02/M02/88/50/wKioL1fuogeTUTGiAAKuIIlzPPk615.png-wh_500x0-wm_3-wmp_4-s_667147031.png" target="_blank"></a>

發現兩個Server都是當機的狀态。

<a href="http://s2.51cto.com/wyfs02/M01/88/53/wKiom1fuogrCnPmmAAFDguMoL7w956.png-wh_500x0-wm_3-wmp_4-s_2507287244.png" target="_blank"></a>

<a href="http://s2.51cto.com/wyfs02/M02/88/50/wKioL1fuogyCx9JtAAFAyCCFUjE731.png-wh_500x0-wm_3-wmp_4-s_2737536311.png" target="_blank"></a>

然而兩個伺服器的http服務都是正常的,隻是沒有check.html這個頁面。

<code>[root@mylinux3 ~]</code><code># echo check &gt;&gt;/var/www/html/check.html</code>

在mylinux3上生成check.html這個頁面,再次檢視監控界面:

<a href="http://s1.51cto.com/wyfs02/M00/88/53/wKiom1fuoviB9ydFAAKS9v4ukc8327.png-wh_500x0-wm_3-wmp_4-s_436026961.png" target="_blank"></a>

發現mylinux3的狀态已經恢複,說明httpchk作用正常。

2、基于GET的檢查方法

option httpchk GET /a.txt

相當于wget http://*.*.*.*/a.txt,如果a.txt不存在,則即使httpd服務正常也會提示服務不可用。

配置示例:

<code>        </code><code>option   httpchk GET </code><code>/info</code><code>.txt</code>

<code>        </code><code>#option  httpchk HEAD /check.html HTTP/1.0</code>

<a href="http://s5.51cto.com/wyfs02/M00/88/50/wKioL1fupR2AuYP1AAKD7MSM92U396.png-wh_500x0-wm_3-wmp_4-s_3585527357.png" target="_blank"></a>

mylinux3和mylinux4上的httpd服務正常,浏覽器可以正常通路,但是監控界面兩個伺服器都是當機狀态。

<code>[root@mylinux4 ~]</code><code># touch /var/www/html/info.txt</code>

在mylinux4上建立info.txt檔案,再次重新整理監控界面:

<a href="http://s2.51cto.com/wyfs02/M02/88/53/wKiom1fupcnwx8JIAAJ8jPek46U024.png-wh_500x0-wm_3-wmp_4-s_3465248596.png" target="_blank"></a>

此時,mylinux4已經重新恢複成活動狀态。

3、httpchk預設檢查方法

option httpchk

這種寫法就相當于option httpchk / ,也就是檢查對應web伺服器的站點根目錄是否存在,如果不存在則認為伺服器當機(這種方法類似上面的第一種方法,就不再補圖實驗了)。

二、配置後端web伺服器日志記錄用戶端真實IP位址

1、先來看一下web伺服器日志,如下:

<code>[root@mylinux3 ~]</code><code># cat /etc/httpd/logs/access_log </code>

<code>192.168.100.121 - - [02</code><code>/Oct/2016</code><code>:01:17:01 +0800] </code><code>"GET / HTTP/1.1"</code> <code>200 222</code>

<code>192.168.100.121 - - [02</code><code>/Oct/2016</code><code>:01:17:01 +0800] </code><code>"GET / HTTP/1.1"</code> <code>200 222 </code><code>"-"</code> <code>"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"</code>

<code>192.168.100.121 - - [02</code><code>/Oct/2016</code><code>:01:20:53 +0800] </code><code>"GET / HTTP/1.1"</code> <code>200 222</code>

<code>192.168.100.121 - - [02</code><code>/Oct/2016</code><code>:01:20:53 +0800] </code><code>"GET / HTTP/1.1"</code> <code>200 222 </code><code>"-"</code> <code>"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"</code>

<code>192.168.100.121 - - [02</code><code>/Oct/2016</code><code>:01:20:53 +0800] </code><code>"GET /favicon.ico HTTP/1.1"</code> <code>404 290</code>

上面的日志中,第二行是我在mylinux1上使用curl通路的,而後面的都是在windows用戶端通過haproxy的代理連接配接通路的,但是apache的日志中顯示的使用者IP位址都是192.168.100.121,也就是mylinux1的IP位址,這實際上不是真實的客戶通路IP。如果想讓web伺服器記錄真實的客戶通路IP,則需要調整以下設定。

2、修改haproxy配置檔案

在listen中添加forwardfor選項,注意:該選項隻有放在listen段中才能生效,而放在global,default等其他段中無效。

<code>        </code><code>bind  192.168.100.120:80</code>

<code>        </code><code>option   forwardfor</code>

<code>        </code><code>#option  httpchk GET /info.txt</code>

3、修改web伺服器日志格式

下面以apache為例,如果想要apache記錄用戶端的真實IP位址,還需要修改apache的日志格式。

[root@mylinux3 ~]# vi /etc/httpd/conf/httpd.conf 

[root@mylinux3 ~]# grep LogFormat /etc/httpd/conf/httpd.conf 

LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

#LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common

LogFormat "\"%{X-Forwarded-For}i\" %V %A %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" common

LogFormat "%{Referer}i -&gt; %U" referer

LogFormat "%{User-agent}i" agent

#LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

注釋掉原有的日志格式(我這裡是common格式,如果是其他模式可以依樣修改),然後添加一行新的common格式,使用藍色部分中的模式比對真實IP位址。

4、重新開機web服務

<code>[root@mylinux3 ~]</code><code># /etc/init.d/httpd restart</code>

<code>Stopping httpd:                                            [  OK  ]</code>

<code>Starting httpd: httpd: apr_sockaddr_info_get() failed </code><code>for</code> <code>mylinux3.contoso.com</code>

<code>httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 </code><code>for</code> <code>ServerName</code>

<code>                                                           </code><code>[  OK  ]</code>

5、使用haproxy代理通路測試

<code>[root@mylinux3 ~]</code><code># tail -f /etc/httpd/logs/access_log </code>

<code>"192.168.100.1"</code> <code>192.168.100.120 192.168.100.181 [02</code><code>/Oct/2016</code><code>:01:44:12 +0800] </code><code>"GET / HTTP/1.1"</code> <code>200 222 </code><code>"-"</code> <code>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)"</code>

<code>192.168.100.121 - - [02</code><code>/Oct/2016</code><code>:01:44:12 +0800] </code><code>"GET / HTTP/1.1"</code> <code>200 222 </code><code>"-"</code> <code>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)"</code>

<code>"192.168.100.1"</code> <code>192.168.100.120 192.168.100.181 [02</code><code>/Oct/2016</code><code>:01:44:13 +0800] </code><code>"GET /favicon.ico HTTP/1.1"</code> <code>404 290 </code><code>"-"</code> <code>"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"</code>

<code>192.168.100.121 - - [02</code><code>/Oct/2016</code><code>:01:44:13 +0800] </code><code>"GET /favicon.ico HTTP/1.1"</code> <code>404 290 </code><code>"-"</code> <code>"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"</code>

可以看到,已經可以記錄用戶端的真實IP了。

三、haproxy的後端伺服器backup設定

haproxy可以設定後端伺服器的高可用,也就是可以有多個伺服器,但是正常情況下,隻有一部分提供服務,而隻有在正常提供服務的機器當機之後,備用機器才會提供服務。

listenwebsites

        bind  192.168.100.120:80

        option   forwardfor

        #option  httpchk GET /info.txt

        #option  httpchk HEAD /check.html HTTP/1.0

        timeout  server  15s

        timeout  connect 30s

        server  mylinux3  192.168.100.181:80 check port 80 inter 2000 fall 3

        server  mylinux4  192.168.100.182:80 check port 80 inter 2000 fall 3 backup

這裡設定mylinux4是備用機器,正常情況下隻有mylinux3提供服務,而在haproxy認為mylinux3挂掉之後,才會啟用mylinux4提供服務。

<code>[root@mylinux1 ~]</code><code># service haproxy check</code>

<code>Configuration </code><code>file</code> <code>is valid</code>

<code>[root@mylinux1 ~]</code><code># service haproxy restart</code>

<code>Stop haproxy successful.</code>

<code>Start haproxy successful.</code>

<code>[root@mylinux1 ~]</code><code># curl http://192.168.100.181</code>

<code>mylinux3</code>

<code>[root@mylinux1 ~]</code><code># curl http://192.168.100.182</code>

<code>mylinux4</code>

<code>[root@mylinux1 ~]</code><code># for i in {1..20};do curl http://192.168.100.120/;done</code>

說明在mylinux3正常的情況下,mylinux4是不提供服務的,隻當做備用機器,下面将mylinux3的web服務關閉,再進行測試:

<code>[root@mylinux3 ~]</code><code># /etc/init.d/httpd stop</code>

<code>[root@mylinux3 ~]</code><code>#</code>

<a href="http://s2.51cto.com/wyfs02/M00/88/54/wKioL1fv-YSSuJufAAKc662TZNA159.png-wh_500x0-wm_3-wmp_4-s_1379630308.png" target="_blank"></a>

mylinux3已經關閉httpd服務,在監控界面顯示為不可用狀态。

此時,通路haproxy代理連結,全部都是轉發給mylinux4,即我在haproxy配置檔案中設定的備用機器。

另外,這裡backup主機提供服務的前提是所有正常服務的主機全部都不能通過健康檢查,即haproxy認為所有的提供服務的主機都是當機狀态(我這裡隻有一台,如果有多台的話,必須是不加backup的所有主機都無法提供服務),才會啟用第一個backup主機提供服務。當然這樣實際上不太好,如果正常情況下提供服務的主機有多台,而backup的主機數量較少,我們可能希望啟動所有的backup主機,就需要添加如下參數:

option allbackups

四、Acl規則

1、首先在web伺服器上建立虛拟主機

1)mylinux3

<code>[root@mylinux3 conf]</code><code># cat vhost.conf </code>

<code>&lt;VirtualHost *:8001&gt;</code>

<code>    </code><code>ServerAdmin [email protected]</code>

<code>    </code><code>DocumentRoot </code><code>/var/www/html/web1</code>

<code>    </code><code>ServerName www.web1.com</code>

<code>    </code><code>ErrorLog logs</code><code>/web1-error</code><code>.log</code>

<code>    </code><code>CustomLog logs</code><code>/web1-access</code><code>.log common</code>

<code>&lt;</code><code>/VirtualHost</code><code>&gt;</code>

<code>&lt;VirtualHost *:8002&gt;</code>

<code>    </code><code>ServerAdmin [email protected]</code>

<code>    </code><code>DocumentRoot </code><code>/var/www/html/web2</code>

<code>    </code><code>ServerName www.web2.com</code>

<code>    </code><code>ErrorLog logs</code><code>/web2-error</code><code>.log</code>

<code>    </code><code>CustomLog logs</code><code>/web2-access</code><code>.log common</code>

<code>[root@mylinux3 conf]</code><code># mkdir -p /var/www/html/{web1,web2}</code>

<code>[root@mylinux3 conf]</code><code># echo web1 &gt;&gt;/var/www/html/web1/index.html</code>

<code>[root@mylinux3 conf]</code><code># echo web2 &gt;&gt;/var/www/html/web2/index.html</code>

<code>[root@mylinux3 conf]</code><code># /etc/init.d/httpd start</code>

<code>Starting httpd:                                            [  OK  ]</code>

<code>[root@mylinux3 conf]</code><code># curl http://192.168.100.181:8001/</code>

<code>web1</code>

<code>[root@mylinux3 conf]</code><code># curl http://192.168.100.181:8002/</code>

<code>web2</code>

2)mylinux4

<code>[root@mylinux4 conf]</code><code># cat vhost.conf </code>

<code>    </code><code>ServerAdmin [email protected]</code>

<code>    </code><code>DocumentRoot </code><code>/var/www/html/web3</code>

<code>    </code><code>ServerName www.web3.com</code>

<code>    </code><code>ErrorLog logs</code><code>/web3-error</code><code>.log</code>

<code>    </code><code>CustomLog logs</code><code>/web3-access</code><code>.log common</code>

<code>    </code><code>ServerAdmin [email protected]</code>

<code>    </code><code>DocumentRoot </code><code>/var/www/html/web4</code>

<code>    </code><code>ServerName www.web4.com</code>

<code>    </code><code>ErrorLog logs</code><code>/web4-error</code><code>.log</code>

<code>    </code><code>CustomLog logs</code><code>/web4-access</code><code>.log common</code>

<code>[root@mylinux4 conf]</code><code># mkdir -p /var/www/html/{web3,web4}</code>

<code>[root@mylinux4 conf]</code><code># for i in {3..4};do echo web$i &gt;&gt; /var/www/html/web$i/index.html;done</code>

<code>[root@mylinux4 conf]</code><code># /etc/init.d/httpd start</code>

<code>[root@mylinux4 conf]</code><code># curl http://192.168.100.182:8001/</code>

<code>web3</code>

<code>[root@mylinux4 conf]</code><code># curl http://192.168.100.182:8002/</code>

<code>web4</code>

<code>global</code>

<code>        </code><code>#log 127.0.0.1  local0</code>

<code>log 127.0.0.1:514  local0  warning</code>

<code>        </code><code>pidfile </code><code>/usr/local/haproxy/var/run/haproxy</code><code>.pid</code>

<code>        </code><code>daemon</code>

<code>maxconn 4096</code>

<code>chroot </code><code>/usr/local/haproxy/var/chroot</code>

<code>user haproxy</code>

<code>group haproxy</code>

<code>        </code><code>nbproc 1</code>

<code>defaults</code>

<code>logglobal</code>

<code>        </code><code>mode    http</code>

<code>retries3</code>

<code>        </code><code>option  httplog</code>

<code>        </code><code>option  httpclose</code>

<code>        </code><code>option  dontlognull</code>

<code>        </code><code>option  forwardfor</code>

<code>option  redispatch</code>

<code>maxconn2000</code>

<code>        </code><code>balance roundrobin</code>

<code>timeout connect 5000</code>

<code>timeout client  50000</code>

<code>timeoutserver          50000</code>

<code>listen  haproxy_stats</code>

<code>        </code><code>bind   *:8000</code>

<code>        </code><code>mode   http</code>

<code>        </code><code>option httplog</code>

<code>        </code><code>maxconn 20</code>

<code>        </code><code>stats </code><code>enable</code>

<code>        </code><code>stats refresh 30s</code>

<code>        </code><code>stats uri </code><code>/haproxy_status</code>

<code>        </code><code>stats auth admin:123456</code>

<code>        </code><code>stats hide-version</code>

<code>#listenwebsites  </code>

<code>#        bind  192.168.100.120:80</code>

<code>#        option   forwardfor</code>

<code>#        #option  httpchk GET /info.txt</code>

<code>#        #option  httpchk HEAD /check.html HTTP/1.0</code>

<code>#        timeout  server  15s</code>

<code>#        timeout  connect 30s</code>

<code>#        server  mylinux3  192.168.100.181:80 check port 80 inter 2000 fall 3</code>

<code>#        server  mylinux4  192.168.100.182:80 check port 80 inter 2000 fall 3 backup</code>

<code>#</code>

<code>frontend web</code>

<code>         </code><code>bind 192.168.100.121:80</code>

<code>         </code><code>acl mylinux3_dom hdr(host) -i www.mylinux3.com </code><code>#acl規則名稱為mylinux3_dom,規則為檢查通路域名是否為www.mylinux3.com,-i表示不區分大小寫</code>

<code>         </code><code>acl mylinux4_dom hdr(host) -i www.mylinux4.com</code>

<code>         </code><code>use_backend mylinux3 </code><code>if</code> <code>mylinux3_dom </code><code>#如果符合mylinux3_dom規則,則轉發給mylinux3的後端作用域</code>

<code>         </code><code>use_backend mylinux4 </code><code>if</code> <code>mylinux4_dom </code><code>#如果符合mylinux4_dom規則,則轉發給mylinux4的後端作用域</code>

<code>         </code><code>default_backend mylinux3  </code><code>#預設情況下轉發給mylinux3的後端作用域</code>

<code>backend  mylinux3   </code><code>#定義一個後端作用域</code>

<code>         </code><code>balance  leastconn  </code><code>#輪詢方式,最小連接配接數</code>

<code>         </code><code>option   httpclose  </code><code>#每次請求完畢後,主動關閉http通道</code>

<code>         </code><code>option   forwardfor  </code><code>#如果後端伺服器需要獲得用戶端真實ip需要配置的參數,可以從Http Header中獲得用戶端ip  </code>

<code>         </code><code>server   web1  192.168.100.181:8001 check port 8001 inter 2000 fall 1</code>

<code>         </code><code>server   web2  192.168.100.181:8002 check port 8002 inter 2000 fall 1</code>

<code>backend  mylinux4</code>

<code>         </code><code>balance  roundrobin</code>

<code>         </code><code>option   httpclose</code>

<code>         </code><code>option   forwardfor</code>

<code>         </code><code>option   redispatch  </code><code>#當serverId對應的伺服器挂掉後,強制定向到其他健康的伺服器</code>

<code>         </code><code>#option   httpchk  /index.html HTTP/1.0</code>

<code>         </code><code>server   web1  192.168.100.182:8001 check port 8001 inter 1000 fall 2</code>

<code>         </code><code>server   web2  192.168.100.182:8002 check port 8002 inter 1000 fall 2</code>

3、重新開機haproxy服務

<code>[root@mylinux1 conf]</code><code># service haproxy restart</code>

4、檢視監控界面

<a href="http://s5.51cto.com/wyfs02/M01/88/58/wKiom1fwnkChCPR4AAa93Ldhmv0862.jpg-wh_500x0-wm_3-wmp_4-s_3820976144.jpg" target="_blank"></a>

5、修改windows用戶端hosts檔案

注:這裡是因為沒有DNS,是以windows要進行通路需要修改hosts檔案,如果是生産環境,haproxy代理綁定外網IP,然後通過DNS将域名進行解析,就可以直接通過域名通路了。

<a href="http://s1.51cto.com/wyfs02/M01/88/55/wKioL1fwnxyBiDUeAAGFwY7RsTc681.jpg-wh_500x0-wm_3-wmp_4-s_4138711980.jpg" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M00/88/58/wKiom1fwn7TB2a5FAACKgGIW4Lc307.jpg-wh_500x0-wm_3-wmp_4-s_1115408780.jpg" target="_blank"></a>

<a href="http://s4.51cto.com/wyfs02/M01/88/55/wKioL1fwn7XDAfUdAACK-ALcqYw191.jpg-wh_500x0-wm_3-wmp_4-s_408788157.jpg" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M02/88/55/wKioL1fwn9LS01qyAACc0qhvJig532.jpg-wh_500x0-wm_3-wmp_4-s_1441093266.jpg" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M01/88/58/wKiom1fwn9OwTolFAACc5kcVoZ8355.jpg-wh_500x0-wm_3-wmp_4-s_326823979.jpg" target="_blank"></a>

<a href="http://s2.51cto.com/wyfs02/M02/88/55/wKioL1fwoNPRGSS8AACYPiM91ew336.jpg-wh_500x0-wm_3-wmp_4-s_1032004030.jpg" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M00/88/58/wKiom1fwoNSCzxjEAACanDnFNn0663.jpg-wh_500x0-wm_3-wmp_4-s_458108147.jpg" target="_blank"></a>

6、在linux上進行測試

<code>[root@mylinux1 conf]</code><code># vi /etc/hosts</code>

<code>[root@mylinux1 conf]</code><code># tail -1 /etc/hosts</code>

<code>192.168.100.121  www.mylinux3.com  www.mylinux4.com</code>

<code>[root@mylinux1 conf]</code><code># for i in {1..10};do curl http://www.mylinux3.com/;done</code>

<code>[root@mylinux1 conf]</code><code># for i in {1..10};do curl http://www.mylinux4.com/;done</code>

<code>[root@mylinux1 conf]</code><code># for i in {1..10};do curl http://192.168.100.121/;done</code>

綜合上述測試結果,隻要是符合mylinux3_dom規則的都會轉發給backend為mylinux3進行展示,也就是mylinux3上的web1和web2,而符合mylinux4_dom規則的都會轉發給backend為mylinux4進行展示,也就是mylinux4上的web3和web4。

五、haproxy的301跳轉

1、修改haproxy配置檔案

這裡隻修改frontend段,是以就把修改部分粘貼出來,其他的和上面的保持一緻。

frontend web

         bind 192.168.100.121:80

         acl mylinux3_dom hdr(host) -i www.mylinux3.com

         acl mylinux4_dom hdr(host) -i www.mylinux4.com

         acl mylinux_dom hdr(host) -i www.mylinux.com

         redirect prefix http://www.baidu.com code 301 if mylinux_dom

         use_backend mylinux3 if mylinux3_dom

         use_backend mylinux4 if mylinux4_dom 

         default_backend mylinux3

2、修改windows配置檔案

3、測試配置結果

<a href="http://s4.51cto.com/wyfs02/M02/88/58/wKiom1fwpg3SZznlAAD7_XW-e-k238.jpg-wh_500x0-wm_3-wmp_4-s_1015410847.jpg" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M02/88/58/wKiom1fwphDhg6nHAAGDwggCa-4373.jpg-wh_500x0-wm_3-wmp_4-s_750477675.jpg" target="_blank"></a>

可以看到,已經成功的跳轉到百度的界面了。

六、haproxy動靜分離

1、web伺服器建立相應目錄

<code>[root@mylinux3 conf]</code><code># mkdir /var/www/html/web1/php</code>

<code>[root@mylinux3 conf]</code><code># echo "php on web1" &gt;&gt;/var/www/html/web1/php/index.html</code>

<code>[root@mylinux3 conf]</code><code># mkdir /var/www/html/web2/php</code>

<code>[root@mylinux3 conf]</code><code># echo "php on web2" &gt;&gt;/var/www/html/web2/php/index.html</code>

<code>[root@mylinux3 conf]</code><code># curl http://192.168.100.181:8001/php/</code>

<code>php on web1</code>

<code>[root@mylinux3 conf]</code><code># curl http://192.168.100.181:8002/php/</code>

<code>php on web2</code>

<code>[root@mylinux4 conf]</code><code># mkdir /var/www/html/web3/java</code>

<code>[root@mylinux4 conf]</code><code># echo "java on web3" &gt;&gt;/var/www/html/web3/java/index.html</code>

<code>[root@mylinux4 conf]</code><code># mkdir /var/www/html/web4/java</code>

<code>[root@mylinux4 conf]</code><code># echo "java on web4" &gt;&gt;/var/www/html/web4/java/index.html</code>

<code>[root@mylinux4 conf]</code><code># curl http://192.168.100.182:8001/java/</code>

<code>java on web3</code>

<code>[root@mylinux4 conf]</code><code># curl http://192.168.100.182:8002/java/</code>

<code>java on web4</code>

         #acl mylinux3_dom hdr(host) -i www.mylinux3.com

         #acl mylinux4_dom hdr(host) -i www.mylinux4.com

         #acl mylinux_dom hdr(host) -i www.mylinux.com

         #redirect prefix http://www.baidu.com code 301 if mylinux_dom

         #use_backend mylinux3 if mylinux3_dom

         #use_backend mylinux4 if mylinux4_dom 

         #default_backend mylinux3

         acl  web_php   path_beg  /php/ 

         acl  web_java  path   /java/

         acl  web_static path  /

         use_backend  mylinux3  if web_php #通路路徑中包含php的就轉給mylinux3後端作用域,這裡是模仿動态php内容轉發

         use_backend  mylinux4  if web_java #通路路徑中包含java的就轉給mylinux4後端作用域,這裡是模仿動态java内容轉發

         default_backend web80  #預設情況下轉給web80後端作用域,相當于靜态内容

backend  mylinux3

         balance  leastconn

         option   httpclose

         option   forwardfor

         server   web1  192.168.100.181:8001 check port 8001 inter 2000 fall 1

         server   web2  192.168.100.181:8002 check port 8002 inter 2000 fall 1

backend  mylinux4

         balance  roundrobin

         option   redispatch

         #option   httpchk  /index.html HTTP/1.0

         server   web1  192.168.100.182:8001 check port 8001 inter 1000 fall 2

         server   web2  192.168.100.182:8002 check port 8002 inter 1000 fall 2

backend  web80

         server   web1  192.168.100.181:80  check port 80 inter 2000 fall 3

         server   web2  192.168.100.182:80  check port 80 inter 2000 fall 3

4、測試通路結果

<code>[root@mylinux1 conf]</code><code># curl http://192.168.100.121/</code>

<code>[root@mylinux1 conf]</code><code># curl http://192.168.100.121/php/</code>

<code>[root@mylinux1 conf]</code><code># curl http://192.168.100.121/java/</code>

這樣就實作了網站動态内容和靜态内容的分離,預設情況下是靜态内容,如果是php則通路存在php的後端作用域,如果是java則通路java内容放置的後端作用域。

另外,也可以基于擴充名進行轉發,隻要是靜态的内容,如.html/.jpg./png/.txt等統一做跳轉,而動态内容,如.php/.java等統一做跳轉,配置的格式如下:

acl  web_pic   path_end  .gif .jpg .png .bmp

acl  web_dynamic  path_end   .java .php .js 

use_backend pic if web_pic

use_backend dynamic if web_dynamic

七、基于用戶端進行7層跳轉

很多網站都有基于通路用戶端進行展示對應頁面的功能,比如PC通路是www.***.com,安卓手機通路是android.***.com,IPhone通路是iphone.***.com,這樣的效果很多是通過代碼實作的,但實際上haproxy就能實作類似的功能。

修改配置檔案,添加如下内容:

acl iphone_users hdr_sub(user-agent) -i iphone

acl android_users hdr_sub(user-agent) -i android

這裡因為限制,無法進行測試,是以就不再補圖說明了。但是需要注意一點,user-agent裝置類型可以到web伺服器日志中檢視,需要檢查是否iPhone裝置的類型都是iphone,比如iphone5,iphone6,ipad都進行通路,然後檢視日志,找出對應的裝置類型,要根據日志中的裝置類型進行設定,以免出現裝置通路的頁面出現不比對裝置的情況。

八、haproxy設定通路控制

1、修改配置檔案,添加下面黃色部分内容

         acl  web_php   path_beg  /php/

         acl  valid_ip  src  172.16.100.0/24

         http-request deny if !valid_ip  #在之前的版本中時block if !valid_ip,現在換為http-request deny,功能是一樣的

         use_backend  mylinux3  if web_php

         use_backend  mylinux4  if web_java

         default_backend web80

2、重新開機haproxy服務

3、測試結果

<a href="http://s5.51cto.com/wyfs02/M02/88/58/wKiom1fwuBnC7IMCAAEchlW8Cp8875.jpg-wh_500x0-wm_3-wmp_4-s_355389213.jpg" target="_blank"></a>

Windows用戶端沒有172.16.100.0/24段的IP位址,是以通路拒絕。

這個功能可以用來提供一個内部測試的站點,然後隻允許内部IP通路,其他外部通路統統拒絕,也是一個不錯的測試方式。

本文轉自 jerry1111111 51CTO部落格,原文連結:http://blog.51cto.com/jerry12356/1858396,如需轉載請自行聯系原作者