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

寫在前面

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

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 狀態通告信息外,不執行對外的網絡功能。linux

當主機失效時, BACKUP 將接管原先 MASTER 的網絡功能。VRRP 協議使用多播數據來傳輸 VRRP 數據, VRRP 數據使用特殊的虛擬源 MAC 地址發送數據而不是自身網卡的 MAC 地址, VRRP 運行時只有 MASTER 路由器定時發送 VRRP 通告信息,表示 MASTER 工做正常以及虛擬路由器 IP(組), BACKUP 只接收 VRRP 數據,不發送數據,若是必定時間內沒有接收到 MASTER 的通告信息,各 BACKUP 將宣告本身成爲 MASTER,發送通告信息,從新進行 MASTER 選舉狀態。nginx

方案規劃


操做系統與安裝軟件以下:c++

  • 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-modulegit

使用命令:github

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。web

配置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均是由冰河原創並整理的超硬核教程,面試必備!!

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

寫在最後

若是你以爲冰河寫的還不錯,請微信搜索並關注「 冰河技術 」微信公衆號,跟冰河學習高併發、分佈式、微服務、大數據、互聯網和雲原生技術,「 冰河技術 」微信公衆號更新了大量技術專題,每一篇技術文章乾貨滿滿!很多讀者已經經過閱讀「 冰河技術 」微信公衆號文章,吊打面試官,成功跳槽到大廠;也有很多讀者實現了技術上的飛躍,成爲公司的技術骨幹!若是你也想像他們同樣提高本身的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公衆號吧,天天更新超硬核技術乾貨,讓你對如何提高技術能力再也不迷茫!

相關文章
相關標籤/搜索