1. 程式人生 > >haproxy基於cookie實現會話綁定

haproxy基於cookie實現會話綁定

haproxy

基於cookie實現haproxy的session綁定:
實驗前提:
1.本次實驗在centos7.2的64位系統實現
2.實驗有3臺主機,地址拓撲如下
haproxy代理:192.168.137.216
web1:192.168.137.131
web2:192.168.137.128

   3.測試時請關閉防火墻和selinux以免帶來問題

一:安裝軟件
(1)配置web1
1.1 首先安裝web1服務器上的httpd
yum install httpd -y

      1.2 在web1上httpd根目錄下寫入內容到index.html
          echo "this is web1" >/var/www/html/index.html

      1.3 啟動httpd
          systemctl start httpd.service

(2)配置web2
2.1 安裝web2服務器上的httpd
yum install httpd -y

      2.2 寫入內容到httpd根目錄
          echo "this is web2" > /var/www/html/index.html

      2.3 啟動httpd
          systemctl start httpd.service

(3)配置haproxy
3.1 yum方式安裝haproxy
yum install haproxy -y

      3.2 配置haproxy
       haproxy安裝後會在etc/haproxy目錄下生成haproxy.cfg的配置文件,大多數的配置選項都在這個文件中定義
打開配置文件然後修改零添加下列選項:

        backend webserver
balance     roundrobin
cookie      serverid insert nocache indirect
server      web1 192.168.137.131:80 check cookie webserver1
server      web2 192.168.137.128:80 check cookie webserver2

技術分享圖片

3.3 啟動haproxy
systemctl start haproxy.service

註言:
   在實驗中我使用的cookie的選項是insert,nocache和indirect.這幾個選項的作用不同.
        indirect:
              如果不配合"indirect"選項,服務端可以看到客戶端請求時的所有cookie信息。如果配合"indirect"選項,則haproxy在將請求轉發給後端時,將刪除自己設置的cookie,使得後端只能看到它自己的cookie,這樣對後端來說,整個過程是完全透明的,它不知道前面有負載均衡軟件
           preserve:
              如果insert關鍵字配合"preserve"關鍵字,那麽當後端設置了cookie時,haproxy將強制保留該cookie,不做任何修改。例如在後端服務器上的應用程序也設置了cookie,例如後端的cookie名稱為PHPSESSID,那麽也就是說,如果將haproxy的cookie名稱也設置為PHPSESSID,那麽客戶端第一次請求時收到的響應報文中將只有一個"Set-Cookie"字段,且這個字段的值是後端服務器設置的,和haproxy無關
           ignore-persist:
              其實,通過cookie表保持和後端的會話只是默認情況,haproxy允許"即使使用了cookie也不進行會話綁定"的功能。這可以通過ignore-persist指令來實現。當滿足該指令的要求時,表示不將該cookie插入到cookie表中,因此無法實現會話保持,即使haproxy設置了cookie也沒用。
               例如:
                  backend dynamic_group
                    acl  url_dynamic   path_end  -i .php
                    ignore-persist if  url_dynamic
                    cookie app_cook insert nocache
                    server app1 192.168.100.60:80 cookie app_server1
                    server app2 192.168.100.61:80 cookie app_server2
               這表示當請求uri以".php"結尾時,將忽略會話保持功能。這表示,對於php結尾的請求,app_cook這個cookie從頭到尾都是擺設
                 當然,上面的設置是不合理的,更合理的應該是這樣的
                    acl url_static  path_beg         /static /images /img /css
                    acl url_static  path_end         .gif .png .jpg .css .js
                    ignore-persist  if url_static
               與ignore-persist相對的是force-persist,但不建議使用該選項,因為它和option redispatch沖突

實現的結果截圖:
技術分享圖片

     在其中有cookie首部,值是我剛才設置的webserver1.多次訪問的也都是web1

     ![](http://i2.51cto.com/images/blog/201804/23/37811dba033f582f5c1df1ebbb45d01a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

     此次試驗到此結束!
       如有不當之處請指出,作者會努力修改!

haproxy基於cookie實現會話綁定