1. 程式人生 > 實用技巧 >Nginx+Keepalived實現負載均衡

Nginx+Keepalived實現負載均衡

前言

首先我們說一下整體思路,如圖

每個NGINX都有個自己的IP地址,但是讓他倆來共同輪流使用一個VIP,以便主(MASTER)宕機後備(BACKUP)來接替VIP來繼續提供服務。
這裡我們用四臺虛擬機器,來分別代表NGINX1、NGINX2、WEB1、WEB2,WEB3忽略就好。

準備工作

關閉所有機器的防火牆等安全機制

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0

NGINX測試機安裝keepalived

[root@nginx ~]# yum
-y install keepalived ipvsadm

WEB測試機安裝apache,這裡直接用yum安裝

[root@node ~]# yum -y install httpd

NGINX1配置

首先修改主配置檔案

[root@nginx1 ~]# vim /usr/local/nginx/conf/nginx.conf
**
    http{
    ***略***
    upstream apache_pool {
        server 192.168.200.11:80 weight=1;
        server 192.168.200.112:80 weight=1;
    }
    server {
        
***略*** location / { root html; index index.html index.htm; proxy_pass http://apache_pool; proxy_set_header Host $http_host; } } } **

keepalived配置檔案修改

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 
192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_http_port { script "/check/chk_nginx" #通過此指令碼檢測 interval 2 #執行時間間隔,預設單位秒 weight -20 #指令碼執行成功後降低的優先順序,這裡是-5 fall 2 #檢測兩次失敗後才確定失敗 rise 1 #檢測一次成功即成功 } vrrp_instance VI_1 { state MASTER interface eno16777728 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.254 } track_script { #引用VRRP指令碼,即在 vrrp_script 部分指定的名字。 chk_http_port } }

寫一個檢測NGINX狀態的腳步,如果NGINX出現問題的話,停止keepalived服務,讓出VIP。

[root@nginx ~]# mkdir /check
[root@nginx ~]# vim /check/chk_nginx 
***
#bin/bash

ps -C nginx --no-heading >/dev/null
if [ $? -ne 0 ]
then
        /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
        sleep 2
        ps -C nginx --no-heading >/dev/null
            if [ $? -ne 0 ]
            then
                systemctl stop keepalived
                #killall -9 keepalived
            fi
fi
***
[root@nginx ~]# chmod +x /chech/chk_nginx

NGINX2的配置與1相同,這裡就不做多解釋了

開啟網路服務

[root@node1 ~]# systemctl start httpd

測試

NGINX測試機開啟keepalived服務

[root@nginx ~]# systemctl start keepalived

用網頁檢視


當主動關閉NGINX1服務是,我們可以看到VIP跑到了NGINX2上,因為指令碼的原因,我們可以選擇關閉NGINX1的網絡卡來進行故障測試
首先我們看到2沒有 VIP地址

關閉1的網絡卡後

我們可以看到2上已經獲取到了VIP地址