? ? HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高性能性、負載均衡,以及基于TCP和HTTP的應用程序代理。相較與 Nginx,HAProxy 更專注與反向代理,因此它可以支持更多的選項,更精細的控制,更多的健康狀態檢測機制和負載均衡算法。
? ? HAProxy特別適用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的并發連接。并且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
???包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter在內眾多知名網站,及亞馬遜網絡服務系統都使用了HAProxy。
?
Haproxy的特性:
1、可靠性與穩定性都非常出色,可與硬件級設備媲美。
2、支持連接拒絕,可以用于防止DDoS***
3、支持長連接、短連接和日志功能,可根據需要靈活配置
4、路由HTTP請求到后端服務器,基于cookie作會話綁定;同時支持通過獲取指定的url來檢測后端服務器的狀態
5、HAProxy還擁有功能強大的ACL支持,可靈活配置路由功能,實現動靜分離,在架構設計與實現上帶來很大方便
6、可支持四層和七層負載均衡,幾乎能為所有服務常見的提供負載均衡功能
7、擁有功能強大的后端服務器的狀態監控web頁面,可以實時了解設備的運行狀態,還可實現設備上下線等簡單操作。
8、支持多種負載均衡調度算法,并且也支持session保持。
有關keepalived請參看博客:http://13150617.blog.51cto.com/13140617/1979652?
實驗:實現基于Haproxy+Keepalived負載均衡高可用架構
1、準備四臺機器:兩臺用于haproxy主從架構,兩臺作為后端server
? ? ? ? ? ?haproxy-master:兩塊網卡,橋接模式和僅主機模式都有
? ? ? ? ? ? ? ? ? ? ?VIP:172.17.111.10
? ? ? ? ? ?haproxy-backup:兩塊網卡,橋接模式和僅主機模式都有
? ? ? ? ? ? ? ? ? ? ?VIP:172.17.111.10
? ? ? ? ? ?后端server1:僅主機網卡:RIP:192.168.199.146
? ? ? ? ? ?后端server2:僅主機網卡:RIP:192.168.199.143
2、在haproxy-master上操作
①安裝keepalived,配置keepalived。
具體參數含義請參看博客:http://13150617.blog.51cto.com/13140617/1979652
vim /etc/keepalived/keepalived.conf????
! Configuration File for keepalived
?global_defs {? ?
???notification_email {?
?????root@localhost??
???}
???notification_email_from Alexandre.Cassen@firewall.loc
???smtp_server 127.0.0.1???
???smtp_connect_timeout 2?
???router_id LVS_DEVEL2????
}
vrrp_instance VI_1 {
????state MASTER
????interface eth0
????virtual_router_id 33
# ???nopreempt
????priority 100
????advert_int 1
?authentication {
????????auth_type PASS
????????auth_pass 111111
????}
????virtual_ipaddress {
????????172.17.111.10
????}
}
systemctl start keepalived ?啟動服務
?
②配置日志服務
vim /etc/rsyslog.conf
? ? ? $ModLoad imudp ????開啟UDP的日志服務,也可以開啟TCP
???? $UDPServerRun 514 ?
? ? ? local2.* /var/log/haproxy.log ?定義日志標準
systemctl restart rsyslog??重啟日志服務
③配置haproxy
vim /etc/haproxy/haproxy.cfg
??global? ? ? ? ? ? ? ? ? ? ? 全局配置 ???
????log ? ? ? ?127.0.0.1 local2 ? 日志類型
????chroot ? ? ?/var/lib/haproxy??修改haproxy的工作目錄
????pidfile ? ? /var/run/haproxy.pid 進程id
????maxconn ? ? ?4000????? ??最大連接數
????user ? ? ? ?haproxy? ? ? ? 運行用戶
????group ? ? ? haproxy? ? ? ??所屬組
????daemon? ? ? ? ? ? ? ? ? ?讓haproxy以守護進程的方式工作
????stats socket /var/lib/haproxy/stats可開啟一個unix socket管理接口
??
defaults
????mode ? ? ? ? ? ? ?http??實現http的7層規則
????log ? ? ? ? ? ? ? global?日志定義,沿用global的日志定義
????option ? ? ? ? ? ? httplog?啟用日志記錄HTTP請求
????option ? ? ? ? ? ? dontlognull?日志中將不會記錄空連接
????option http-server-close? ? ??強制短連接
????option forwardfor ? ? except 127.0.0.0/8?添加xforward日志標記
????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 stats???定義一個統計報告服務
????????mode http #基于http協議
????????bind 0.0.0.0:1080 #監聽1080端口
????????stats enable #開啟統計報告服務
????????stats hide-version #隱藏統計報告版本信息
????????stats uri /haproxyadmin #統計報告訪問url
????????stats realm Haproxy\ Statistics #頁面登陸信息
????????stats auth admin:admin #驗證賬號信息
????????stats admin if TRUE #驗證模式
?
frontend ?http-in???定義一系列監聽的套接字
????bind *:80
????default_backend ? ? ?app
?
backend app????定義一系列“后端”服務器
????balance ?roundrobin
????option ?httpchk /index.php???檢查頁面
????server ?app1 192.168.199.146:80 check inter 3000 rise 3 fall 3
????server ?app2 192.168.199.143:80 check inter 3000 rise 3 fall 3
?
systemctl start haproxy???啟動haproxy服務
?
④開啟轉發
???echo 1 > /proc/sys/net/ipv4/ip_forward
?
3、在haproxy-backup上操作
?①安裝keepalived,配置keepalived
? ?vim /etc/keepalived/keepalived.conf
? ?配置基本同上,只需要修改state的狀態為BACKUP
??systemctl start keepalived 啟動服務
?②配置日志服務
???完全同上
?③配置haproxy
???完全同上
?④開啟轉發
???echo 1 > /proc/sys/net/ipv4/ip_forward
?
4、測試keepalived高可用:當主服務器正常工作時,VIP在主服務器上,當關閉主服務器的keepalived服務,VIP會漂移到從服務器上,而且網站照常可以訪問
關閉主服務器后IP漂移:
?
測試haproxy:
訪問:http://172.17.111.10:1080/haproxyadmin 查看統計報告,都正常
?
實驗二、通過ACL指定可訪問的用戶
在frontend中加入
? ? acl myhost src 172.16.100.1 ?指定可訪問的ip
? ? acl myport dst_port 80 ? ? 指定目標端口
? ? block if ! myhost myport ? 拒絕其他主機訪問
重啟haproxy服務:systemctl restart haproxy
測試:在添加此acl之前,其他主機可以訪問
?????添加此acl之后就不能訪問了
實驗三、根據用戶訪問內容實現動靜分離
在frontend中加入
? ? ?acl url_static ?path_beg ?-i /data /p_w_picpaths /javascript /stylesheets /themes?匹配開頭
????acl url_static ?path_end ?-i .jpg .gif .png .css .js .jpeg?匹配后綴
????use_backend static ? if url_static? 如果符合條件就匹配到static中所定義的服務器?
backend static ?定義“后端”服務器
? ? ?balance ????roundrobin ? 輪詢
? ? ?server ?static1 192.168.199.146:80 check ? ?
? ? ?server ?static2 192.168.199.143:80 check
重啟haproxy服務:systemctl restart haproxy
效果:所有的圖片等靜態頁面就會被分配到這兩個server里
實驗四、實現真實日志記錄
defaults里添加
? ? ?option forwardfor except 127.0.0.0/8
那么查看nginx的日志就會看到訪問該服務器的真實的客戶端IP?
?
實驗五、實現會話保持
在backend中的server中插入cookie,比如
?server ?app1 192.168.199.146:80 cookie haha check inter 3000 rise 3 fall 3
?server ?app2 192.168.199.143:80 cookie hehe check inter 3000 rise 3 fall 3?
????那么訪問過app1服務器的主機就會被標記為haha(在cookie中插入此標記),下次訪問時直接被調度到同一臺機器,但是在到達服務器之前cookie會被清理。如果該服務器宕機了,那么會被重新標記到別的服務器。
感謝瀏覽,如有疑問,歡迎留言。
轉載于:https://blog.51cto.com/13150617/1980419