項目實戰4—haproxy 負載平衡和ACL控制,haproxyacl
haproxy實現進階負載平衡實戰
環境:隨著公司業務的發展,公司負載平衡服務已經實現四層負載平衡,但業務的複雜程度提升,公司要求把mobile手機網站作為單獨的服務提供,不在和pc網站一起提供服務,此時需要做7層規則負載平衡,營運總監要求,能否用一種服務同既能實現七層負載平衡,又能實現四層負載平衡,並且效能高效,組態管理容易,而且還是開源。
總項目流程圖,詳見 http://www.cnblogs.com/along21/p/7435612.html
Haproxy詳解和相關程式碼片段含義詳見,詳見 http://www.cnblogs.com/along21/p/7899771.html
實驗前準備:
① 兩台伺服器都使用yum 方式安裝haproxy 和 keepalived 服務
yum -y install haproxy
yum -y install keepalived
② iptables -F && setenforing 清空防火牆策略,關閉selinux
實戰一:實現基於Haproxy+Keepalived負載平衡高可用架構1、環境準備:
機器名稱 |
IP配置 |
服務角色 |
備忘 |
haproxy-server-master |
VIP:172.17.100.100 DIP:172.17.1.6 |
負載平衡器 主伺服器 |
配置keepalived |
haproxy-server-backup |
VIP:172.17.100.100 DIP:172.17.11.11 |
負載伺服器 從伺服器 |
配置keepalived |
rs01 |
RIP:172.17.1.7 |
後端伺服器 |
|
rs02 |
RIP:172.17.22.22 |
後端伺服器 |
|
2、先配置好keepalived的主從
(1)在haproxy-server-master 上:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs { notification_email { root@localhost } notification_email_from root@along.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id keepalived_haproxy}vrrp_script chk_haproxy { #定義一個指令碼,發現haproxy服務關閉就降優先順序 script "killall -0 haproxy" interval 2 fall 2 rise 2 weight -4}vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 191 priority 100 advert_int 1 authentication { auth_type PASS auth_pass along } virtual_ipaddress { 172.17.100.100 }track_script { #執行指令碼chk_haproxy}}
service keepalived start 開啟keepalived服務
開啟服務後可以查看,VIP已經產生
(2)在haproxy-server-master 從上:只需把主換成從,優先順序降低就好
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs { notification_email { root@localhost } notification_email_from root@along.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id keepalived_haproxy}vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 191 priority 98 advert_int 1 authentication { auth_type PASS auth_pass along } virtual_ipaddress { 172.17.100.100 }}
service keepalived start 開啟keepalived服務
3、配置haproxy ,總共有兩大段,和第二大段的4小段,兩個haproxy可以配置的一樣
(1)第一大段:global 全域段
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 40000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats
(2)第二大段:proxies 對代理的設定
① defaults 預設參數設定段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 段listen statsbind 0.0.0.0:1080stats enablestats hide-versionstats uri /haproxyadminstats auth along:alongstats admin if TRUE③ frontend 與用戶端建立串連,開啟服務監聽連接埠段frontend webbind :80default_backend lnmp-server④ backend 與後端伺服器聯絡段backend lnmp-server balance roundrobin option httpchk GET /index.html server lnmpserver1 172.17.1.7:80 check inter 3000 rise 3 fall 5 server lnmpserver2 172.17.22.22:80 check inter 3000 rise 3 fall 5
開啟服務 service haproxy start
4、在後端server·開啟事先準備好的web server
systemctl start nginx
systemctl start php-fpm
systemctl start mariadb
5、測試
(1)網頁訪問 http://172.17.100.100:1080/haproxyadmin 進入狀態監控頁面,可以控制自己的後端服務
(2)可以壞2台不是一組的機器
一台後端server宕機,haproxy會調度到另一個server,繼續提供服務
一個主的haproxy宕機,keepalived會把VIP漂移到從上,繼續提供服務
實戰三:基於ACL控制實現動靜分離
原理:acl:存取控制清單,用於實現基於請求報文的首部、響應報文的內容或其它的環境狀態資訊來做出轉寄決策,這大大增強了其配置彈性。其配置法則通常分為兩步,首先去定義ACL ,即定義一個測試條件,而後在條件得到滿足時執行某特定的動作,如阻止請求或轉寄至某特定的後端。
1、環境準備:
機器名稱 |
IP配置 |
服務角色 |
備忘 |
haproxy-server |
172.17.2.7 |
負載平衡器 |
配置keepalived ACL控制 |
rs01 |
RIP:192.168.30.107 |
靜態伺服器 |
小米網頁 |
rs02 |
RIP:192.168.30.7 |
動態伺服器 |
小米網頁 |
2、在haproxy 上定義ACL和後端伺服器
vim /etc/haproxy/haproxy.cfg 前面global 全域段和default 段不用修改
① 定義web 監控頁面listen statsbind 0.0.0.0:1080stats enablestats hide-versionstats uri /haproxyadminstats auth along:alongstats admin if TRUE② 在frontend 段定義ACLfrontend web bind :80 acl staticfile path_end .jpg .png .bmp .htm .html .css .js acl appfile path_end .php use_backend staticsrvs if staticfile default_backend appsrvs③ 設定backend 後端叢集組backend staticsrvs balance roundrobin server staticweb 192.168.30.107:80 check inter 3000 rise 3 fall 3backend appsrvs balance roundrobin server appweb 192.168.30.7:80 check inter 3000 rise 3 fall 3
3、開啟後端web服務
systemctl start nginx
systemctl start php-fpm
systemctl start mariadb
4、測試結果
(1)後端伺服器正常時
web 檢測頁面,一切正常
(2)當後端靜態頁面服務叢集宕機,顯示不出靜態頁面,說明動靜分離成功
實驗四:基於ACL實現許可權控制及會話保持1、環境準備:
機器名稱 |
IP配置 |
服務角色 |
備忘 |
haproxy-server |
172.17.2.7 |
負載平衡器 |
配置keepalived ACL控制 |
rs01 |
RIP:192.168.30.107 |
後端伺服器 |
小米網頁 |
rs02 |
RIP:192.168.30.7 |
後端伺服器 |
小米網頁 |
2、這haproxy 上定義ACL和後端伺服器
vim /etc/haproxy/haproxy.cfg 前面global 全域段和default 段不用修改
① 定義web 監控頁面listen statsbind 0.0.0.0:1080stats enablestats hide-versionstats uri /haproxyadminstats auth along:alongstats admin if TRUE② 在frontend 段定義ACL,使用者權限控制frontend web bind :80 acl allow_src src 172.17.0.0/16 block unless allow_src default_backend appsrvs③ 設定backend 後端叢集組,設定cookie,會話保持backend staticsrvs balance roundrobin cookie SRV insert nocache server appweb1 192.168.30.107:80 check inter 3000 rise 3 fall 3 cookie srv1 server appweb2 192.168.30.7:80 check inter 3000 rise 3 fall 3 cookie srv2
3、開啟後端web服務
systemctl start nginx
systemctl start php-fpm
systemctl start mariadb
4、檢測結果
(1)檢測許可權控制
① 在172.17.0.0 段的機器訪問,正常
② 在這個網段外的機器訪問,拒絕
(2)檢測會話保持
① 分別在兩個後端建立兩個測試頁面
vim ../test.html
server 1/2
② 測試
curl 測試需加-b SRV= 指定的對應cookie訪問
curl -b SRV=srv1 172.17.2.7/test.html
curl -b SRV=srv2 172.17.2.7/test.html
實戰四:實現haproxy的ssl加密1、自簽產生認證
cd /etc/pki/tls/certs
make /etc/haproxy/haproxy.pem
ls /etc/haproxy/haproxy.pem 確實產生了認證和秘鑰的檔案
2、在haproxy 中設定
frontend web bind :80 bind :443 ssl crt /etc/haproxy/haproxy.pem 監聽443連接埠,且是ssl加密 redirect scheme https if !{ ssl_fc } 實現302重新導向,將80跳轉到443連接埠3、網頁訪問 https://172.17.11.11/