前言
我們這次使用HAProxy作為負載均衡調度器來實現后端httpd服務的負載均衡和動靜分離,實現將來自用戶的80端口的http請求轉發只后端8080端口的server服務
HAProxy介紹
HAProxy的是一個免費的,非??焖俸涂煽康慕鉀Q方案,提供高可用性,負載均衡和代理對TCP和HTTP的應用程序。它特別適用于非常高流量網站。多年來,它已成為標準的開源的負載均衡程序,現在隨最主流的Linux發行版,并且通常默認的云平臺部署。其運作模式使得其集成到現有的架構非常容易,無風險,同時還提供了可能性不暴露脆弱的Web服務器到網絡
實驗拓撲
實驗環境
VIP1: 192.168.31.6
主機 | IP | 功用 |
---|---|---|
C7node1 | 192.168.31.21, VIP | HAproxy, KeepAlived |
C7node2 | 192.168.31.22, VIP | HAproxy, KeepAlived |
C7node3 | 192.168.31.23 | httpd, php 動態資源 |
C7node4 | 192.168.31.24 | nginx, 靜態資源 |
注意: 本文實驗中所有主機SElinux和iptables都是關閉的, 系統為:CentOS 7.2 x86_64
實驗步驟
配置后端httpd服務器
node4 靜態服務器,靜態資源 [root@c7node4 ~]# yum -y install nginx #安裝nginx服務器 [root@c7node4 ~]# vim /etc/nginx/nginx.conf #編輯nginx配置文件,修改堅挺端口 server { listen 8080 default_server; #由80改為8080端口 server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } [root@c7node4 ~]# echo '<h1> Jingtai server 192.168.31.24:8080</h1>' > /usr/share/nginx/html/index.html [root@c7node4 ~]# cp /usr/share/backgrounds/*.jpg /usr/share/nginx/html/ #復制一些圖片文件到網站根目錄做測試 [root@c7node4 ~]# systemctl start nginx.service
node3 動態服務器,動態資源 [root@c7node3 ~]#yum install httpd php #安裝httpd,php [root@c7node3 ~]#vim /etc/httpd/conf/httpd.conf #修改配置文件,更改監聽端口8080 ServerRoot "/etc/httpd" # # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the <VirtualHost> # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # #Listen 12.34.56.78:80 Listen 8080 [root@c7node3 ~]# systemctl start httpd.service #啟動httpd服務 [root@c7node3 ~]#cat >> /var/www/html/index.php << "EOF" #創建網頁文件 ><h1>Dongtai server 192.168.31.23:8080</h1> ><img src="/morning.jpg"/> #我們動態的網頁目錄下并沒有這張圖片 ><?php >phpinfo(); >?> >EOF
配置HAProxy實現backend負載均衡
[root@c7node1 ~]# yum install -y haproxy #安裝haproxy [root@c7node1 ~]# vim /etc/haproxy/haproxy.cfg #配置文件如下 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 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main *:80 stats enable stats hide-version stats uri /haproxyadm acl url_static path_end -i .jpg .gif .png .css .js .html default_backend dongtai use_backend static if url_static #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend static balance roundrobin server static 192.168.31.24:8080 check #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend dongtai balance roundrobin server dongtai 192.168.31.23:8080 check [root@c7node1 ~]#systemctl start haproxy.service
測試動靜分離效果
我們訪問 192.168.31.21 這個是haproxy服務器IP地址
我們關閉 192.168.31.24 這個靜態服務器nginx服務后結果 [root@c7node4 ~]# systemctl stop nginx.service
我們再次開啟192.168.31.24 這個靜態服務器nginx服務后,圖片顯示正常 [root@c7node4 ~]# systemctl start nginx.service 我們打開了stats頁面, 可以通過設置的URI進行訪問
配置keepalived
配置c7node1上keepalived的配置文件 [root@c7node4 ~]#vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from zhong@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER #配置為主節點 interface eno16777736 virtual_router_id 51 priority 100 #主節點的權重 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.31.6 dev eno16777736 label eno16777736:0 #虛擬vIP } } [root@c7node4 ~]#systemctl start keepalived.service [root@c7node4 ~]#ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:13:c2:04 brd ff:ff:ff:ff:ff:ff inet 192.168.31.21/24 brd 192.168.31.255 scope global eno16777736 valid_lft forever preferred_lft forever inet 192.168.31.6/32 scope global eno16777736:0 #虛擬VIP,已經配置上了 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe13:c204/64 scope link valid_lft forever preferred_lft forever #配置c7node2上的keepalived配置文件# [root@c7node2 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from zhong@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP #備節點 interface eno16777736 virtual_router_id 52 priority 95 #權重,應該小于主節點 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.31.6 dev eno16777736 label eno16777736:0 } } [root@c7node2 ~]# systemctl start keepalived.service [root@c7node2 ~]# ip addr #發現虛擬VIP沒有在備用節點上啟用 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:60:20:b7 brd ff:ff:ff:ff:ff:ff inet 192.168.31.22/24 brd 192.168.31.255 scope global eno16777736 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe60:20b7/64 scope link valid_lft forever preferred_lft forever
最終測試
直接訪問192.168.31.6 此時VIP在C7node1上面
將C7node1上面的keepalived停止,VIP自動轉移到C7node2上面,
總結
我們輕松地通過HAProxy實現資源的動靜分離和后端httpd主機的負載均衡,也通過KeepAlived實現HAProxy的高可用, 對于一個集群架構來說,整套架構還不算是很完整的。比如,在keepalived上面沒有做后端主機健康檢查;后端還沒有配置varnish緩存服務器。這些知識還需要在后續的學習中繼續來實踐。
原創文章,作者:N25_木頭鐘,如若轉載,請注明出處:http://www.www58058.com/63371
贊~ keepalived 中的其中一個配置參數 virtual_router_id 需要注意下~~繼續加油~