Nginx雙機主備(Keepalived實現)

前言

首先介紹一下Keepalived,它是一個高性能的服務器高可用或熱備解決方案,起初是專爲LVS負載均衡軟件設計的,Keepalived主要來防止服務器單點故障的發生問題,能夠經過其與Nginx的配合實現web服務端的高可用。html

Keepalived以VRRP協議爲實現基礎,VRRP是Virtual Router Redundancy Protocol(虛擬路由冗餘協議)的縮寫,VRRP協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP(一個或多個)。前端

VRRP出現的目的就是爲了解決靜態路由的單點故障問題的,它能保證當個別節點宕機時,整個網絡能夠不間斷地運行。java

下面咱們介紹一下nginx keepalived高可用方案的部署安裝。nginx

環境準備

在兩臺主機上準備以下壓縮文件:c++

  • keepalived-2.0.20.tar.gz
  • nginx-1.16.1.tar.gz

虛擬IPweb

真實IPsql

nginx端口vim

主從centos

192.168.124.20瀏覽器

192.168.124.13

80

MASTER

192.168.124.20

192.168.124.14

80

BACKUP

安裝nginx

file新建一個用戶:

useradd tianyan

肯定安裝目錄,我這裏的安裝目錄是:/home/tianyan/tianyan_soft/nginx.install。

在這個目錄下分別新建兩個目錄用於安裝nginx和keepalived,解壓兩個壓縮包。

執行安裝命令:

./configure --prefix=/home/tianyan/tianyan_soft/nginx.install \
--sbin-path=/home/tianyan/tianyan_soft/nginx.install/sbin/nginx --conf-path=/home/tianyan/tianyan_soft/nginx.install/conf/nginx.conf \
--error-log-path=/home/tianyan/tianyan_soft/nginx.install/error.log \
--http-log-path=/home/tianyan/tianyan_soft/nginx.install/access.log \
--pid-path=/home/tianyan/tianyan_soft/nginx.install/nginx.pid \
--lock-path=/home/tianyan/tianyan_soft/nginx.install/nginx.lock \
--user=tianyan --group=tianyan \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-threads  \
--with-pcre \
--http-client-body-temp-path=/home/tianyan/tianyan_soft/nginx.install/client/  \
--http-proxy-temp-path=/home/tianyan/tianyan_soft/nginx.install/proxy/ \
 --http-fastcgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/fcgi/  \
--http-uwsgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/uwsgi  \
--http-scgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/scgi

若是報錯,記得安裝相關依賴:

yum install gcc gcc-c++
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)。

注:以非root權限啓動時,會出現 nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) 錯誤。

緣由:Linux只有root用戶能夠使用1024一下的端口

解決辦法:

  • 1.按照root權限啓動
  • 2.將 /usr/local/nginx/conf/nginx.conf 文件中的80端口改成1024以上。

安裝keepalived

./configure --prefix=/usr/local/keepalived

上述命令執行完畢後繼續執行:

make && make install

安裝完畢後,目錄是這個樣子:

file

將配置文件拷貝到系統對應的目錄下

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived

編輯 master 節點的 keepalived.conf

vim /etc/keepalived/keepalived.conf

內容參考以下:

! Configuration File for keepalived

global_defs {
    #一個沒重複的名字便可
    router_id hyq_slave
   }


#ng是否運行
vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight -20
}

vrrp_instance VI_1 {
    state BACKUP      #  必填,能夠是MASTER或BACKUP

    interface ens33
    virtual_router_id 101
    priority 90
    advert_int 1

    # 若是兩節點的上聯交換機禁用了組播,則採用vrrp單播通告的方式
    # 本機ip
    unicast_src_ip 192.168.124.14
    unicast_peer {
        # 其餘機器ip
        192.168.124.13
    }
    # 設置nopreempt防止搶佔資源
    nopreempt

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 與上方nginx運行情況檢測呼應
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.124.20
    }
}

編輯 slave 節點的 keepalived.conf

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    #一個沒重複的名字便可
    router_id hyq_slave
   }


#ng是否運行
vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight -20
}

vrrp_instance VI_1 {
    state BACKUP      #  必填,能夠是MASTER或BACKUP   


    interface ens33
    virtual_router_id 101
    priority 90
    advert_int 1

    # 若是兩節點的上聯交換機禁用了組播,則採用vrrp單播通告的方式
    # 本機ip
    unicast_src_ip 192.168.124.14
    unicast_peer {
        # 其餘機器ip
        192.168.124.13
    }
    # 設置nopreempt防止搶佔資源
    nopreempt

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 與上方nginx運行情況檢測呼應
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.124.20
    }
}

編寫nginx_check.sh腳本

在/etc/keepalived目錄下新建nginx_check.sh腳本

touch nginx_check.sh

編輯其內容爲:

#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
then
  /usr/sbin/nginx
  sleep 1
  A2=`ps -C nginx --no-header |wc -l`
  if [ $A2 -eq 0 ]
  then
    systemctl stop keepalived
  fi
fi

含義是:若是 nginx 中止運行,嘗試啓動,可是若是沒法啓動,則殺死本機的 keepalived 進程, keepalied將會把虛擬 ip 綁定到 BACKUP 機器上。 注意: /usr/sbin/nginx是nginx的啓動命令,若是你安裝到其餘目錄,則相應的替換。

Keepalived的日誌

Keepalived日誌默認位置是在/var/log/messages目錄下。咱們將其修改一下。

因爲系統是centos7,修改位置爲:/lib/systemd/system/keepalived.service

原內容:

EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS

修改成:

file

修改完畢後從新加載service

systemctl daemon-reload

建立命令軟鏈接:

ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

執行:

keepalived -D -f /etc/keepalived/keepalived.conf
-D   將日誌輸出到message日誌,默認日誌也在message
-f    是指定配置文件

修改/etc/sysconfig/keepalived

把KEEPALIVED_OPTIONS="-D" 修改成:KEEPALIVED_OPTIONS="-D -d -S 0"

file

在/etc/rsyslog.conf 末尾添加

local0.*                                                /var/log/keepalived.log

file

最後執行命令:

service rsyslog restart

重啓keepalived後就能夠看到日誌在/var/log/keepalived.log下了。

測試驗證VIP

當keepalived和nginx都啓動後,咱們來測試一下。

首先在瀏覽器裏面訪問三個地址

我修改了一下nginx的index.html,能夠看到當前vip指向是13的master節點:

file

而後,咱們手動中止13上的nginx,再次訪問http://192.168.124.20。

file

說明安裝成功。

其中經過ip address命令能夠觀察到網卡的變化file

實驗到這裏,咱們就完成了keepalived + nginx 主從配置的安裝部署了。

思考:如何開啓雙主模式

什麼是雙主模式?

分別介紹一下兩種配置

一、Nginx+keepalived 主從配置

file

這種方案就是上文介紹過的,使用一個vip地址,前端使用2臺機器,一臺作主,一臺作備,但同時只有一臺機器工做,另外一臺備份機器在主機器不出現故障的時候,永遠處於浪費狀態,僅僅用於災備,平時都是空閒着的。

二、Nginx+keepalived 雙主配置

這種方案,使用兩個vip地址,前端使用2臺機器,互爲主備,同時有兩臺機器工做,當其中一臺機器出現故障,兩臺機器的請求轉移到一臺機器負擔,以下圖:

file

【實戰】 elasticsearch 寫入速度提高的案例分享

用java作一個能賺錢的微信羣聊機器人(PC協議)

Mysql百萬量級數據高效導入Redis

java線上故障分析+性能調優

相關文章
相關標籤/搜索