【Nginx】如何實現Nginx的高可用負載均衡?看完我也會了!!

冰河團隊發表於2020-07-25

寫在前面

不得不說,最近小夥伴們的學習熱情是越來越高,不斷向冰河提出新的想學習的技術。這不,又有小夥伴問我:冰河,你在【Nginx專題】寫的文章基本上都是Nginx單機版的,能不能寫一篇關於Nginx的高可用的文章呢?我:沒問題,安排上!這不,就有了這篇文章!!

Keepalived 簡要介紹

Keepalived 是一種高效能的伺服器高可用或熱備解決方案, Keepalived 可以用來防止伺服器單點故障的發生,通過配合 Nginx 可以實現 web 前端服務的高可用。

Keepalived 以 VRRP 協議為實現基礎,用 VRRP 協議來實現高可用性(HA)。 VRRP(Virtual RouterRedundancy Protocol)協議是用於實現路由器冗餘的協議, VRRP 協議將兩臺或多臺路由器裝置虛擬成一個裝置,對外提供虛擬路由器 IP(一個或多個),而在路由器組內部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER,或者是通過演算法選舉產生, MASTER 實現針對虛擬路由器 IP 的各種網路功能,如 ARP 請求, ICMP,以及資料的轉發等;其他裝置不擁有該虛擬 IP,狀態是 BACKUP,除了接收 MASTER 的VRRP 狀態通告資訊外,不執行對外的網路功能。

當主機失效時, BACKUP 將接管原先 MASTER 的網路功能。VRRP 協議使用多播資料來傳輸 VRRP 資料, VRRP 資料使用特殊的虛擬源 MAC 地址傳送資料而不是自身網路卡的 MAC 地址, VRRP 執行時只有 MASTER 路由器定時傳送 VRRP 通告資訊,表示 MASTER 工作正常以及虛擬路由器 IP(組), BACKUP 只接收 VRRP 資料,不傳送資料,如果一定時間內沒有接收到 MASTER 的通告資訊,各 BACKUP 將宣告自己成為 MASTER,傳送通告資訊,重新進行 MASTER 選舉狀態。

方案規劃


作業系統與安裝軟體如下:

  • CentOS 6.8 x64
  • keepalived-1.2.18.tar.gz
  • nginx-1.19.1.tar.gz

安裝Nginx

1.安裝依賴環境

yum -y install wget gcc-c++ ncurses ncurses-devel cmake make perl bison openssl openssl-devel gcc* libxml2 libxml2-devel curl-devel libjpeg* libpng* freetype* autoconf automake zlib* fiex* libxml* libmcrypt* libtool-ltdl-devel* libaio libaio-devel  bzr libtool

2.安裝openssl

wget https://www.openssl.org/source/openssl-1.0.2s.tar.gz
tar -zxvf openssl-1.0.2s.tar.gz
cd /usr/local/src/openssl-1.0.2s
./config --prefix=/usr/local/openssl-1.0.2s
make
make install

3.安裝pcre

wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar -zxvf pcre-8.43.tar.gz
cd /usr/local/src/pcre-8.43
./configure --prefix=/usr/local/pcre-8.43
make
make install

4.安裝zlib

wget https://sourceforge.net/projects/libpng/files/zlib/1.2.11/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd /usr/local/src/zlib-1.2.11
./configure --prefix=/usr/local/zlib-1.2.11
make
make

5.下載nginx-rtmp-module

nginx-rtmp-module的官方github地址:https://github.com/arut/nginx-rtmp-module

使用命令:

git clone https://github.com/arut/nginx-rtmp-module.git  

6.安裝Nginx

wget http://nginx.org/download/nginx-1.19.1.tar.gz
tar -zxvf nginx-1.19.1.tar.gz
cd /usr/local/src/nginx-1.19.1
./configure --prefix=/usr/local/nginx-1.19.1 --with-openssl=/usr/local/src/openssl-1.0.2s --with-pcre=/usr/local/src/pcre-8.43 --with-zlib=/usr/local/src/zlib-1.2.11 --add-module=/usr/local/src/nginx-rtmp-module --with-http_ssl_module
make
make install

這裡需要注意的是:安裝Nginx時,指定的是openssl、pcre和zlib的原始碼解壓目錄,安裝完成後Nginx配置檔案的完整路徑為:/usr/local/nginx-1.19.1/conf/nginx.conf。

配置Nginx

在命令列輸入如下命令編輯Nginx的nginx.conf檔案,如下所示。

# vim /usr/local/nginx-1.19.1/conf/nginx.conf

編輯後的檔案內容如下所示。

user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
	worker_connections 1024;
}
http {
	include mime.types;
	default_type application/octet-stream;
	#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
	# '$status $body_bytes_sent "$http_referer" '
	# '"$http_user_agent" "$http_x_forwarded_for"';
	#access_log logs/access.log main;
	sendfile on;
	#tcp_nopush on;
	#keepalive_timeout 0;
	keepalive_timeout 65;
	#gzip on;
	server {
		listen 88;
		server_name localhost;
		#charset koi8-r;
		#access_log logs/host.access.log main;
		location / {
			root html;
			index index.html index.htm;
		}
		#error_page 404 /404.html;
		# redirect server error pages to the static page /50x.html
		error_page 500 502 503 504 /50x.html;
		location = /50x.html {
			root html;
		}
	}
}

修改 Nginx 歡迎首頁內容(用於後面測試, 用於區分兩個節點的 Nginx):

在binghe133伺服器上執行如下操作。

# vim /usr/local/nginx-1.19.1/html/index.html

在檔案title節點下新增如下程式碼。

<h1>Welcome to nginx! 1</h1>

在binghe134伺服器上執行如下操作。

# vim /usr/local/nginx-1.19.1/html/index.html

在檔案title節點下新增如下程式碼。

<h1>Welcome to nginx! 2</h1>

開放埠

在伺服器的防火牆中開放88埠,如下所示。

vim /etc/sysconfig/iptables

新增如下配置。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 88 -j ACCEPT

接下來,輸入如下命令重啟防火牆。

service iptables restart

測試Nginx

測試Nginx是否安裝成功

# /usr/local/nginx-1.19.1/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.19.1/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.19.1/conf/nginx.conf test is successful

啟動Nginx

# /usr/local/nginx-1.19.1/sbin/nginx

重啟 Nginx

# /usr/local/nginx-1.19.1/sbin/nginx -s reload

設定Nginx開機自啟動

# vim /etc/rc.local

加入如下一行配置。

/usr/local/nginx-1.19.1/sbin/nginx

接下來,分別訪問兩臺伺服器上Nginx,如下所示。

安裝 Keepalived

官方下載連結為:http://www.keepalived.org/download.html

上傳或下載 keepalived

上傳或下載 keepalived(keepalived-1.2.18.tar.gz) 到 /usr/local/src 目錄

解壓安裝

# cd /usr/local/src
# tar -zxvf keepalived-1.2.18.tar.gz
# cd keepalived-1.2.18
# ./configure --prefix=/usr/local/keepalived
# make && make install

將 keepalived 安裝成 Linux 系統服務

因為沒有使用 keepalived 的預設路徑安裝(預設是/usr/local) ,安裝完成之後,需要做一些工作複製預設配置檔案到預設路徑

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

複製 keepalived 服務指令碼到預設的地址

# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# ln -s /usr/local/sbin/keepalived /usr/sbin/
# ln -s /usr/local/keepalived/sbin/keepalived /sbin/

設定 keepalived 服務開機啟動。

# chkconfig keepalived on

修改 Keepalived 配置檔案

MASTER 節點配置檔案(192.168.50.133)

# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
	## keepalived 自帶的郵件提醒需要開啟 sendmail 服務。 建議用獨立的監控或第三方 SMTP
	router_id binghe133 ## 標識本節點的字條串,通常為 hostname
} 
## keepalived 會定時執行指令碼並對指令碼執行的結果進行分析,動態調整 vrrp_instance 的優先順序。如果指令碼執行結果為 0,並且 weight 配置的值大於 0,則優先順序相應的增加。如果指令碼執行結果非 0,並且 weight配置的值小於 0,則優先順序相應的減少。其他情況,維持原本配置的優先順序,即配置檔案中 priority 對應的值。
vrrp_script chk_nginx {
	script "/etc/keepalived/nginx_check.sh" ## 檢測 nginx 狀態的指令碼路徑
	interval 2 ## 檢測時間間隔
	weight -20 ## 如果條件成立,權重-20
}
## 定義虛擬路由, VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
	state MASTER ## 主節點為 MASTER, 對應的備份節點為 BACKUP
	interface eth0 ## 繫結虛擬 IP 的網路介面,與本機 IP 地址所在的網路介面相同, 我的是 eth0
	virtual_router_id 33 ## 虛擬路由的 ID 號, 兩個節點設定必須一樣, 可選 IP 最後一段使用, 相同的 VRID 為一個組,他將決定多播的 MAC 地址
	mcast_src_ip 192.168.50.133 ## 本機 IP 地址
	priority 100 ## 節點優先順序, 值範圍 0-254, MASTER 要比 BACKUP 高
	nopreempt ## 優先順序高的設定 nopreempt 解決異常恢復後再次搶佔的問題
	advert_int 1 ## 組播資訊傳送間隔,兩個節點設定必須一樣, 預設 1s
	## 設定驗證資訊,兩個節點必須一致
	authentication {
		auth_type PASS
		auth_pass 1111 ## 真實生產,按需求對應該過來
	}
	## 將 track_script 塊加入 instance 配置塊
	track_script {
		chk_nginx ## 執行 Nginx 監控的服務
	} #
	# 虛擬 IP 池, 兩個節點設定必須一樣
	virtual_ipaddress {
		192.168.50.130 ## 虛擬 ip,可以定義多個
	}
}

BACKUP 節點配置檔案(192.168.50.134)

# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
	router_id binghe134
}
vrrp_script chk_nginx {
	script "/etc/keepalived/nginx_check.sh"
	interval 2
	weight -20
}
vrrp_instance VI_1 {
	state BACKUP
	interface eth1
	virtual_router_id 33
	mcast_src_ip 192.168.50.134
	priority 90
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 1111
	}
	track_script {
		chk_nginx
	}
	virtual_ipaddress {
		192.168.50.130
	}
}

編寫 Nginx 狀態檢測指令碼

編寫 Nginx 狀態檢測指令碼 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)指令碼要求:如果 nginx 停止執行,嘗試啟動,如果無法啟動則殺死本機的 keepalived 程式, keepalied將虛擬 ip 繫結到 BACKUP 機器上。 內容如下。

# vim /etc/keepalived/nginx_check.sh

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
	killall keepalived
fi
fi

儲存後,給指令碼賦執行許可權:

# chmod +x /etc/keepalived/nginx_check.sh

啟動 Keepalived

# service keepalived start
Starting keepalived: [ OK ]

Keepalived+Nginx 的高可用測試

同時啟動192.168.50.133和192.168.50.134上的Nginx和Keepalived,我們通過VIP(192.168.50.130)來訪問Nginx,如下所示。

我們關閉192.168.50.133上的Keepalived和Nginx,在192.168.50.133執行如下命令。

service keepalived stop
/usr/local/nginx-1.19.1/sbin/nginx -s stop

此時,再通過VIP(192.168.50.130)來訪問Nginx,如下所示。

我們再開啟192.168.50.133上的Keepalived和Nginx,在192.168.50.133執行如下命令:

/usr/local/nginx-1.19.1/sbin/nginx
service keepalived start

或者只執行

service keepalived start

因為我們寫了指令碼nginx_check.sh,這個指令碼會為我們自動自動Nginx。

此時,我們再通過VIP(192.168.50.130)來訪問Nginx,如下所示。

至此,Keepalived + Nginx 實現高可用 Web 負載均衡搭建完畢。

溫馨提示

小夥伴們可以到下面的連結下載Keepalived + Nginx 實現高可用 Web 負載均衡的配置檔案。

http://download.csdn.net/detail/l1028386804/9855362

重磅福利

關注「 冰河技術 」微信公眾號,後臺回覆 “設計模式” 關鍵字領取《深入淺出Java 23種設計模式》PDF文件。回覆“Java8”關鍵字領取《Java8新特性教程》PDF文件。兩本PDF均是由冰河原創並整理的超硬核教程,面試必備!!

好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!

寫在最後

如果你覺得冰河寫的還不錯,請微信搜尋並關注「 冰河技術 」微信公眾號,跟冰河學習高併發、分散式、微服務、大資料、網際網路和雲原生技術,「 冰河技術 」微信公眾號更新了大量技術專題,每一篇技術文章乾貨滿滿!不少讀者已經通過閱讀「 冰河技術 」微信公眾號文章,吊打面試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成為公司的技術骨幹!如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公眾號吧,每天更新超硬核技術乾貨,讓你對如何提升技術能力不再迷茫!

相關文章