【Nginx】如何實現Nginx的高可用負載均衡?看完我也會了!!
寫在前面
不得不說,最近小夥伴們的學習熱情是越來越高,不斷向冰河提出新的想學習的技術。這不,又有小夥伴問我:冰河,你在【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 //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 //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 //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地址://github.com/arut/nginx-rtmp-module
使用命令:
git clone //github.com/arut/nginx-rtmp-module.git
6.安裝Nginx
wget //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
官方下載鏈接為://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 liuyazhuang133 ## 標識本節點的字條串,通常為 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 liuyazhuang134
}
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 負載均衡的配置文件。
//download.csdn.net/detail/l1028386804/9855362
重磅福利
關注「 冰河技術 」微信公眾號,後台回復 「設計模式」 關鍵字領取《深入淺出Java 23種設計模式》PDF文檔。回復「Java8」關鍵字領取《Java8新特性教程》PDF文檔。兩本PDF均是由冰河原創並整理的超硬核教程,面試必備!!
好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!
寫在最後
如果你覺得冰河寫的還不錯,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習高並發、分佈式、微服務、大數據、互聯網和雲原生技術,「 冰河技術 」微信公眾號更新了大量技術專題,每一篇技術文章乾貨滿滿!不少讀者已經通過閱讀「 冰河技術 」微信公眾號文章,吊打面試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成為公司的技術骨幹!如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公眾號吧,每天更新超硬核技術乾貨,讓你對如何提升技術能力不再迷茫!